52 const std::string netName,
53 const unsigned long iID,
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,
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);
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,
96 const double rhoWater,
97 double hydroForcesRatio = 1.0,
98 double addedLinearDrag = 0.0
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);
115#ifdef FH_VISUALIZATION
117 void RenderInit(Ogre::Root* ogreRoot);
120 void RenderUpdate(
const double*
const adPosA,
const double*
const adPosB,
121 const double*
const adPosC );
124 void setElementIsCoveredByROV(
bool _covered);
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]);
131 void CalcLocalUVComponents(
double nodesABdist_panel[3],
double nodesACdist_panel[3],
132 double nodesBCdist_panel[3],
double meshBarComp_panel[6],
double meshBarLength[2]);
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]);
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]);
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,
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]);
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);
190 double DragCoeffCircularCylinderFromReynoldsNumber(
double Sn,
double Urel);
191 vec3 CalcRelativeVelocity(
194 const double*
const adNodeVelA_ned,
195 const double*
const adNodeVelB_ned,
196 const double*
const adNodeVelC_ned);
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]);
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;
227 std::string m_netName;
229 double m_nodeInertia[3];
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;
248 double m_CnKnots_nominal;
252 double m_nodesDistAB_mesh[2];
253 double m_nodesDistAC_mesh[2];
254 double m_nodesDistBC_mesh[2];
263 double m_meshOpeningAngle;
264 double m_ShadowEffect[3];
265 double m_ShadowEffectBias;
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;
276 double m_nodeAforce_ned_last[3];
277 double m_nodeBforce_ned_last[3];
278 double m_nodeCforce_ned_last[3];
283#ifdef FH_VISUALIZATION
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;
296 C3DLine* m_lines =
nullptr;
298 CDynamicLines* m_lineOutline;
299 Ogre::ManualObject * m_netRenderObj;
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;
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.