FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
TrawlDoorBase.h
1#pragma once
2
3#include "sfh/sim/kinematics.h"
4
5#include <fhsim/simobject/SimObject.h>
6#include <fhsim_environment/EnvironmentProvider.h>
7#include <math.h>
8#include <string>
9
10
11#ifdef FH_VISUALIZATION
12# include "OgreParticleSystem.h"
13# ifdef USE_BILLBOARD_LABELS
14# include "sfh/ogre/CMovableText.h"
15# endif
16#endif
17
163// #define TD_AR 1.45
164// #define TD_C_X 0.11
165// #define TD_C_Z 0.22
166// #define TD_OUT_OF_BOUND_COEFF {0.2, 1.2, 0.4, 1.0, 1.0, 1.0}
167
168class TrawlDoorBase : public SimObject
169{
170public:
172 TrawlDoorBase(std::string simObjectName, ISimObjectCreator* creator);
173
175 virtual void OdeFcn(const double dT, const double* const adX, double* const adXDot) const override;
176
190 bool HasJacobians() const override;
191 void OdeJacobian(double T, const double* X, double* J, int nStates) override;
192 int GetJacobianSparsity(int nStates, int* rowPtr, int* colIdx) override;
194
195
196#ifdef FH_VISUALIZATION
198 virtual void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator);
199
201 virtual void RenderUpdate(const double dT, const double* const adX);
202#endif
203
204protected:
205 virtual void TD_HydroForces(const double relVel[], double* alpha, double* beta, double* pU, double forceSS[]);
206 // virtual void TD_AngularDamping(double rho, double TD_ARea, const double relVel[], double angDamp[]);
207 virtual void TD_HydroForces_SS(double TD_Area, double rho, const double relVel[], double alpha, double beta, double U, double* coeffSS, double* forceSS);
208 virtual void TD_HydroCoeff_SS(double alpha, double beta, double coeffSS[]);
209 virtual void TD_vel2HydroAng(const double relVel[], double* alpha, double* beta, double* pU);
210 void AddQuaternionKinematicsJacobian(const double* quater, const double* omega, double* J, int nStates, int quaterIndex, int omegaIndex) const;
211 void OutOfBoundRotationalDamping(double T, const double* X, double damping[3]);
212 virtual void AddExternalForces(double dT, const double* const adX);
213 virtual void AddInternalForces();
214 virtual void AddHydroForces();
217 virtual void AddInflowDependentForces(double dT, const double* const adX) { }
218 virtual void AddDampingForces();
219 virtual void AddBottomForces() { };
220 virtual void CalcDerivatives(double dT, double* const adXDot, const double* const adX);
221 virtual void CalcFoundation(const double dT, const double* const adX, double* const adXDot);
222 virtual void AddExternalForce(const double adPos_d[3], const double adForceExternal_n[3]);
223 virtual void CalcOutput(const double dT, const double* const adX);
224 void CalcOutputCommon(const double dT, const double* const adX) const;
225 void FinalSetup(const double dT, const double* const adX, ISimObjectCreator* const creator);
226 // Geometry and properties
227 bool m_isPort;
228 double m_cOG[3];
229 double m_area;
230 double m_height;
231 double m_length;
232 double m_aR;
233 double m_curvature;
234 double m_mass;
235 double m_massInverse[6][6];
236 double m_rigidInertia[6];
237 double m_addedMass[6];
238 double m_mdCornerPos_body[4][3];
239 double m_rhoDoor;
240
241 // Hydrodynamic forces
242 double m_outOfBoundCoeff[6];
243 double m_hydrodynamicCorrections[6];
244
245 // Fastening points
246 double m_warpPos_d[3];
247 double m_lBPos_d[3];
248 double m_uBPos_d[3];
249
250 // External
251 double m_rhoWater;
252 double m_force_warp[3];
253 double m_force_LB[3];
254 double m_force_UB[3];
255 double m_waterVel_n[3];
256 ICommonComputation* m_commonCalc;
257
258 environment::EnvironmentProvider* m_environment;
259 double m_time = 0.0;
260
261 // Input ports
262 ISignalPort* m_inWarp_F;
263 ISignalPort* m_inLB_F;
264 ISignalPort* m_inUB_F;
265
266 // Output ports
267 const double* OutPos1(const double dT, const double* const adX);
268 const double* OutPos3(const double dT, const double* const adX);
269 const double* OutPos2(const double dT, const double* const adX);
270 const double* OutVel1(const double dT, const double* const adX);
271 const double* OutVel3(const double dT, const double* const adX);
272 const double* OutVel2(const double dT, const double* const adX);
273
274 double m_outPos1[3];
275 double m_outPos3[3];
276 double m_outPos2[3];
277 double m_outVel1[3];
278 double m_outVel3[3];
279 double m_outVel2[3];
280
281 unsigned long m_IStatePos;
282 unsigned long m_IStateQuater;
283 unsigned long m_IStateLocalVel;
284 unsigned long m_IStateOmega;
285 unsigned long m_IStateHydroForce;
286
287 // For computational efficiency
288 double ma_adSumForces[6];
289 double ma_dAlpha;
290 double ma_dBeta;
291 double ma_dU;
292
297
298 const double* ma_adXPos_n;
299 const double* ma_adXQuater;
300 const double* ma_adXVel_d;
301 const double* ma_adXOmega;
302
303 double ma_mdR[3][3];
304 double ma_adXVel_n[3];
305 double ma_adHydroForceSS[6];
306 double ma_adRelVel_d[6];
307 double ma_adWaterVel_d[3];
308
309#ifdef FH_VISUALIZATION
310 void BottomContactRenderInit();
311 void RenderBottomContact(double depth, double m_cornerPos_ned[4][3], double m_submergence[4]);
312 Ogre::ParticleSystem* m_particleSystem;
313 Ogre::SceneNode* m_particleNode;
314 Ogre::ParticleEmitter* m_particleEmitter;
315 Ogre::Vector3 m_visualizationScale;
316
317 std::string m_meshName;
318 double m_visScale;
319 double m_lengthScale;
320 double m_heightScale;
321 double m_curvatureScale;
322 Ogre::Entity* m_renderEntity;
323 Ogre::SceneNode* m_renderNode;
324 Ogre::Quaternion m_InitOrientation;
325 Ogre::SceneManager* m_sceneMgr;
326
327# ifdef USE_BILLBOARD_LABELS
328 Ogre::SceneNode* m_BBRenderNode;
329 Ogre::CMovableText* m_BBTxt;
330 double m_bBTxtSize;
331# endif
332#endif
333};
Definition TrawlDoorBase.h:169
double m_area
The trawldoor area.
Definition TrawlDoorBase.h:229
virtual void OdeFcn(const double dT, const double *const adX, double *const adXDot) const override
Calculates the state derivatives.
double m_force_warp[3]
A pointer to the Warp force.
Definition TrawlDoorBase.h:252
double m_time
Time of the state CalcFoundation last took [s].
Definition TrawlDoorBase.h:259
double m_addedMass[6]
The diagonal added mass (R70).
Definition TrawlDoorBase.h:237
virtual void AddInflowDependentForces(double dT, const double *const adX)
Definition TrawlDoorBase.h:217
double m_rhoDoor
The density of the trawl door material.
Definition TrawlDoorBase.h:239
TrawlDoorBase(std::string simObjectName, ISimObjectCreator *creator)
The constructor sets the pointer to the output object and the parser object.
double m_rigidInertia[6]
The diagonal rigid-body inertia (R70).
Definition TrawlDoorBase.h:236
double m_waterVel_n[3]
The water velocity in the door position.
Definition TrawlDoorBase.h:255
double m_cOG[3]
The trawl door center of gravity.
Definition TrawlDoorBase.h:228
double m_rhoWater
The density of the surrounding fluid.
Definition TrawlDoorBase.h:251
double m_force_LB[3]
A pointer to the force.
Definition TrawlDoorBase.h:253
double m_force_UB[3]
A pointer to the input force.
Definition TrawlDoorBase.h:254
ISignalPort * m_inLB_F
The cable length input port.
Definition TrawlDoorBase.h:263
double m_mass
The mass of the object.
Definition TrawlDoorBase.h:234
ISignalPort * m_inUB_F
The cable length input port.
Definition TrawlDoorBase.h:264
bool m_isPort
Is this a port trawl door?
Definition TrawlDoorBase.h:227
ISignalPort * m_inWarp_F
The cable length input port.
Definition TrawlDoorBase.h:262
ICommonComputation * m_commonCalc
Calculations necessary for more than one output port.
Definition TrawlDoorBase.h:256
double m_outAlpha
Definition TrawlDoorBase.h:296