10#include <fhsim_environment/hydrodynamics/BodySubmergence.h>
11#include <fhsim_environment/hydrodynamics/WetCylinderLaw.h>
13#include "cable/GaussPointDrag.h"
14#include "cable/WetCylinderWater.h"
16#include <sfh/constants.h>
21#include <fhsim_environment/EnvironmentProvider.h>
22#include <fhsim_environment/ElementFlowInteraction.h>
23#include <marenv/marenv.h>
37const double kAirDensity = 1.025;
40inline environment::wet_cylinder::WetCylinder CylinderOf(
const ElementProperties& element)
42 environment::wet_cylinder::WetCylinder cylinder {};
43 cylinder.length = element.
length;
44 cylinder.radius = element.
radius;
46 cylinder.waterDensity = kWaterDensity;
47 cylinder.inertia = environment::wet_cylinder::AddedMassInertia::NoCoriolis;
83inline double AddAboveSeabedLoad(
const environment::wake::ElementFlowInteraction& flow,
double T,
const Eigen::Vector3d& P,
const Eigen::Vector3d& V,
84 const Eigen::Vector3d& W,
const Eigen::Vector3d& axis,
const ElementProperties& element,
int point, Eigen::Matrix<double, 6, 1>& load,
85 const wet_cylinder_water::EndWater* gaussWater =
nullptr)
87 using vec3 = Eigen::Vector3d;
91 const auto water = gaussWater ? wet_cylinder_water::SampleWaterGivenVelocity(flow, T, P.data(), axis.data(), element.length, element.radius, gaussWater->Mean())
92 : wet_cylinder_water::SampleWater(flow, T, P.data(), axis.data(), element.length, element.radius, point);
95 const double rho = kWaterDensity;
96 load(2) -= element.length * element.radius * element.radius * sfh::pi * rho *
marenv::gravity * f;
98 vec3 v = V - vec3(water.waterVelocity.data());
105 using environment::wet_cylinder::Vector;
106 const environment::wet_cylinder::WetCylinderState state {f, Vector {V(0), V(1), V(2)}, water.waterVelocity, Vector {W(0), W(1), W(2)}, Vector {axis(0), axis(1), axis(2)},
107 water.waveAcceleration};
108 const auto cylinder = CylinderOf(element);
109 const auto law = gaussWater ? environment::wet_cylinder::WaterLoadWithoutDrag(cylinder, environment::wet_cylinder::ReynoldsDrag {}, state)
110 : environment::wet_cylinder::WaterLoad(cylinder, environment::wet_cylinder::ReynoldsDrag {}, state);
111 load.segment<3>(0) += vec3(law.coriolis.data());
113 double v_abs2 = v.squaredNorm();
115 vec3 vz = v.dot(axis) * axis;
118 double v_abs = v.norm();
119 double vxy_abs = vxy.norm();
123 double cosTheta = vxy_abs > 0 ? v.dot(vxy) / (v_abs * vxy_abs) : 0.0;
127 load.segment<3>(0) += -0.2 * (1 + 4 * cosTheta) * element.kelpWeight * element.length * (1.0731 * v_abs * v + 1.0509 * v) * f;
131 load.segment<3>(0) += vec3(law.drag.data());
134 const auto gauss = wet_cylinder_water::GaussPointDragLoad(cylinder, f, V, W, axis, *gaussWater);
135 load.segment<3>(0) += gauss.force;
136 load.segment<3>(3) += gauss.moment;
138 load.segment<3>(3) += vec3(law.torsion.data());
139 if (water.waveAcceleration)
140 load.segment<3>(0) += vec3(law.morison.data());
143 const double rho = kAirDensity;
144 vec3 vz = V.dot(axis) * axis;
146 double vz_abs = vz.norm();
147 double vxy_abs = vxy.norm();
152 load(2) -= element.length * element.radius * element.radius * sfh::pi * rho *
marenv::gravity * (1.0 - f);
153 load.segment<3>(0) -= rho * element.radius * element.length * (Cd * vxy_abs * vxy + Ct * vz_abs * vz) * (1.0 - f);
constexpr double gravity
Gravity constant.
Definition marenv.h:19
constexpr double seawaterDensity
Ocean water density.
Definition marenv.h:20
The properties of a CableRM element.
Definition CableRMWaterLoad.h:29
bool kelp
True for a kelp rope.
Definition CableRMWaterLoad.h:32
double length
The element length [m].
Definition CableRMWaterLoad.h:30
double kelpWeight
The kelp biomass per metre [N/m].
Definition CableRMWaterLoad.h:33
double radius
The element radius [m].
Definition CableRMWaterLoad.h:31
double wetFraction
f in [0, 1].
Definition WetCylinderWater.h:33