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/BodyFlowInteraction.h>
7#include <fhsim_environment/EnvironmentProvider.h>
8#include <fhsim_environment/WakeSourceSet.h>
9#include <fhsim_environment/hydrodynamics/PlateGeometry.h>
10#include <math.h>
11#include <string>
12
13
14#ifdef FH_VISUALIZATION
15# include "OgreParticleSystem.h"
16# ifdef USE_BILLBOARD_LABELS
17# include "sfh/ogre/CMovableText.h"
18# endif
19#endif
20
186// #define TD_AR 1.45
187// #define TD_C_X 0.11
188// #define TD_C_Z 0.22
189// #define TD_OUT_OF_BOUND_COEFF {0.2, 1.2, 0.4, 1.0, 1.0, 1.0}
190
191class TrawlDoorBase : public SimObject
192{
193public:
195 TrawlDoorBase(std::string simObjectName, ISimObjectCreator* creator);
196
198 virtual void OdeFcn(const double dT, const double* const adX, double* const adXDot) const override;
199
213 bool HasJacobians() const override;
214 void OdeJacobian(double T, const double* X, double* J, int nStates) override;
215 int GetJacobianSparsity(int nStates, int* rowPtr, int* colIdx) override;
217
219 void PreOdeFcn(double T, const double* X, IStateUpdater* updater) override;
220
221
222#ifdef FH_VISUALIZATION
224 virtual void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator);
225
227 virtual void RenderUpdate(const double dT, const double* const adX);
228#endif
229
230protected:
231 virtual void TD_HydroForces(const double relVel[], double* alpha, double* beta, double* pU, double forceSS[]) const;
232 // virtual void TD_AngularDamping(double rho, double TD_ARea, const double relVel[], double angDamp[]);
233 virtual void TD_HydroForces_SS(double TD_Area, double rho, const double relVel[], double alpha, double beta, double U, double* coeffSS, double* forceSS) const;
234 virtual void TD_HydroCoeff_SS(double alpha, double beta, double coeffSS[]) const;
235 virtual void TD_vel2HydroAng(const double relVel[], double* alpha, double* beta, double* pU) const;
237 void HydroForceAt(const double* X, const double relVel_n[3], double force_n[3]) const;
238 void AddQuaternionKinematicsJacobian(const double* quater, const double* omega, double* J, int nStates, int quaterIndex, int omegaIndex) const;
239 void OutOfBoundRotationalDamping(double T, const double* X, double damping[3]);
240 virtual void AddExternalForces(double dT, const double* const adX);
241 virtual void AddInternalForces();
242 virtual void AddHydroForces();
245 virtual void AddInflowDependentForces(double dT, const double* const adX) { }
246 virtual void AddDampingForces();
247 virtual void AddBottomForces() { };
248 virtual void CalcDerivatives(double dT, double* const adXDot, const double* const adX);
249 virtual void CalcFoundation(const double dT, const double* const adX, double* const adXDot);
250 virtual void AddExternalForce(const double adPos_d[3], const double adForceExternal_n[3]);
251 virtual void CalcOutput(const double dT, const double* const adX);
252 void CalcOutputCommon(const double dT, const double* const adX) const;
253 void FinalSetup(const double dT, const double* const adX, ISimObjectCreator* const creator);
254 // Geometry and properties
255 bool m_isPort;
256 double m_cOG[3];
257 double m_area;
258 double m_height;
259 double m_length;
260 double m_aR;
261 double m_curvature;
262 double m_mass;
263 double m_massInverse[6][6];
264 double m_rigidInertia[6];
265 double m_addedMass[6];
266 double m_mdCornerPos_body[4][3];
267 double m_rhoDoor;
268
269 // Hydrodynamic forces
270 double m_outOfBoundCoeff[6];
271 double m_hydrodynamicCorrections[6];
272
273 // Fastening points
274 double m_warpPos_d[3];
275 double m_lBPos_d[3];
276 double m_uBPos_d[3];
277
278 // External
279 double m_rhoWater;
280 double m_force_warp[3];
281 double m_force_LB[3];
282 double m_force_UB[3];
283 double m_waterVel_n[3];
284 ICommonComputation* m_commonCalc;
285
289 class DoorCaster final : public environment::wake::WakeCastingObject
290 {
291 public:
292 explicit DoorCaster(const TrawlDoorBase& door)
293 : m_door(door)
294 {
295 }
296
298 environment::wake::WakeCastState Reference(const double* X) const override;
300 void CurrentLoad(const double* X, const double freeStream[3], const double flowDir[3], double force[3], double& frontalArea,
301 double rearCentre[3]) const override;
303 double Radius() const override;
305 environment::wake::SourceLoad BodyLoad(const double* X, const double bodyVel[3], const double waterVel[3]) const override;
306
307 private:
309 void PlateAxes(const double* X, double normal[3], double chordAxis[3]) const;
311 environment::plate_geometry::Plate Plate() const;
312
313 const TrawlDoorBase& m_door;
314 };
315
316 environment::EnvironmentProvider* m_environment = nullptr;
318 environment::wake::BodyFlowInteraction m_flow;
319 double m_time = 0.0;
320
321 // Input ports
322 ISignalPort* m_inWarp_F;
323 ISignalPort* m_inLB_F;
324 ISignalPort* m_inUB_F;
325
326 // Output ports
327 const double* OutPos1(const double dT, const double* const adX);
328 const double* OutPos3(const double dT, const double* const adX);
329 const double* OutPos2(const double dT, const double* const adX);
330 const double* OutVel1(const double dT, const double* const adX);
331 const double* OutVel3(const double dT, const double* const adX);
332 const double* OutVel2(const double dT, const double* const adX);
333
334 double m_outPos1[3];
335 double m_outPos3[3];
336 double m_outPos2[3];
337 double m_outVel1[3];
338 double m_outVel3[3];
339 double m_outVel2[3];
340
341 unsigned long m_IStatePos;
342 unsigned long m_IStateQuater;
343 unsigned long m_IStateLocalVel;
344 unsigned long m_IStateOmega;
345 unsigned long m_IStateHydroForce;
346
347 // For computational efficiency
348 double ma_adSumForces[6];
349 double ma_dAlpha;
350 double ma_dBeta;
351 double ma_dU;
352
357
358 const double* ma_adXPos_n;
359 const double* ma_adXQuater;
360 const double* ma_adXVel_d;
361 const double* ma_adXOmega;
362
363 double ma_mdR[3][3];
364 double ma_adXVel_n[3];
365 double ma_adHydroForceSS[6];
366 double ma_adRelVel_d[6];
367 double ma_adWaterVel_d[3];
368
369#ifdef FH_VISUALIZATION
370 void BottomContactRenderInit();
371 void RenderBottomContact(double depth, double m_cornerPos_ned[4][3], double m_submergence[4]);
372 Ogre::ParticleSystem* m_particleSystem;
373 Ogre::SceneNode* m_particleNode;
374 Ogre::ParticleEmitter* m_particleEmitter;
375 Ogre::Vector3 m_visualizationScale;
376
377 std::string m_meshName;
378 double m_visScale;
379 double m_lengthScale;
380 double m_heightScale;
381 double m_curvatureScale;
382 Ogre::Entity* m_renderEntity;
383 Ogre::SceneNode* m_renderNode;
384 Ogre::Quaternion m_InitOrientation;
385 Ogre::SceneManager* m_sceneMgr;
386
387# ifdef USE_BILLBOARD_LABELS
388 Ogre::SceneNode* m_BBRenderNode;
389 Ogre::CMovableText* m_BBTxt;
390 double m_bBTxtSize;
391# endif
392#endif
393};
Definition TrawlDoorBase.h:290
double Radius() const override
√(Area/π), the radius of the plate area (O9a).
environment::wake::WakeCastState Reference(const double *X) const override
The door's centre and its velocity in NED.
environment::wake::SourceLoad BodyLoad(const double *X, const double bodyVel[3], const double waterVel[3]) const override
TD_HydroForces_SS at the inflow, M = F·ê/(½ρ|U|²), the plate's frontal area along ê (as CurrentLoad),...
void CurrentLoad(const double *X, const double freeStream[3], const double flowDir[3], double force[3], double &frontalArea, double rearCentre[3]) const override
TD_HydroForces_SS at the free stream; the plate chord × span of the door frame.
Definition TrawlDoorBase.h:192
double m_area
The trawldoor area.
Definition TrawlDoorBase.h:257
virtual void OdeFcn(const double dT, const double *const adX, double *const adXDot) const override
Calculates the state derivatives.
void HydroForceAt(const double *X, const double relVel_n[3], double force_n[3]) const
TD_HydroForces at the velocity relVel_n relative to the water (NED) and the attitude and rates of the...
double m_force_warp[3]
A pointer to the Warp force.
Definition TrawlDoorBase.h:280
double m_time
Time of the state CalcFoundation last took [s].
Definition TrawlDoorBase.h:319
environment::wake::BodyFlowInteraction m_flow
The wake the door casts and receives.
Definition TrawlDoorBase.h:318
double m_addedMass[6]
The diagonal added mass (R70).
Definition TrawlDoorBase.h:265
environment::EnvironmentProvider * m_environment
m_flow's Environment, from FinalSetup.
Definition TrawlDoorBase.h:316
virtual void AddInflowDependentForces(double dT, const double *const adX)
Definition TrawlDoorBase.h:245
double m_rhoDoor
The density of the trawl door material.
Definition TrawlDoorBase.h:267
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:264
double m_waterVel_n[3]
The water velocity in the door position.
Definition TrawlDoorBase.h:283
double m_cOG[3]
The trawl door center of gravity.
Definition TrawlDoorBase.h:256
double m_rhoWater
The density of the surrounding fluid.
Definition TrawlDoorBase.h:279
double m_force_LB[3]
A pointer to the force.
Definition TrawlDoorBase.h:281
double m_force_UB[3]
A pointer to the input force.
Definition TrawlDoorBase.h:282
ISignalPort * m_inLB_F
The cable length input port.
Definition TrawlDoorBase.h:323
DoorCaster m_caster
The door for its wake; declared before m_flow, which keeps a pointer to it.
Definition TrawlDoorBase.h:317
double m_mass
The mass of the object.
Definition TrawlDoorBase.h:262
void PreOdeFcn(double T, const double *X, IStateUpdater *updater) override
Rebuilds the door's wake when due (CastWake) and takes the other objects' wakes at the door.
ISignalPort * m_inUB_F
The cable length input port.
Definition TrawlDoorBase.h:324
bool m_isPort
Is this a port trawl door?
Definition TrawlDoorBase.h:255
ISignalPort * m_inWarp_F
The cable length input port.
Definition TrawlDoorBase.h:322
ICommonComputation * m_commonCalc
Calculations necessary for more than one output port.
Definition TrawlDoorBase.h:284
double m_outAlpha
Definition TrawlDoorBase.h:356