FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
NetElement3NWakeEffect.h
1
13
14#ifndef C_NET_ELEMENT_3N_WAKE_EFFECT
15#define C_NET_ELEMENT_3N_WAKE_EFFECT
16
17#include <math.h>
18#include "NetElementDef.h"
19#include <fhsim/PrintDuringExec.h>
20#include <complex>
21//#include "eigen_matrix_defs.h"
22//#include "Eigen/Eigen"
23#include "Eigen/StdVector"
24using namespace std;
25using std::vector;
26typedef Eigen::Matrix<double,3,1> vec3;
27//#include <Eigen/Core>
28
29#ifdef FH_VISUALIZATION
30//#define USE_DYNAMIC_LINES
31#ifdef USE_DYNAMIC_LINES
32#include "sfh/ogre/CDynamicLines.h"
33#else
34#include "sfh/ogre/C3DLine.h"
35#endif
36#endif
37
38//#define RENDER_OUTLINE
39#define RENDER_MESH
40//#define ATTACH_SPHERE
41//#define RENDER_MATERIAL
42//#define FILTER_FORCES
43//#define CNetElement3NWakeEffect_TRANSPARENT
44
45class CDynamicLines; // forward declaration
46
48{
49public:
52 const std::string netName,
53 const unsigned long iID,
54 const NetElementDef* netPanel,
55 const int NBarsInWakeEffectCalc,
56 const double dNy_water,
57 const double dRho_water,
58 const double knotDiameterRatio,
59 const double knotMomStiff,
60 const double dKknotMomStiff_contact,
61 const double cnLinearLimitAngle,
62 const double cnLinear,
63 const double cnTurb,
64 const double cnLam,
65 const double turbLimit,
66 const double lamLimit,
67 const double dCt_nominal,
68 const double dCnKnots_nominal,
69 const double dampingRatio,
70 const bool internalWakeEffectsActive,
71 const bool useActualSizeInWakeEffect,
72 const bool useReynoldsDependentDrag);
73
76
77 // Owns raw buffers (freed in the destructor), so it must not be copied (MARE-0318).
79 NetElement3NWakeEffect& operator=(const NetElement3NWakeEffect&) = delete;
80
81 void AddNodeForces(const double* const adNodePosA_ned,
82 const double* const adNodePosB_ned,
83 const double* const adNodePosC_ned,
84 const double* const adNodeVelA_ned,
85 const double* const adNodeVelB_ned,
86 const double* const adNodeVelC_ned,
87 const double* const adAmbientCurrentVel_ned,
88 const double* const adWaveParticleVel_ned,
89 const double* const adWaterVel_ned,
90 double * const adNodeForceA_ned,
91 double * const adNodeForceB_ned,
92 double * const adNodeForceC_ned,
93 const bool useScreenModel,
94 const bool dUseDragCoeffMoeFore2021,
95 const double snImg,
96 const double rhoWater,
97 double hydroForcesRatio = 1.0,
98 double addedLinearDrag = 0.0
99 );
100
102 double CalcNodeInertia(int node);
103
104 //****NEW STUFF FOR WAKE EFFECT INCLUSION****//
105 void GenerateInternalWakeEffectPolynomial(double* currentVel);
106 void GenerateExternalWakeEffectPolynomial(double* currentVel);
107 bool IsInShadowedRegionOfCage();
108 void SetInShadowedRegionOfCage(bool value);
109 void SetDistanceToWallInFront(double distance);
110 double GetExternalWakeEffect(double* currentVel, double* posA, double* posB, double* posC);
111 double GetInternalWakeEffect(double* currentVel, double* posA, double* posB, double* posC);
112
113 //****END NEW STUFF FOR WAKE EFFECT INCLUSION****//
114
115#ifdef FH_VISUALIZATION
117 void RenderInit(Ogre::Root* ogreRoot);
118
120 void RenderUpdate( const double* const adPosA, const double* const adPosB,
121 const double* const adPosC );
122#endif
123
124 void setElementIsCoveredByROV(bool _covered);
125
126private:
127 void CalcTensionForces( double meshBarComp_panel[6], double meshBarLength[2],
128 double twineTension[2], double nodeATension_panel[3], double nodeBTension_panel[3],
129 double nodeCTension_panel[3]);
130
131 void CalcLocalUVComponents( double nodesABdist_panel[3], double nodesACdist_panel[3],
132 double nodesBCdist_panel[3], double meshBarComp_panel[6], double meshBarLength[2]);
133
134 void CalcMeshContactForces( double meshBarComp_panel[6],
135 double meshBarLength[2],
136 double nodeAMeshOpeningRes_panel[3],
137 double nodeBMeshOpeningRes_panel[3],
138 double nodeCMeshOpeningRes_panel[3],
139 double nodeATwineContactRes_panel[3],
140 double nodeBTwineContactRes_panel[3],
141 double nodeCTwineContactRes_panel[3]);
142
143 double CalcVelocities(double R_ned2panel[3][3],
144 const double* const adNodeVelA_ned,
145 const double* const adNodeVelB_ned,
146 const double* const adNodeVelC_ned,
147 const double* const adWaterVel_ned,
148 double elementVel_ned[3],
149 double hydDynVel_ned[3],
150 double hydDynVel_panel[3]);
151
152 void CalcHydroDynamicForcesScreenModel(
153 const double* const adNodePosA_ned,
154 const double* const adNodePosB_ned,
155 const double* const adNodePosC_ned,
156 const double* const adNodeVelA_ned,
157 const double* const adNodeVelB_ned,
158 const double* const adNodeVelC_ned,
159 const double* const adAmbientCurrentVel_ned,
160 const double* const adWaveParticleVel_ned,
161 const double* const adWaterVel_ned,
162 double * const nodeAforce_ned,
163 double * const nodeBforce_ned,
164 double * const nodeCforce_ned,
165 const double rhoWater,
166 const bool useDragCoeffMoeFore2021,
167 const double SnImg);
168
169 void CalcHydroDynamicForces(double meshBarComp_panel[6],
170 double meshBarLength[2],
171 double R_ned2panel[3][3],
172 const double* const adNodeVelA_ned,
173 const double* const adNodeVelB_ned,
174 const double* const adNodeVelC_ned,
175 const double* const adWaterVel_ned,
176 double elementVel_ned[3],
177 double totalDragPerNode_panel[3]);
178
179 void CalcDampingForces( double elementVel_ned[3],
180 const double* const adNodeVelA_ned,
181 const double* const adNodeVelB_ned,
182 const double* const adNodeVelC_ned,
183 const double* const adWaterVel_ned,
184 double adDampingForcesNodeA[3],
185 double adDampingForcesNodeB[3],
186 double adDampingForcesNodeC[3],
187 double addedLinearDrag);
188
189 // FUNCTIONS FOR SCREEN MODEL
190 double DragCoeffCircularCylinderFromReynoldsNumber(double Sn, double Urel);
191 vec3 CalcRelativeVelocity(
192 vec3 vec_Ucurr,
193 vec3 vec_Uwave,
194 const double* const adNodeVelA_ned,
195 const double* const adNodeVelB_ned,
196 const double* const adNodeVelC_ned);
197
198 //****NEW STUFF FOR WAKE EFFECT INCLUSION****//
199
200 void SortPanelNodes(int index, const double * aadNodes[3], double adNodePosA_mesh[2], double adNodePosB_mesh[2], double adNodePosC_mesh[2], unsigned short* aiSort);
201 void FindTwineCrossings(unsigned short index, unsigned short kiNumMeshPerLine, double* CoeffA, double* CoeffB, const double* aadNodes[3]);
202
203 double GetDragCoefficientFromPolynomial(double nominalReynoldsNumber);
204 double Blevins(double DX, double DY, double Cd);
205 double SquaredSumColumnIn2DDoubleArray(Eigen::MatrixXd input,int colIndex,int length);
206 Eigen::VectorXd PolynomialFit(Eigen::VectorXd alpha, int nAlpha, Eigen::VectorXd targetArray, int order);
207 double ComputePolynomialValue(std::string polynomialType, double inputValue);
208 int m_maxUBarDimension;
209 int m_maxVBarDimension;
210 double *m_InternalWakeEffectPolynomial = nullptr;
211 double *m_ExternalWakeEffectPolynomial = nullptr;
212 int m_orderOfInternalPolynomial;
213 int m_orderOfExternalPolynomial;
214 bool m_InternalWakeEffectsActive;
215 bool m_inShadowedRegionOfCage;
216 double m_distanceToWallInFront;
217 bool m_useReynoldsDependentDrag;
218 bool m_UseActualSizeInWakeEff;
219 int m_NBarsInWakeEffectCalc;
220 //****END NEW STUFF FOR WAKE EFFECT INCLUSION****//
221
222 double m_Sn;
223 double m_knotFactor;
224
225 // Input
226 unsigned long m_iD;
227 std::string m_netName;
228 double m_ny_water;
229 double m_nodeInertia[3];
230 //double m_rho_water; ///< Density of water.
231 //double m_rho_twines; ///< Material density of twines.
232 //double m_EModulus; ///< E-modulus of twine material.
233 double m_barD;
234 double m_knotD;
235 double m_barL0;
236 double m_knotMomStiff;
237 double m_knotMomStiffContact;
238 double m_nodeAPos_mesh[2];
239 double m_nodeBPos_mesh[2];
240 double m_nodeCPos_mesh[2];
241 double m_CnLinearLimitAngle;
242 double m_CnLinear;
243 double m_CnTurb;
244 double m_CnLam;
245 double m_TurbLimit;
246 double m_LamLimit;
247 double m_Ct_nominal;
248 double m_CnKnots_nominal;
249
250 // Calculated element properties
251 //double m_twineCrossSecArea; ///< The cross sectional area of each twine.
252 double m_nodesDistAB_mesh[2];
253 double m_nodesDistAC_mesh[2];
254 double m_nodesDistBC_mesh[2];
255 double m_meshDet;
256 double m_numMeshes;
257 double m_numUBars;
258 double m_numVBars;
259 double m_numKnots;
260 double m_weight;
261 double m_eATwine;
262
263 double m_meshOpeningAngle;
264 double m_ShadowEffect[3];
265 double m_ShadowEffectBias;
266 // Calculated constants for increased computational performance.
267 double m_Ct;
268 double m_kKnot;
269 double m_NodeWeight;
270 double m_kTwineDragNormal[2];
271 double m_nodeAforce_ned[3];
272 double m_nodeBforce_ned[3];
273 double m_nodeCforce_ned[3];
274 double m_dampingCoeff;
275#ifdef FILTER_FORCES
276 double m_nodeAforce_ned_last[3];
277 double m_nodeBforce_ned_last[3];
278 double m_nodeCforce_ned_last[3];
279#endif
280
281 bool m_coveredByROV;
282
283#ifdef FH_VISUALIZATION
284 // Visualization specifics
285 Ogre::Root* m_ogreRoot;
286 Ogre::SceneManager* m_sceneMgr;
287 Ogre::Entity* m_renderElement[3];
288 Ogre::Entity* m_renderSphere[3];
289 Ogre::SceneNode* m_renderNodeMesh;
290 Ogre::SceneNode* m_renderNodeSphere[3];
291 Ogre::SceneNode* m_renderNodeOutline;
292 Ogre::SceneNode* m_renderNodeMaterial;
293#ifdef USE_DYNAMIC_LINES
294 CDynamicLines* m_lines = nullptr;
295#else
296 C3DLine* m_lines = nullptr;
297#endif
298 CDynamicLines* m_lineOutline;
299 Ogre::ManualObject * m_netRenderObj;
300
301 // Visualization variables
302 unsigned short* m_sortU = nullptr;
303 unsigned short* m_sortV = nullptr;
304 unsigned long m_numTwines;
305 unsigned long m_numUTwines;
306 unsigned long m_numVTwines;
307 double* m_interpCoeffAu = nullptr;
308 double* m_interpCoeffAv = nullptr;
309 double* m_interpCoeffBu = nullptr;
310 double* m_interpCoeffBv = nullptr;
311#endif
312
313};
314
315
316#endif
Definition NetElement3NWakeEffect.h:48
double CalcNodeInertia(int node)
Calculates the inertia of a node.
NetElement3NWakeEffect(const std::string netName, const unsigned long iID, const NetElementDef *netPanel, const int NBarsInWakeEffectCalc, const double dNy_water, const double dRho_water, const double knotDiameterRatio, const double knotMomStiff, const double dKknotMomStiff_contact, const double cnLinearLimitAngle, const double cnLinear, const double cnTurb, const double cnLam, const double turbLimit, const double lamLimit, const double dCt_nominal, const double dCnKnots_nominal, const double dampingRatio, const bool internalWakeEffectsActive, const bool useActualSizeInWakeEffect, const bool useReynoldsDependentDrag)
The constructor.
~NetElement3NWakeEffect(void)
The destructor.
Class containing the description of a net panel and methods necessary for taking this over to triangu...
Definition NetElementDef.h:22