9#include <fhsim_environment/hydrodynamics/CylinderHydro.h>
10#include <fhsim_environment/hydrodynamics/BodySubmergence.h>
14#include <fhsim_coribo/eigen_matrix_defs.h>
15#include <fhsim_environment/EnvironmentProvider.h>
17namespace trawl_cable_water
19using CoRiBoDynamics::vec3;
20using CoRiBoDynamics::vec6;
31const double kRhoWater = 1025.0;
32const double kKinViscWater = 1.005E-6;
35const double kAddedMassCoefficient = environment::cylinder_hydro::kCylinderAddedMassCoefficient;
48inline double WetFraction(environment::EnvironmentProvider& environment,
double T,
const vec3& P,
const vec3& N,
const Segment& segment)
50 const vec3 endA = P - 0.5 * segment.
length * N;
51 const vec3 endB = P + 0.5 * segment.
length * N;
52 return environment::body_submergence::CylinderWetFraction(environment, environment.MaxWaveElevation(), T, endA.data(), endB.data(), segment.
radius);
73inline vec6 InWaterForce(environment::EnvironmentProvider& environment,
double T,
const vec3& P,
const vec3& V,
const vec3& W,
const vec3& N,
const Segment& segment)
75 vec6 Force = vec6::Zero();
76 double currentVelocity[3];
77 environment.GetParticleVelocity(T, P.data(), currentVelocity);
78 vec3 V_relative = V - vec3(currentVelocity);
79 double v_abs2 = V_relative.squaredNorm();
80 const double f = WetFraction(environment, T, P, N, segment);
81 Force(2) = 9.81 * (segment.mass - kRhoWater * segment.displacementVolume * f);
82 if (v_abs2 > 0 && f > 0.0) {
83 vec3 vz = V_relative.dot(N) * N;
84 vec3 vxy = V_relative - vz;
85 double vz_abs = vz.norm();
86 double vxy_abs = vxy.norm();
88 const double Cd = environment::cylinder_hydro::NormalDragCoefficient(environment::cylinder_hydro::ReynoldsNumber(vxy_abs, 2.0 * segment.radius, kKinViscWater));
89 const double Ct = environment::cylinder_hydro::TangentialDragCoefficient(environment::cylinder_hydro::ReynoldsNumber(std::sqrt(v_abs2), 2.0 * segment.radius, kKinViscWater));
90 Force.segment<3>(0) += -kRhoWater * segment.radius * segment.length * (Cd * vxy_abs * vxy + Ct * vz_abs * vz) * f;
91 Force.segment<3>(3) = -kRhoWater * segment.radius * segment.radius * segment.length * 0.1 * W.norm() * W.dot(N) * N * f;
93 const auto waves = environment.GetWaves();
94 if (waves && f > 0.0) {
95 const vec3 endA = P - 0.5 * segment.length * N;
96 const vec3 endB = P + 0.5 * segment.length * N;
98 environment::body_submergence::MeanWaveAcceleration(waves.get(), T, endA.data(), endB.data(), mean);
100 double inertiaForce[3];
101 environment::cylinder_hydro::MorisonInertiaForce(
102 environment::cylinder_hydro::InertiaForceFactor(kRhoWater, segment.displacementVolume, f, kAddedMassCoefficient), a.data(), N.data(), inertiaForce);
103 Force.segment<3>(0) += vec3(inertiaForce);
void Force(const double *pk, const double *pl, const double *vk, const double *current, double rho, double D, double force[3])
Definition CableSegmentDrag.h:40
The properties of the elements of one cable segment.
Definition CableSegmentWaterForce.h:24
double displacementVolume
The volume that gives the buoyancy [m³].
Definition CableSegmentWaterForce.h:28
double mass
The element mass [kg].
Definition CableSegmentWaterForce.h:27
double length
The element length [m].
Definition CableSegmentWaterForce.h:26
double radius
The drag radius [m].
Definition CableSegmentWaterForce.h:25