FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
CableSegmentWaterForce.h
1#pragma once
2
9#include "cable/subroutines/CableHydrodynamics.h"
10#include "cable/subroutines/CableSurface.h"
11
12#include <algorithm>
13#include <cmath>
14#include <fhsim_coribo/eigen_matrix_defs.h>
15#include <fhsim_environment/EnvironmentProvider.h>
16
17namespace trawl_cable_water
18{
19using CoRiBoDynamics::vec3;
20using CoRiBoDynamics::vec6;
21
23struct Segment
24{
25 double radius;
26 double length;
27 double mass;
29};
30
31const double kRhoWater = 1025.0;
32const double kKinViscWater = 1.005E-6;
33
35const double kAddedMassCoefficient = cable_hydrodynamics::kCylinderAddedMassCoefficient;
36
48inline double WetFraction(environment::EnvironmentProvider& environment, double T, const vec3& P, const vec3& N, const Segment& segment)
49{
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);
53}
54
73inline vec6 InWaterForce(environment::EnvironmentProvider& environment, double T, const vec3& P, const vec3& V, const vec3& W, const vec3& N, const Segment& segment)
74{
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;
92 }
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;
97 double mean[3];
98 cable_surface::MeanWaveAcceleration(waves.get(), T, endA.data(), endB.data(), mean);
99 const vec3 a(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);
104 }
105 return Force;
106}
107
108} // namespace trawl_cable_water
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