10#include "cable/subroutines/CableSurface.h"
12#include <sfh/constants.h>
17#include <fhsim_environment/EnvironmentProvider.h>
30const double kWaterDensity = 1025.0;
31const double kAirDensity = 1.025;
32const double kWaterViscosity = 1.005E-6;
47inline void AddAboveSeabedLoad(environment::EnvironmentProvider& environment,
double T,
const Eigen::Vector3d& P,
const Eigen::Vector3d& V,
48 const Eigen::Vector3d& W,
const Eigen::Vector3d& axis,
const ElementProperties& element, Eigen::Matrix<double, 6, 1>& load)
50 using vec3 = Eigen::Vector3d;
54 const vec3 endA = P - 0.5 * element.
length * axis;
55 const vec3 endB = P + 0.5 * element.
length * axis;
56 const double f = cable_surface::CylinderWetFraction(environment, environment.MaxWaveElevation(), T, endA.data(), endB.data(), element.
radius);
58 const double rho = kWaterDensity;
59 load(2) -= element.
length * element.
radius * element.
radius * sfh::pi * rho * 9.81 * f;
61 double currentVelocity[3];
62 environment.GetParticleVelocity(T, P.data(), currentVelocity);
63 vec3 v = V - vec3(currentVelocity);
65 double v_abs2 = v.squaredNorm();
67 vec3 vz = v.dot(axis) * axis;
70 vec3 wz = W.dot(axis) * axis;
72 double v_abs = v.norm();
73 double vz_abs = vz.norm();
74 double vxy_abs = vxy.norm();
78 double cosTheta = vxy_abs > 0 ? v.dot(vxy) / (v_abs * vxy_abs) : 0.0;
80 const double reynolds = cable_hydrodynamics::ReynoldsNumber(v_abs2, vxy_abs, 2.0 * element.
radius, kWaterViscosity);
81 const DragCoefficients coefficients = ElementDragCoefficients(reynolds, vxy_abs / sqrt(v_abs2));
82 const double Cd = coefficients.
normal;
83 const double CtTorsion = coefficients.
torsional;
86 load.segment<3>(0) += -0.2 * (1 + 4 * cosTheta) * element.
kelpWeight * element.
length * (1.0731 * v_abs * v + 1.0509 * v) * f;
90 load.segment<3>(0) += -rho * element.
radius * element.
length * (Cd * vxy_abs * vxy + Ct_xyz * vz_abs * vz) * f;
91 load.segment<3>(3) += -rho * 2 * sfh::pi * element.
radius * element.
length * element.
radius * (CtTorsion * wz.norm() * wz) / 1000 * f;
95 const auto waves = environment.GetWaves();
98 cable_surface::MeanWaveAcceleration(waves.get(), T, endA.data(), endB.data(), mean);
100 double inertiaForce[3];
101 cable_hydrodynamics::MorisonInertiaForce(
102 cable_hydrodynamics::InertiaForceFactor(rho, sfh::pi * element.
radius * element.
radius * element.
length, f, 0.0), a.data(), axis.data(), inertiaForce);
103 load.segment<3>(0) += vec3(inertiaForce);
107 const double rho = kAirDensity;
108 vec3 vz = V.dot(axis) * axis;
110 double vz_abs = vz.norm();
111 double vxy_abs = vxy.norm();
116 load(2) -= element.
length * element.
radius * element.
radius * sfh::pi * rho * 9.81 * (1.0 - f);
117 load.segment<3>(0) -= rho * element.
radius * element.
length * (Cd * vxy_abs * vxy + Ct * vz_abs * vz) * (1.0 - f);
The drag coefficients of a CableRM element.
Definition Cable.h:165
double normal
Cd, on the flow normal to the axis.
Definition Cable.h:166
double torsional
The coefficient of the torsional drag on the spin about the axis.
Definition Cable.h:168
double tangential
Ct, the skin friction on the flow along the axis (owner ruling R68).
Definition Cable.h:167
The properties of a CableRM element.
Definition CableRMWaterLoad.h:23
bool kelp
True for a kelp rope.
Definition CableRMWaterLoad.h:26
double length
The element length [m].
Definition CableRMWaterLoad.h:24
double kelpWeight
The kelp biomass per metre [N/m].
Definition CableRMWaterLoad.h:27
double radius
The element radius [m].
Definition CableRMWaterLoad.h:25