9#include "cable/subroutines/CableHydrodynamics.h"
10#include "cable/subroutines/CableSurface.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 = cable_hydrodynamics::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 cable_surface::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();
87 const double reynolds = cable_hydrodynamics::ReynoldsNumber(v_abs2, vxy_abs, 2.0 * segment.radius, kKinViscWater);
88 const double Cd = cable_hydrodynamics::NormalDragCoefficient(reynolds);
89 const double Ct = cable_hydrodynamics::TangentialDragCoefficient(reynolds);
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 cable_surface::MeanWaveAcceleration(waves.get(), T, endA.data(), endB.data(), mean);
100 double inertiaForce[3];
101 cable_hydrodynamics::MorisonInertiaForce(
102 cable_hydrodynamics::InertiaForceFactor(kRhoWater, segment.displacementVolume, f, kAddedMassCoefficient), a.data(), N.data(), inertiaForce);
103 Force.segment<3>(0) += vec3(inertiaForce);
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