FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
DoorSubmergence.h
1#pragma once
2
3#include <algorithm>
4#include <limits>
5
16{
17
23template<class Environment>
24double WaveElevationBound(const Environment& environment)
25{
26 if constexpr (requires { environment.MaxWaveElevation(); })
27 return environment.MaxWaveElevation();
28 else
29 return std::numeric_limits<double>::infinity();
30}
31
40inline double PolygonSubmergedFraction(const double u[], const double v[], const double s[], int n)
41{
42 bool anyWet = false, allWet = true;
43 for (int i = 0; i < n; ++i) {
44 anyWet = anyWet || s[i] > 0.0;
45 allWet = allWet && s[i] > 0.0;
46 }
47 if (allWet)
48 return 1.0;
49 if (!anyWet)
50 return 0.0;
51
52 double cu[16], cv[16];
53 int m = 0;
54 for (int i = 0; i < n; ++i) {
55 const int j = (i + 1) % n;
56 if (s[i] > 0.0) {
57 cu[m] = u[i];
58 cv[m++] = v[i];
59 }
60 if ((s[i] > 0.0) != (s[j] > 0.0)) {
61 const double t = s[i] / (s[i] - s[j]);
62 cu[m] = u[i] + t * (u[j] - u[i]);
63 cv[m++] = v[i] + t * (v[j] - v[i]);
64 }
65 }
66 double wetArea = 0.0, area = 0.0;
67 for (int i = 0; i < m; ++i)
68 wetArea += cu[i] * cv[(i + 1) % m] - cu[(i + 1) % m] * cv[i];
69 for (int i = 0; i < n; ++i)
70 area += u[i] * v[(i + 1) % n] - u[(i + 1) % n] * v[i];
71 return std::clamp(wetArea / area, 0.0, 1.0);
72}
73
83template<class Environment>
84double DoorWetFraction(Environment& environment, double time, const double origin[3], const double cornerBody[4][3],
85 const double cornerNed[4][3], double waveBound)
86{
87 double top = std::numeric_limits<double>::infinity();
88 for (int i = 0; i < 4; ++i)
89 top = std::min(top, cornerNed[i][2]);
90 if (top > waveBound)
91 return 1.0;
92 double elevation = 0.0;
93 environment.GetSurfaceElevation(time, origin, elevation);
94 double u[4], v[4], s[4];
95 for (int i = 0; i < 4; ++i) {
96 u[i] = cornerBody[i][0];
97 v[i] = cornerBody[i][2];
98 s[i] = cornerNed[i][2] + elevation;
99 }
100 return PolygonSubmergedFraction(u, v, s, 4);
101}
102
103} // namespace door_submergence
Definition DoorSubmergence.h:16
double PolygonSubmergedFraction(const double u[], const double v[], const double s[], int n)
Definition DoorSubmergence.h:40
double WaveElevationBound(const Environment &environment)
Definition DoorSubmergence.h:24
double DoorWetFraction(Environment &environment, double time, const double origin[3], const double cornerBody[4][3], const double cornerNed[4][3], double waveBound)
Definition DoorSubmergence.h:84