317 std::string forceInput =
"NED";
318 int numWaveComponents = 52;
319 bool zeroSpeedRadiation =
true;
320 double stabilizeDOF[6] = {0,0,0,0,0,0};
324 double surgeVelocity = 0;
326 std::string potentialFileLocation;
327 std::string potentialFileName;
328 std::string potentialType =
"VERES";
329 int flipPhaseForOSC = 0;
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;
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;
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;
360 double bilgeKeelStartPosition = std::numeric_limits<double>::quiet_NaN();
361 double bilgeKeelEndPosition = std::numeric_limits<double>::quiet_NaN();
362 double bilgeKeelHeight = 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;
375 std::string resistanceFrictionCurveX;
376 std::string resistanceFrictionCurveY;
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;
392 EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
394 #ifdef FH_VISUALIZATION
405 ShipSimObject(
const std::string simObjectName, ISimObjectCreator*
const creator);
411 void FinalSetup(
const double T,
const double *
const X, ISimObjectCreator*
const creator );
414 virtual void PreOdeFcn(
const double T,
const double *
const X);
417 virtual void OdeFcn(
const double T,
const double*
const X,
double*
const XDot)
const;
420 void AcceptedStep(
double T,
const double* X)
override;
422 #ifdef FH_VISUALIZATION
425 virtual void RenderInit(Ogre::Root*
const ogreRoot, ISimObjectCreator*
const creator);
428 virtual void RenderUpdate(
const double T,
const double*
const X );
456 const double*
OmegaNED(
const double T,
const double*
const X);
459 void ComputeRollPitchYaw(
const double T,
const double*
const X)
const;
460 void ComputeRelativeVelocity(
const double T,
const double*
const X)
const;
463 const double*
BodyForce(
const double T,
const double*
const X);
493 const double*
Encounter(
const double T,
const double*
const X);
502 const double*
SpeedInfo(
const double T,
const double *
const X);
511 const double *
FluidEnergy(
const double T,
const double*
const X);
512 const double * FluidEnergy2(
const double T,
const double*
const X);
516 const double* FluidForceBySpeedBody(
const double T,
const double*
const X,
int index);
572 const double *
ViscousRoll(
const double T,
const double*
const X);
573 double m_ViscousRoll[6];
576 const double *
DriftSpeed(
const double T,
const double*
const X);
583 double m_waveElevation;
590 static ShipParameters ReadParameters( ISimObjectCreator*
const creator );
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;
612 void printShipInfo();
614 PrintDuringExec* m_logg;
616 Eigen::Vector3d m_forceExtNED;
617 Eigen::Vector3d m_forceExtBody;
619 Eigen::Vector3d m_PositionMidpoint;
620 Eigen::Vector3d m_PositionAP;
621 Eigen::Vector3d m_angles;
623 Eigen::Matrix<double,6,6> m_mrb;
624 Eigen::Matrix<double,6,6> m_invMrb;
626 std::unique_ptr<HullData> m_Hull;
627 std::unique_ptr<ShipResistance> m_resitance;
628 environment::EnvironmentProvider *m_environment =
nullptr;
631 std::unique_ptr<sfh::math::SplineInterp> hoerner;
635 ISignalPort *m_InForceNED;
638 ISignalPort *m_InMomentNED;
641 ISignalPort *m_InForceBODY;
644 ISignalPort *m_InMomentBODY;
646 ICommonComputation *m_computeRelativeVelocity;
647 ICommonComputation *m_computeRotationAngles;
648 ICommonComputation *m_computeBodyForceTotal =
nullptr;
649 mutable Eigen::Matrix<double,6,1> m_bodyForceTotal;
651 std::unique_ptr<PotentialData> m_TheoryData;
654 int m_numWaveComponents = 52;
657 bool RefreshWaveComponents(
const double T);
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;
665 std::vector<double> m_uHistory;
666 std::vector<double> m_psiHistory;
667 std::vector<double> m_tHistory;
669 std::vector<std::array<double,6>> m_fluidForce;
670 double m_fluidForceExperienced[6];
671 double m_rotationForceFrame[4];
672 double m_speedInformation[5];
679 mutable double m_rollPitchYaw[3];
681 mutable double m_relativeSpeed[6];
683 double m_firstOrderForce[6];
684 double m_waveDriftForce[6];
685 double m_CforcesBody[6];
686 double m_CforcesFluid[6];
688 double m_crossFlowBody[6];
689 double m_resistance[6];
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;
698 double m_hydrostaticSpring[3];
703 bool m_zeroSpeedRadiation;
705 bool m_hydroStaticsType;
709 bool m_waveforceHframe;
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;
752 double m_waveForceTransient;
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];
782 bool m_coriolisRollOnly;
783 Eigen::Matrix<double, 6,1> m_coriolisDOFmangler;
785 static inline Eigen::Matrix3d S(
const Eigen::Vector3d &v){
786 Eigen::Matrix3d retval = Eigen::Matrix3d::Zero();
796#ifdef FH_VISUALIZATION
799 bool m_ShowForceArrows =
false;
801 std::string m_Material;
807 RenderType m_RenderAs;
809 std::string m_RenderType;
813 std::vector<std::array<std::array<int,6>,6>> m_IFluidState;
814 std::vector<std::array<std::array<int,6>,6>> m_FluidStateSize;
822 #ifdef FH_VISUALIZATION
825 void DrawShip(Ogre::SceneNode* renderNode, Ogre::SceneManager* sceneMgr);
826 void DrawStations( Ogre::SceneNode* m_RenderNode, Ogre::SceneManager * sceneMgr );
828 Ogre::ManualObject *manual ;
829 Ogre::SceneNode* m_RenderNodeHull;
830 Ogre::SceneNode* m_RenderNodeZeroCross;
831 Ogre::SceneNode* m_RenderNodeStations;
832 Ogre::SceneNode** m_RenderNodeSkegPoint;
834 double m_NodeOffset[3];
835 C3DArrow *FKF_u,*FKF_v,*FKF_w;
836 C3DArrow *FKT_u,*FKT_v,*FKT_w;
838 C3DArrow *FMF_u,*FMF_v,*FMF_w;
839 C3DArrow *FMT_u,*FMT_v,*FMT_w;
841 C3DArrow *RSF_u,*RSF_v,*RSF_w;
842 C3DArrow *RST_u,*RST_v,*RST_w;
857 double m_maxWavePeriod;