FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
ShipSimObject.h
1#ifndef _CSHIP_SIM_OBJECT_H_
2#define _CSHIP_SIM_OBJECT_H_
3
179#include <fhsim/simobject/ISimObjectCreator.h>
180#include <fhsim/FhSimMgr.h>
181#include <fhsim/PrintDuringExec.h>
182#include <string>
183#include <queue>
184#include <string>
185#include <iostream>
186#include <locale>
187
188#ifdef FH_VISUALIZATION
189#pragma warning(push)
190#pragma warning( disable : 4251 )
191 #include <Ogre.h>
192#pragma warning(pop)
193 //#include <fhsim/visual/renderer/FhVisualization.h>
194 #include "sfh/ogre/C3DArrow.h"
195 #include "sfh/ogre/DotSceneLoader.h"
196#endif
197
198#include <fhsim_environment/EnvironmentProvider.h>
199
200#include <sfh/math/interpolation/SplineInterp.h>
201
202// TODO: this will not work if someone inherits the simobject externally
203#include "Ship/Resistance/ShipResistance.h"
204#include "Ship/ViscousShip.h"
205#include "Ship/HullData/HullData.h"
206#include "Ship/HullData/VeresHullData.h"
207#include "Ship/HullData/NapaCGALHullData.h"
208#include "Ship/PotentialData/PotentialData.h"
209#include "Ship/PotentialData/VeresData.h"
210
215namespace Ship{
216 class ShipSimObject:public SimObject, public ViscousShip/*, public ICurrentField*/
217 {
218 public:
219 EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
220
221 #ifdef FH_VISUALIZATION
222 enum RenderType
223 {
224 BOX,
225 STATIONS,
226 SLICED,
227 INTERPOLATED
228 };
229 #endif
230
232 ShipSimObject( const std::string simObjectName, ISimObjectCreator* const creator);
233
236
238 void FinalSetup( const double T, const double *const X, ISimObjectCreator* const creator );
239
241 void GetCurrent(const double T, const double* const X, const double position[3], double* currentVelocity);
242
244 virtual void PreOdeFcn(const double T, const double *const X);
245
247 virtual void OdeFcn(const double T, const double* const X, double* const XDot) const;
248
250 void AcceptedStep(double T, const double* X) override;
251
252 #ifdef FH_VISUALIZATION
253
255 virtual void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator);
256
258 virtual void RenderUpdate( const double T, const double* const X );
259 #endif
260
261
262 public:
263
265 const double* PositionNED(const double T, const double* const X);
266
268 const double* PositionZeroCrossNED(const double T, const double* const X);
269
271 const double* PositionAPNED(const double T, const double* const X);
272
274 const double* VelocityNED(const double T, const double* const X);
275
277 const double* QuaternionNED(const double T, const double* const X);
278
279 const double* EulerAnglesNED(const double T, const double* const X);
280
282 const double* RotationBody(const double T, const double* const X);
283
285 const double* OmegaNED(const double T, const double* const X);
286
287
288 void ComputeRollPitchYaw(const double T, const double* const X) const;
289 void ComputeRelativeVelocity(const double T, const double* const X) const;
290
292 const double* BodyForce(const double T, const double* const X);
293
295 const double* VelocityBody(const double T, const double* const X);
296
301 const double* FirstOrderWaveBody(const double T, const double* const X);
302
306 const double* WaveDriftBody(const double T, const double* const X);
307
309 const double* const FluidMemForceBody(const double T, const double* const X);
310
312 const double* RestoringForceBody(const double T, const double* const X);
313
315 const double* RelativeVelocityBody(const double T, const double* const X);
316
318 const double* ViscousForceBody(const double T, const double* const X);
319
321 const double* Encounter(const double T, const double* const X);
322
324 const double* CoriolisRigidBody(const double T, const double* const X);
325
327 const double* CoriolisFluidBody(const double T, const double* const X);
328
330 const double* SpeedInfo( const double T, const double *const X);
331
333 const double* RotationForceFrame( const double T, const double *const X);
334
336 const double * KineticEnergy(const double T, const double* const X);
337
339 const double * FluidEnergy(const double T, const double* const X);
340 const double * FluidEnergy2(const double T, const double* const X);
341 const double * UFluidMemSpeed(const double T, const double* const X);
342
343 const double* FluidForceBySpeedBody(const double T, const double* const X, int index);
345 const double* FluidMemoryForceBody( const double T, const double *const X);
346
353 const double * CrossFlowBody(const double T, const double* const X);
354
379 const double * ResistanceBody(const double T, const double* const X);
380
388 const double * AdditionalDampeningBody(const double T, const double* const X);
389
391 const double* ExternalForceNED(const double T, const double* const X);
392
394 const double* ExternalForceBody(const double T, const double* const X);
395 // TODO: Documentation. Output viscous roll damping as calculated in components,
396 // 1) friciton damping
397 // 2) eddie damping
398 // 3) lift damping
399 // 4) bilge keel damping
400 // 5) skeg damping
401 // 6) skeg lift damping
402 const double * ViscousRoll(const double T, const double* const X);
403 double m_ViscousRoll[6];
404
406 const double* SteadyStateControlBODY( const double T, const double *const X);
408 const double* SteadyStateControlNED( const double T, const double *const X);
409
410 const double * DriftSpeed(const double T, const double* const X);
411
412
413 double m_waveElevation;
414 double m_waveSlope;
415 /*const double * WaveElevation(const double T, const double* const X);
416 const double * WaveSlope(const double T, const double* const X);*/
417
418 private:
419 void printShipInfo();
420
421 PrintDuringExec* m_logg;
422
423 Eigen::Vector3d m_forceExtNED;
424 Eigen::Vector3d m_forceExtBody;
425
426 Eigen::Vector3d m_PositionMidpoint;
427 Eigen::Vector3d m_PositionAP;
428 Eigen::Vector3d m_angles;
429
430 Eigen::Matrix<double,6,6> m_mrb;
431 Eigen::Matrix<double,6,6> m_invMrb;
432
433 HullData *m_Hull;
434 HullData *m_Hull2;
435 ShipResistance *m_resitance;
436 environment::EnvironmentProvider *m_environment = nullptr;
437
438
439 Eigen::Matrix<double,1,20> Horener_X;// { 0.00035500000000000001, 0.15313099999999999, 0.34123700000000001, 0.44641399999999998, 0.46219700000000002, 0.47891400000000001, 0.48653999999999997, 0.53628799999999999, 0.63426800000000005, 0.822828, 0.99002500000000004, 1.2892699999999999, 1.6440900000000001, 1.84578, 2.3112900000000001, 2.5824500000000001, 2.9922499999999999, 3.4575800000000001, 3.7147000000000001, 4.0064099999999998 };
440 Eigen::Matrix<double,1,20> Horener_Y;// { 1.9617800000000001, 1.9448000000000001, 1.8584499999999999, 1.73767, 1.5313699999999999, 1.2240599999999999, 1.14958, 1.02132, 0.92861700000000003, 0.79312000000000005, 0.71726999999999996, 0.61583900000000003, 0.50550499999999998, 0.45036799999999999, 0.37409900000000001, 0.30851600000000001, 0.254801, 0.19764300000000001, 0.14998300000000001, 0.11211599999999999 };
441 std::vector<double> hx, hy;
442 sfh::math::SplineInterp *hoerner;
443
444
446 ISignalPort *m_InForceNED;
447
449 ISignalPort *m_InMomentNED;
450
452 ISignalPort *m_InForceBODY;
453
455 ISignalPort *m_InMomentBODY;
456
457 ICommonComputation *m_computeRelativeVelocity;
458 ICommonComputation *m_computeRotationAngles;
459
460 PotentialData *m_TheoryData;
461
462 std::vector<double> m_waveHeight;
463 std::vector<double> m_waveFreq;
464 std::vector<double> m_wavePhase;
465 std::vector<double> m_waveDirection;
466 std::vector<double> m_waveNumber;
467
468 std::vector<double> m_uHistory;
469 std::vector<double> m_psiHistory;
470 std::vector<double> m_tHistory;
471
472 double **m_fluidForce;
473 double m_fluidForceExperienced[6];
474 double m_rotationForceFrame[4];
475 double m_speedInformation[5];
476 double m_kinetic;
477 double m_fluid;
478 double m_fluid2[36];
479
480 double m_steadyStateBody[6];
481 double m_steadyStateNED[6];
482
483 double m_damping[6];
484
485 mutable double m_rollPitchYaw[3];
486 double m_speed[6];
487 mutable double m_relativeSpeed[6];
488
489 double m_firstOrderForce[6];
490 double m_waveDriftForce[6];
491 double m_CforcesBody[6];
492 double m_CforcesFluid[6];
493
494 double m_crossFlowBody[6];
495 double m_resistance[6];
496
497 double m_fluidMemForce[6];
498 double m_restoringForce[6];
499 mutable double m_sumBodyForce[6];
500 double m_encounterFreq[52];
501 double m_viscous[6];
502
503 double m_hydrostaticSpring[3];
504
505 double m_driftSpeed;
506
508 bool m_zeroSpeedRadiation;
510 bool m_hydroStaticsType;
512 bool m_useCrossFlow;
514 bool m_waveforceHframe;
516 int m_waveForceType;
518 int m_DOFFree[6];
520 double m_alfaN;
522 double m_alfaE;
524 double m_alfaD;
526 double m_surgeVelocity;
528 double m_wakeFraction;
530 double m_hydroStaticsStationVerticalStep;
532 double m_hydroStaticsStationHorizontalStep;
534 double m_hydroStaticsStationTop;
536 double m_hydroStaticsStationBottom;
538 double m_bilgeKeelStartPosition;
540 double m_bilgeKeelEndPosition;
542 double m_bilgeKeelHeight;
544 double m_damperLinear[3];
546 double m_damperQuadratic[3];
548 double m_damperRotLinear[3];
550 double m_damperRotQuadratic[3];
552 double m_dampingBlendSpeed;
554 double m_dampingBlendFraction;
555
557 double m_waveForceTransient;
558
574 double m_ForceScale[11];
576 std::string m_ForceInput;
578 std::string m_PotentialFileLocation;
580 std::string m_PotentialFileName;
582 std::string m_PotentialType;
584 double m_stablizeDOF[6];
585
586 bool m_coriolisRollOnly;
587 Eigen::Matrix<double, 6,1> m_coriolisDOFmangler;
588
589 static inline Eigen::Matrix3d S(const Eigen::Vector3d &v){
590 Eigen::Matrix3d retval = Eigen::Matrix3d::Zero();
591 retval(0,1)=-v(2);
592 retval(0,2)=v(1);
593 retval(1,0)=v(2);
594 retval(1,2)=-v(0);
595 retval(2,0)=-v(1);
596 retval(2,1)=v(0);
597 return retval;
598 }
599
600#ifdef FH_VISUALIZATION
603 bool m_ShowForceArrows = false;
605 std::string m_Material;
607 std::string m_Mesh;
609 std::string m_Scene;
611 RenderType m_RenderAs;
613 std::string m_RenderType;
614
615 #endif
616
617 int ***m_IFluidState;
618 int ***m_FluidStateSize;
619
620 unsigned int m_ISR;
621 unsigned int m_ISV;
622 unsigned int m_ISQ;
623 unsigned int m_ISW;
624
625
626 #ifdef FH_VISUALIZATION
627
628 public:
629 void DrawShip(Ogre::SceneNode* renderNode, Ogre::SceneManager* sceneMgr);
630 void DrawStations( Ogre::SceneNode* m_RenderNode, Ogre::SceneManager * sceneMgr );
631 private:
632 Ogre::ManualObject *manual ;
633 Ogre::SceneNode* m_RenderNodeHull;
634 Ogre::SceneNode* m_RenderNodeZeroCross;
635 Ogre::SceneNode* m_RenderNodeStations;
636 Ogre::SceneNode** m_RenderNodeSkegPoint;
637 double m_HideUntill;
638 double m_NodeOffset[3];
639 C3DArrow *FKF_u,*FKF_v,*FKF_w;
640 C3DArrow *FKT_u,*FKT_v,*FKT_w;
641
642 C3DArrow *FMF_u,*FMF_v,*FMF_w;
643 C3DArrow *FMT_u,*FMT_v,*FMT_w;
644
645 C3DArrow *RSF_u,*RSF_v,*RSF_w;
646 C3DArrow *RST_u,*RST_v,*RST_w;
647
648 C3DArrow *FKArrow;
649 C3DArrow *FMArrow;
650 C3DArrow *RArrow;
651 C3DArrow *Res;
652
653 C3DArrow *FKArrow_M;
654 C3DArrow *FMArrow_M;
655 C3DArrow *RArrow_M;
656 C3DArrow *Res_M;
657
658 C3DArrow *VArrow;
659 #endif
660
661 double m_maxWavePeriod;
662 };
663}
664
665#endif
Definition HullData.h:15
Definition PotentialData.h:29
Definition ShipResistance.h:9
Definition ShipSimObject.h:217
const double * KineticEnergy(const double T, const double *const X)
const double * SteadyStateControlNED(const double T, const double *const X)
const double * CoriolisRigidBody(const double T, const double *const X)
const double * FluidEnergy(const double T, const double *const X)
const double * ExternalForceBody(const double T, const double *const X)
const double * CrossFlowBody(const double T, const double *const X)
const double * AdditionalDampeningBody(const double T, const double *const X)
const double * ViscousForceBody(const double T, const double *const X)
const double * PositionAPNED(const double T, const double *const X)
const double * SpeedInfo(const double T, const double *const X)
const double * Encounter(const double T, const double *const X)
const double * ExternalForceNED(const double T, const double *const X)
const double * SteadyStateControlBODY(const double T, const double *const X)
const double * RelativeVelocityBody(const double T, const double *const X)
const double * RotationForceFrame(const double T, const double *const X)
const double * RotationBody(const double T, const double *const X)
const double * FluidMemoryForceBody(const double T, const double *const X)
const double * QuaternionNED(const double T, const double *const X)
const double * PositionZeroCrossNED(const double T, const double *const X)
const double * ResistanceBody(const double T, const double *const X)
The calm water resistance of the hull in the surge direction The resistance force is the defined as t...
const double * WaveDriftBody(const double T, const double *const X)
The mean value of the higher order wave forces as experienced in the body frame of the vessel....
const double *const FluidMemForceBody(const double T, const double *const X)
const double * BodyForce(const double T, const double *const X)
const double * FirstOrderWaveBody(const double T, const double *const X)
The first order wave force, or froude-krylov force, as experienced in the body frame of the vessel Th...
const double * OmegaNED(const double T, const double *const X)
const double * CoriolisFluidBody(const double T, const double *const X)
const double * PositionNED(const double T, const double *const X)
const double * VelocityBody(const double T, const double *const X)
const double * RestoringForceBody(const double T, const double *const X)
const double * VelocityNED(const double T, const double *const X)
Definition ViscousShip.h:13
Simple waypoint object.
Definition CableAttach.h:16