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
271#include <fhsim/simobject/ISimObjectCreator.h>
272#include <fhsim/FhSimMgr.h>
273#include <fhsim/PrintDuringExec.h>
274#include <array>
275#include <cmath>
276#include <limits>
277#include <memory>
278#include <vector>
279#include <string>
280#include <queue>
281#include <string>
282#include <iostream>
283#include <locale>
284
285#ifdef FH_VISUALIZATION
286#pragma warning(push)
287#pragma warning( disable : 4251 )
288 #include <Ogre.h>
289#pragma warning(pop)
290 //#include <fhsim/visual/renderer/FhVisualization.h>
291 #include "sfh/ogre/C3DArrow.h"
292 #include "sfh/ogre/DotSceneLoader.h"
293#endif
294
295#include <fhsim_environment/EnvironmentProvider.h>
296
297#include <sfh/math/interpolation/SplineInterp.h>
298
299// TODO: this will not work if someone inherits the simobject externally
300#include "Ship/Resistance/ShipResistance.h"
301#include "Ship/ViscousShip.h"
302#include "Ship/HullData/HullData.h"
303#include "Ship/HullData/VeresHullData.h"
304#include "Ship/HullData/NapaCGALHullData.h"
305#include "Ship/PotentialData/PotentialData.h"
306#include "Ship/PotentialData/VeresData.h"
307
312namespace Ship{
316 {
317 std::string forceInput = "NED";
318 int numWaveComponents = 52;
319 bool zeroSpeedRadiation = true;
320 double stabilizeDOF[6] = {0,0,0,0,0,0};
321 double alfaN = 0;
322 double alfaE = 0;
323 double alfaD = 0;
324 double surgeVelocity = 0;
325
326 std::string potentialFileLocation;
327 std::string potentialFileName;
328 std::string potentialType = "VERES";
329 int flipPhaseForOSC = 0;
330
331 int DOFFree[6] = {1,1,1,1,1,1};
332 double forceScale[11] = {1,1,1,1,1,1,1,1,1,1,1};
333 bool coriolisRollOnly = false;
334 double waveForceTransient = 0.1;
335 bool hydroStaticsType = false;
336 int waveForceType = 0;
337 bool waveForceHFrame = false;
338 double hydroStaticsStationVerticalStep = 1;
339 double hydroStaticsStationHorizontalStep = 1;
340 double hydroStaticsStationTop = 15;
341 double hydroStaticsStationBottom = -1;
342
343 bool useCrossFlow = true;
344 double damperLinear[3] = {0,0,0};
345 double damperQuadratic[3] = {0,0,0};
346 double damperRotLinear[3] = {0,0,0};
347 double damperRotQuadratic[3] = {0,0,0};
348 double wakeFraction = 0;
349
350 double Yv_man = 0, Yr_man = 0, Nv_man = 0, Nr_man = 0;
351 double Yvd_man = 0, Yrd_man = 0, Nvd_man = 0, Nrd_man = 0;
352 double Xud_man = 0, Xvr_man = 0, Xrr_man = 0, Xvv_man = 0, Xvvvv_man = 0;
353 double Xu_dp = 0, Xv_dp = 0, Xr_dp = 0;
354 double Yu_dp = 0, Yv_dp = 0, Yr_dp = 0;
355 double Nu_dp = 0, Nv_dp = 0, Nr_dp = 0;
356 double dampingBlendSpeed = 8;
357 double dampingBlendFraction = 0.9;
358 double manoeuvreMinSpeed = 0.1;
359
360 double bilgeKeelStartPosition = std::numeric_limits<double>::quiet_NaN();
361 double bilgeKeelEndPosition = std::numeric_limits<double>::quiet_NaN();
362 double bilgeKeelHeight = 0;
363 int withSkeg = 0;
364 bool skegLift = false;
365 int skegStartSection = 5;
366 int skegEndSection = 15;
367 std::vector<int> skegStartPoints = {42, 27, 24, 24, 24, 24, 24, 26, 27, 29, 35};
368 std::vector<int> skegEndPoints = std::vector<int>(11, 49);
369 bool hullLift = true;
371 double rollAmplitudeHorizon = 2.75*sqrt(10.0);
372
374 std::string resistanceFriction;
375 std::string resistanceFrictionCurveX;
376 std::string resistanceFrictionCurveY;
378 std::string resistanceResidual;
379 double hollenbachNumRudders = 0;
380 double hollenbachNumBrackets = 0;
381 double hollenbachNumBoss = 0;
382 double hollenbachNumThrusters = 0;
383 double hollenbachDiamPropeller = 0;
384 double scaleResidualResistance = 1.0;
385 std::string resistanceResidualCurveX;
386 std::string resistanceResidualCurveY;
387 };
388
389 class ShipSimObject:public SimObject/*, public ICurrentField*/
390 {
391 public:
392 EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
393
394 #ifdef FH_VISUALIZATION
395 enum RenderType
396 {
397 BOX,
398 STATIONS,
399 SLICED,
400 INTERPOLATED
401 };
402 #endif
403
405 ShipSimObject( const std::string simObjectName, ISimObjectCreator* const creator);
406
409
411 void FinalSetup( const double T, const double *const X, ISimObjectCreator* const creator );
412
414 virtual void PreOdeFcn(const double T, const double *const X);
415
417 virtual void OdeFcn(const double T, const double* const X, double* const XDot) const;
418
420 void AcceptedStep(double T, const double* X) override;
421
422 #ifdef FH_VISUALIZATION
423
425 virtual void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator);
426
428 virtual void RenderUpdate( const double T, const double* const X );
429 #endif
430
431
432 public:
433
435 const double* PositionNED(const double T, const double* const X);
436
438 const double* PositionZeroCrossNED(const double T, const double* const X);
439
441 const double* PositionAPNED(const double T, const double* const X);
442
444 const double* VelocityNED(const double T, const double* const X);
445
447 const double* QuaternionNED(const double T, const double* const X);
448
450 const double* EulerAnglesNED(const double T, const double* const X);
451
453 const double* RotationBody(const double T, const double* const X);
454
456 const double* OmegaNED(const double T, const double* const X);
457
458
459 void ComputeRollPitchYaw(const double T, const double* const X) const;
460 void ComputeRelativeVelocity(const double T, const double* const X) const;
461
463 const double* BodyForce(const double T, const double* const X);
464
466 const double* VelocityBody(const double T, const double* const X);
467
473 const double* FirstOrderWaveBody(const double T, const double* const X);
474
478 const double* WaveDriftBody(const double T, const double* const X);
479
481 const double* const FluidMemForceBody(const double T, const double* const X);
482
484 const double* RestoringForceBody(const double T, const double* const X);
485
487 const double* RelativeVelocityBody(const double T, const double* const X);
488
490 const double* ViscousForceBody(const double T, const double* const X);
491
493 const double* Encounter(const double T, const double* const X);
494
496 const double* CoriolisRigidBody(const double T, const double* const X);
497
499 const double* CoriolisFluidBody(const double T, const double* const X);
500
502 const double* SpeedInfo( const double T, const double *const X);
503
505 const double* RotationForceFrame( const double T, const double *const X);
506
508 const double * KineticEnergy(const double T, const double* const X);
509
511 const double * FluidEnergy(const double T, const double* const X);
512 const double * FluidEnergy2(const double T, const double* const X);
514 const double * UFluidMemSpeed(const double T, const double* const X);
515
516 const double* FluidForceBySpeedBody(const double T, const double* const X, int index);
518 const double* FluidMemoryForceBody( const double T, const double *const X);
519
526 const double * CrossFlowBody(const double T, const double* const X);
527
554 const double * ResistanceBody(const double T, const double* const X);
555
563 const double * AdditionalDampeningBody(const double T, const double* const X);
564
566 const double* ExternalForceNED(const double T, const double* const X);
567
569 const double* ExternalForceBody(const double T, const double* const X);
572 const double * ViscousRoll(const double T, const double* const X);
573 double m_ViscousRoll[6];
574
576 const double * DriftSpeed(const double T, const double* const X);
577
579 ViscousShip& Viscous() { return m_viscous; }
580 const ViscousShip& Viscous() const { return m_viscous; }
581
582
583 double m_waveElevation;
584 double m_waveSlope;
585 /*const double * WaveElevation(const double T, const double* const X);
586 const double * WaveSlope(const double T, const double* const X);*/
587
588 private:
590 static ShipParameters ReadParameters( ISimObjectCreator* const creator );
591
594 void ComputeVelocityBody(const double T, const double* const X, double* const out) const;
595 void ComputeFirstOrderWaveBody(const double T, const double* const X, double* const out) const;
597 Eigen::Matrix<double,6,1> ComputeBodyForceTotal(const double T, const double* const X) const;
600 void ComputeBodyForceTotalCommon(const double T, const double* const X) const { m_bodyForceTotal = ComputeBodyForceTotal(T,X); }
601 void ComputeWaveDriftBody(const double T, const double* const X, double* const out) const;
602 void ComputeRestoringForceBody(const double T, const double* const X, double* const out) const;
603 void ComputeViscousForceBody(const double T, const double* const X, double* const out) const;
604 void ComputeCrossFlowBody(const double T, const double* const X, double* const out) const;
605 void ComputeAdditionalDampeningBody(const double T, const double* const X, double* const out) const;
606 void ComputeResistanceBody(const double T, const double* const X, double* const out) const;
607 void ComputeCoriolisRigidBody(const double T, const double* const X, double* const out) const;
608 void ComputeCoriolisFluidBody(const double T, const double* const X, double* const out) const;
609 void ComputeSpeedInfo(const double T, const double* const X, double* const out) const;
610 void ComputeFluidForceBySpeedBody(const double T, const double* const X, int index, double* const out) const;
611
612 void printShipInfo();
613
614 PrintDuringExec* m_logg;
615
616 Eigen::Vector3d m_forceExtNED;
617 Eigen::Vector3d m_forceExtBody;
618
619 Eigen::Vector3d m_PositionMidpoint;
620 Eigen::Vector3d m_PositionAP;
621 Eigen::Vector3d m_angles;
622
623 Eigen::Matrix<double,6,6> m_mrb;
624 Eigen::Matrix<double,6,6> m_invMrb;
625
626 std::unique_ptr<HullData> m_Hull;
627 std::unique_ptr<ShipResistance> m_resitance;
628 environment::EnvironmentProvider *m_environment = nullptr;
629
630
631 std::unique_ptr<sfh::math::SplineInterp> hoerner;
632
633
635 ISignalPort *m_InForceNED;
636
638 ISignalPort *m_InMomentNED;
639
641 ISignalPort *m_InForceBODY;
642
644 ISignalPort *m_InMomentBODY;
645
646 ICommonComputation *m_computeRelativeVelocity;
647 ICommonComputation *m_computeRotationAngles;
648 ICommonComputation *m_computeBodyForceTotal = nullptr;
649 mutable Eigen::Matrix<double,6,1> m_bodyForceTotal;
650
651 std::unique_ptr<PotentialData> m_TheoryData;
652
654 int m_numWaveComponents = 52;
657 bool RefreshWaveComponents(const double T);
658
659 std::vector<double> m_waveHeight;
660 std::vector<double> m_waveFreq;
661 std::vector<double> m_wavePhase;
662 std::vector<double> m_waveDirection;
663 std::vector<double> m_waveNumber;
664
665 std::vector<double> m_uHistory;
666 std::vector<double> m_psiHistory;
667 std::vector<double> m_tHistory;
668
669 std::vector<std::array<double,6>> m_fluidForce;
670 double m_fluidForceExperienced[6];
671 double m_rotationForceFrame[4];
672 double m_speedInformation[5];
673 double m_kinetic;
674 double m_fluid;
675 double m_fluid2[36];
676
677 double m_damping[6];
678
679 mutable double m_rollPitchYaw[3];
680 double m_speed[6];
681 mutable double m_relativeSpeed[6];
682
683 double m_firstOrderForce[6];
684 double m_waveDriftForce[6];
685 double m_CforcesBody[6];
686 double m_CforcesFluid[6];
687
688 double m_crossFlowBody[6];
689 double m_resistance[6];
690
691 double m_fluidMemForce[6];
692 double m_restoringForce[6];
693 double m_sumBodyForce[6];
694 double m_encounterFreq[52];
695 double m_viscousForce[6];
696 ViscousShip m_viscous;
697
698 double m_hydrostaticSpring[3];
699
700 double m_driftSpeed;
701
703 bool m_zeroSpeedRadiation;
705 bool m_hydroStaticsType;
707 bool m_useCrossFlow;
709 bool m_waveforceHframe;
711 int m_waveForceType;
713 int m_DOFFree[6];
715 double m_alfaN;
717 double m_alfaE;
719 double m_alfaD;
721 double m_surgeVelocity;
723 double m_wakeFraction;
725 double m_hydroStaticsStationVerticalStep;
727 double m_hydroStaticsStationHorizontalStep;
729 double m_hydroStaticsStationTop;
731 double m_hydroStaticsStationBottom;
733 double m_bilgeKeelStartPosition;
735 double m_bilgeKeelEndPosition;
737 double m_bilgeKeelHeight;
739 double m_damperLinear[3];
741 double m_damperQuadratic[3];
743 double m_damperRotLinear[3];
745 double m_damperRotQuadratic[3];
747 double m_dampingBlendSpeed;
749 double m_dampingBlendFraction;
750
752 double m_waveForceTransient;
753
770 double m_ForceScale[11];
772 std::string m_ForceInput;
774 std::string m_PotentialFileLocation;
776 std::string m_PotentialFileName;
778 std::string m_PotentialType;
780 double m_stablizeDOF[6];
781
782 bool m_coriolisRollOnly;
783 Eigen::Matrix<double, 6,1> m_coriolisDOFmangler;
784
785 static inline Eigen::Matrix3d S(const Eigen::Vector3d &v){
786 Eigen::Matrix3d retval = Eigen::Matrix3d::Zero();
787 retval(0,1)=-v(2);
788 retval(0,2)=v(1);
789 retval(1,0)=v(2);
790 retval(1,2)=-v(0);
791 retval(2,0)=-v(1);
792 retval(2,1)=v(0);
793 return retval;
794 }
795
796#ifdef FH_VISUALIZATION
799 bool m_ShowForceArrows = false;
801 std::string m_Material;
803 std::string m_Mesh;
805 std::string m_Scene;
807 RenderType m_RenderAs;
809 std::string m_RenderType;
810
811 #endif
812
813 std::vector<std::array<std::array<int,6>,6>> m_IFluidState;
814 std::vector<std::array<std::array<int,6>,6>> m_FluidStateSize;
815
816 unsigned int m_ISR;
817 unsigned int m_ISV;
818 unsigned int m_ISQ;
819 unsigned int m_ISW;
820
821
822 #ifdef FH_VISUALIZATION
823
824 public:
825 void DrawShip(Ogre::SceneNode* renderNode, Ogre::SceneManager* sceneMgr);
826 void DrawStations( Ogre::SceneNode* m_RenderNode, Ogre::SceneManager * sceneMgr );
827 private:
828 Ogre::ManualObject *manual ;
829 Ogre::SceneNode* m_RenderNodeHull;
830 Ogre::SceneNode* m_RenderNodeZeroCross;
831 Ogre::SceneNode* m_RenderNodeStations;
832 Ogre::SceneNode** m_RenderNodeSkegPoint;
833 double m_HideUntil;
834 double m_NodeOffset[3];
835 C3DArrow *FKF_u,*FKF_v,*FKF_w;
836 C3DArrow *FKT_u,*FKT_v,*FKT_w;
837
838 C3DArrow *FMF_u,*FMF_v,*FMF_w;
839 C3DArrow *FMT_u,*FMT_v,*FMT_w;
840
841 C3DArrow *RSF_u,*RSF_v,*RSF_w;
842 C3DArrow *RST_u,*RST_v,*RST_w;
843
844 C3DArrow *FKArrow;
845 C3DArrow *FMArrow;
846 C3DArrow *RArrow;
847 C3DArrow *Res;
848
849 C3DArrow *FKArrow_M;
850 C3DArrow *FMArrow_M;
851 C3DArrow *RArrow_M;
852 C3DArrow *Res_M;
853
854 C3DArrow *VArrow;
855 #endif
856
857 double m_maxWavePeriod;
858 };
859}
860
861#endif
Definition ShipSimObject.h:390
const double * KineticEnergy(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 * UFluidMemSpeed(const double T, const double *const X)
const double * CrossFlowBody(const double T, const double *const X)
const double * ViscousRoll(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 * 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...
ViscousShip & Viscous()
The viscous model of the hull: manoeuvring and DP damping, roll damping with its amplitude history.
Definition ShipSimObject.h:579
const double * DriftSpeed(const double T, const double *const X)
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 * EulerAnglesNED(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:14
Simple waypoint object.
Definition CableAttach.h:58
Definition ShipSimObject.h:316
std::string resistanceResidual
lower case
Definition ShipSimObject.h:378
std::string resistanceFriction
lower case
Definition ShipSimObject.h:374
int rollDampingTheory
0 for ITTC, 1 for SeaWay
Definition ShipSimObject.h:370
bool hasResistanceResidual
ResistanceResidual was given.
Definition ShipSimObject.h:377
bool hasResistanceFriction
ResistanceFriction was given.
Definition ShipSimObject.h:373
double rollAmplitudeHorizon
2.75 sqrt(10) s, as before the horizon was read
Definition ShipSimObject.h:371