FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
CNorrbinTanker.h
1#ifndef CNorrbinTanker_H
2#define CNorrbinTanker_H
3
134#include <Eigen/Eigen>
135
136#include <fhsim/simobject/SimObject.h>
137#include <fhsim_environment/EnvironmentProvider.h>
138#include <string>
139
140
141class CNorrbinTanker : public SimObject
142{
143 public:
144 EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
145
147 CNorrbinTanker(std::string sSimObjectName, ISimObjectCreator* pCreator);
148
149 void FinalSetup(const double T, const double* const X, ISimObjectCreator* const creator);
150
151 void OdeFcn(const double dT, const double* const adX, double* const adXDot) const;
152
153#ifdef FH_VISUALIZATION
155 virtual void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator);
156
158 virtual void RenderUpdate(const double T, const double* const X);
159#endif
160
161 static double* tanker_CX; // wind drag coefficient surge
162 static double* tanker_CY; // wind drag coefficient sway
163 static double* tanker_CN; // wind drag coefficient yaw
164 static double* tanker_CK; // wind drag coefficient roll
165
166 Eigen::Matrix<double, 1, 9> DWT;
167 Eigen::Matrix<double, 1, 9> DISPL;
168 Eigen::Matrix<double, 1, 9> Lpp;
169 Eigen::Matrix<double, 1, 9> B;
170 Eigen::Matrix<double, 1, 9> D;
171 Eigen::Matrix<double, 1, 9> TT;
172 Eigen::Matrix<double, 1, 9> U0;
173 Eigen::Matrix<double, 1, 9> RPM0;
174
175 Eigen::Matrix<double, 1, 9> T;
176
177 Eigen::Matrix<double, 1, 9> Xdu;
178 Eigen::Matrix<double, 1, 9> Xuu;
179 Eigen::Matrix<double, 1, 9> Xvr;
180 Eigen::Matrix<double, 1, 9> Xvv;
181
182 Eigen::Matrix<double, 3, 9> Xccdd;
183 Eigen::Matrix<double, 1, 9> Xccbd;
184
185
186 Eigen::Matrix<double, 1, 9> Xduz;
187 Eigen::Matrix<double, 1, 9> Xuuz;
188 Eigen::Matrix<double, 1, 9> Xvrz;
189 Eigen::Matrix<double, 1, 9> Xvvzz;
190
191 Eigen::Matrix<double, 1, 9> Ydv;
192 Eigen::Matrix<double, 1, 9> Yur;
193 Eigen::Matrix<double, 1, 9> Yuv;
194 Eigen::Matrix<double, 1, 9> Yvv;
195
196 Eigen::Matrix<double, 3, 9> Yccd;
197 Eigen::Matrix<double, 1, 9> Yccbbd;
198
199 Eigen::Matrix<double, 1, 9> Yt;
200
201 Eigen::Matrix<double, 1, 9> Ydvz;
202 Eigen::Matrix<double, 1, 9> Yurz;
203 Eigen::Matrix<double, 1, 9> Yuvz;
204 Eigen::Matrix<double, 1, 9> Yvvz;
205 Eigen::Matrix<double, 1, 9> Yccbbdz;
206
207 Eigen::Matrix<double, 1, 9> kk_Ndr;
208 Eigen::Matrix<double, 1, 9> Nur_xg;
209 Eigen::Matrix<double, 1, 9> Nuv;
210 Eigen::Matrix<double, 1, 9> Nvr;
211
212 Eigen::Matrix<double, 3, 9> Nccd;
213
214 Eigen::Matrix<double, 1, 9> Nccbbd;
215 Eigen::Matrix<double, 1, 9> Nt;
216
217 Eigen::Matrix<double, 1, 9> Ndrz;
218 Eigen::Matrix<double, 1, 9> Nurz;
219 Eigen::Matrix<double, 1, 9> Nuvz;
220 Eigen::Matrix<double, 1, 9> Nvrz;
221 Eigen::Matrix<double, 1, 9> Nccbbdz;
222
223 Eigen::Matrix<double, 1, 9> Tuu;
224 Eigen::Matrix<double, 1, 9> Tun;
225 Eigen::Matrix<double, 1, 9> Tnn;
226
227 // C equation
228 Eigen::Matrix<double, 1, 9> Cun;
229 Eigen::Matrix<double, 1, 9> Cnn;
230
231 // Q equation
232 Eigen::Matrix<double, 1, 9> kk_Qn;
233 Eigen::Matrix<double, 1, 9> Qf;
234 Eigen::Matrix<double, 1, 9> Quu;
235 Eigen::Matrix<double, 1, 9> Qun;
236 Eigen::Matrix<double, 1, 9> Qnn;
237 Eigen::Matrix<double, 1, 9> Qn;
238 Eigen::Matrix<double, 1, 9> Qmu;
239
240 protected:
241 int m_indexStateRPM;
242 int m_indexStateDelta;
243 int m_indexStateVelocity;
244 int m_indexStateOmega;
245 int m_indexStateRotation;
246 int m_indexStatePosition;
247
255 int LocalIndex(int globalStateIndex) const { return globalStateIndex - m_indexStatePosition; }
256 double m_rhoWater;
257
258 virtual const double* Position(const double dT, const double* const adX);
259 virtual const double* Velocity(const double dT, const double* const adX);
260 virtual const double* Rotation(const double dT, const double* const adX);
261 virtual const double* Omega(const double dT, const double* const adX);
262
263 ISignalPort* m_InEngineControl;
264 ISignalPort* m_InRudderControl;
265
266 double comp_beta(double u, double v) const;
267 double comp_c(double u, double n) const;
268 double comp_ndot(double u, double n, double my) const;
269 double compute_gT(double u, double n) const;
270
271 double rudder_gln(double beta, double c, double delta, double z) const;
272 double rudder_gy(double beta, double c, double delta, double z) const;
273 double rudder_gx(double beta, double c, double delta) const;
274
275 double comp_Yuv(double z) const;
276 double comp_m11(double z) const;
277 double comp_m22(double z) const;
278 double comp_m33(double z) const;
279 double nlin_N(double u, double v, double r, double z) const;
280 double nlin_Y(double u, double v, double r, double z) const;
281 double nlin_X(double u, double v, double r, double z) const;
282
283 public:
284 bool HasJacobians() const override;
285 void OdeJacobian(double simTime, const double* X, double* J, int nStates) override;
286 int GetJacobianSparsity(int nStates, int* rowPtr, int* colIdx) override;
287
288 unsigned int m_tankerType;
289 unsigned int m_rudderType;
290
291 ISignalPort* m_pInForce;
292 ISignalPort* m_pInTorque;
293
294 environment::EnvironmentProvider* m_Environment;
295
296#ifdef FH_VISUALIZATION
297 std::string m_sMaterial;
298 std::string m_sMeshName;
299 double m_dScale;
300 Ogre::Entity* m_pRenderEntity;
301 Ogre::SceneNode* m_pRenderNode;
302 Ogre::SceneManager* m_pSceneMgr;
303
305 void AttachHullMesh(const Ogre::Vector3& userScale);
306#endif
307};
308
309
310#endif
Definition CNorrbinTanker.h:142
ISignalPort * m_pInForce
A pointer to the input force.
Definition CNorrbinTanker.h:291
CNorrbinTanker(std::string sSimObjectName, ISimObjectCreator *pCreator)
The constructor sets the pointer to the output object and the parser object.
ISignalPort * m_pInTorque
A pointer to the input force.
Definition CNorrbinTanker.h:292
int LocalIndex(int globalStateIndex) const
Definition CNorrbinTanker.h:255