-
Notifications
You must be signed in to change notification settings - Fork 0
/
speed_of_sound.hpp
76 lines (62 loc) · 2.28 KB
/
speed_of_sound.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#
#if !defined(H_SPEED_OF_SOUND)
#define H_SPEED_OF_SOUND
#include <algorithm>
#include <cmath>
#include <vector>
#include "polynomial.hpp"
namespace project::speed_of_sound
{
template <class T>
const std::vector<std::vector<T>> C_coeffs{
{1402.388, 5.03830, -5.81090e-2, 3.3432e-4, -1.47797e-6, 3.1419e-9},
{0.153563, 6.8999e-4, -8.1829e-6, 1.3632e-7, -6.1260e-10},
{3.1260e-5, -1.7111e-6, 2.5986e-8, -2.5353e-10, 1.0415e-12},
{-9.7729e-9, 3.8513e-10, -2.3654e-12}};
template <class T>
const std::vector<std::vector<T>> A_coeffs{
{1.389, -1.262E-2, 7.166E-5, 2.008E-6, -3.21E-8},
{9.4742E-5, -1.2583E-5, -6.4928E-8, 1.0515E-8, -2.0142E-10},
{-3.9064E-7, 9.1061E-9, -1.6009E-10, 7.994E-12},
{1.100E-10, 6.651E-12, -3.391E-13}};
template <class T>
const std::vector<std::vector<T>> B_coeffs{{-1.922E-2, -4.42E-5},
{7.3637E-5, 1.7950E-7}};
template <class T>
const T pressure_at_depth(T depth, T latitude = -30.0)
{
latitude = latitude * M_PI / 180.0;
T h = depth * (1.00818e-2 +
depth * (2.465e-8 + depth * (-1.25e-13 + depth * 2.8e-19)));
T k = (9.7803 * (1.0 + 5.3e-3 * std::pow(std::sin(latitude), 2)) -
2e-5 * depth) /
(9.80612 - 2e-5 * depth);
T thyh_0 = (1.0e-2 / (depth + 100) + 6.2e-6) * depth;
return 1000.0 * (h * k - thyh_0);
}
template <class T>
const T speed_of_sound(const T &p, const T &t, const T &s)
{
auto p_kpa = p / 100.0;
using std::vector;
const auto D = 1.727E-3 - 7.9836E-6 * p_kpa;
const auto C_w = poly::horner2D(C_coeffs<T>, t, p_kpa);
const auto B = poly::horner2D(B_coeffs<T>, t, p_kpa);
const auto A = poly::horner2D(A_coeffs<T>, t, p_kpa);
return C_w + A * s + B * s * std::sqrt(s) + D * s * s;
}
template <class T>
const T leroy_et_al(const T &z, const T &t, const T &s, const T &lat)
{
return 1402.5 + s * 1.33 +
t * (5 - 1.23e-2 * s - t * (5.44e-2 + 8.7e-5 * s + 3e-7 * z + t * 2.1e-4)) +
z * (1.56e-2 + 1.43e-5 * s + z * (2.55e-7 - z * (7.3e-12 - 9.5e-13 * t))) +
1.2e-6 * (lat - 45) * z;
}
enum SpeedOfSoundAlgorithm
{
ALGORITHM_UNESCO,
ALGORITHM_LEROY
};
} // namespace speed_of_sound
#endif // H_SPEED_OF_SOUND