Jpp  master_rocky-37-gf0c5bc59d
the software that should make you happy
JUNESCO.hh
Go to the documentation of this file.
1 #ifndef __JACOUSTICS__JUNESCO__
2 #define __JACOUSTICS__JUNESCO__
3 
4 #include "JMath/JConstants.hh"
5 
6 /**
7  * \file
8  *
9  * Sound velocity according UNESCO equation.
10  * \author mdejong
11  */
12 namespace JACOUSTICS {}
13 namespace JPP { using namespace JACOUSTICS; }
14 
15 namespace JACOUSTICS {
16 
17  using JMATH::PI;
18 
19  /**
20  * Get gravitational constant.
21  *
22  * \param phi latitude [deg]
23  * \return g [m/s^2]
24  */
25  inline double getGravity(const double phi)
26  {
27  const double sd = sin(phi * PI / 180.0);
28  const double s2 = sd*sd;
29  const double s4 = s2*s2;
30 
31  return 9.780318 * (1.0 + 5.2788e-3*s2 + 2.36e-5*s4);
32  }
33 
34 
35  /**
36  * Get sound velocity.
37  *
38  * K.V. Mackenzie, Nine-term equation for the sound speed in the oceans (1981)\n
39  * J. Acoust. Soc. Am. 70(3), pp 807-812
40  *
41  * \param D depth [m]
42  * \param S salinity [ppk]
43  * \param T temperature [C]
44  * \return sound velocity [m/s]
45  */
46  inline double getVelocityMackenzie(const double D, const double S, const double T)
47  {
48  return (1448.96
49  + 4.591 * T
50  - 5.304e-2 * T*T
51  + 2.374e-4 * T*T*T
52  + 1.340 * (S - 35)
53  + 1.630e-2 * D
54  + 1.675e-7 * D*D
55  - 1.025e-2 * T * (S - 35)
56  - 7.139e-13 * T*D*D*D);
57  }
58 
59 
60  /**
61  * Get sound velocity.
62  *
63  * A.B. Coppens, Simple equations for the speed of sound in Neptunian waters (1981)\n
64  * J. Acoust. Soc. Am. 69(3), pp 862-863
65  *
66  * \param D depth [m]
67  * \param S salinity [ppk]
68  * \param T temperature [C]
69  * \return sound velocity [m/s]
70  */
71  inline double getVelocityCoppens(const double D, const double S, const double T)
72  {
73  const double t = T * 0.1;
74  const double d = D * 1.0e-3;
75  const double c = 1449.05 + 45.7 * t - 5.21 * t*t + 0.23 * t*t*t + (1.333 - 0.126*t + 0.009 * t*t)*(S - 35);
76 
77  return (c +
78  (16.23 + 0.253*t) * d +
79  (0.213 - 0.1*t) * d*d +
80  (0.016 + 0.0002*(S-35))*(S - 35)*t*d);
81  }
82 
83 
84  /**
85  * Get sound velocity.
86  *
87  * C-T. Chen and F.J. Millero, Speed of sound in seawater at high pressures (1977)\n
88  * J. Acoust. Soc. Am. 62(5) pp 1129-1135
89  *
90  * \param P pressure [bar]
91  * \param S salinity [ppk]
92  * \param T temperature [C]
93  * \return sound velocity [m/s]
94  */
95  inline double getVelocityUNESCO(const double P, const double S, const double T)
96  {
97  const double A00 = 1.389;
98  const double A01 = -1.262E-2;
99  const double A02 = 7.166E-5;
100  const double A03 = 2.008E-6;
101  const double A04 = -3.21E-8;
102  const double A10 = 9.4742E-5;
103  const double A11 = -1.2583E-5;
104  const double A12 = -6.4928E-8;
105  const double A13 = 1.0515E-8;
106  const double A14 = -2.0142E-10;
107  const double A20 = -3.9064E-7;
108  const double A21 = 9.1061E-9;
109  const double A22 = -1.6009E-10;
110  const double A23 = 7.994E-12;
111  const double A30 = 1.100E-10;
112  const double A31 = 6.651E-12;
113  const double A32 = -3.391E-13;
114  const double B00 = -1.922E-2;
115  const double B01 = -4.42E-5;
116  const double B10 = 7.3637E-5;
117  const double B11 = 1.7950E-7;
118  const double C00 = 1402.388;
119  const double C01 = 5.03830;
120  const double C02 = -5.81090E-2;
121  const double C03 = 3.3432E-4;
122  const double C04 = -1.47797E-6;
123  const double C05 = 3.1419E-9;
124  const double C10 = 0.153563;
125  const double C11 = 6.8999E-4;
126  const double C12 = -8.1829E-6;
127  const double C13 = 1.3632E-7;
128  const double C14 = -6.1260E-10;
129  const double C20 = 3.1260E-5;
130  const double C21 = -1.7111E-6;
131  const double C22 = 2.5986E-8;
132  const double C23 = -2.5353E-10;
133  const double C24 = 1.0415E-12;
134  const double C30 = -9.7729E-9;
135  const double C31 = 3.8513E-10;
136  const double C32 = -2.3654E-12;
137  const double D00 = 1.727E-3;
138  const double D10 = -7.9836E-6;
139 
140  const double T2 = T * T;
141  const double T3 = T2 * T;
142  const double T4 = T3 * T;
143  const double T5 = T4 * T;
144 
145  const double P2 = P * P;
146  const double P3 = P2 * P;
147 
148  const double Cw =
149  (C00 + C01 * T + C02 * T2 + C03 * T3 + C04 * T4 + C05 * T5) +
150  (C10 + C11 * T + C12 * T2 + C13 * T3 + C14 * T4) * P +
151  (C20 + C21 * T + C22 * T2 + C23 * T3 + C24 * T4) * P2 +
152  (C30 + C31 * T + C32 * T2) * P3;
153 
154  const double A =
155  (A00 + A01 * T + A02 * T2 + A03 * T3 + A04 * T4) +
156  (A10 + A11 * T + A12 * T2 + A13 * T3 + A14 * T4) * P +
157  (A20 + A21 * T + A22 * T2 + A23 * T3) * P2 +
158  (A30 + A31 * T + A32 * T2) * P3;
159 
160  const double B = B00 + B01 * T + (B10 + B11 * T) * P;
161 
162  const double D = D00 + D10 * P;
163 
164  return Cw + A*S + B*S*sqrt(S) + D*S*S;
165  }
166 
167 
168  /**
169  * Get sound velocity.
170  *
171  * V.A. Del Grosso, New equation for the speed of sound in natural waters (with comparisons to other equations) (1974)\n
172  * J. Acoust. Soc. Am 56(4) pp 1084-1091
173  *
174  * G.S.K. Wong and S Zhu, Speed of sound in seawater as a function of salinity, temperature and pressure (1995)\n
175  * J. Acoust. Soc. Am. 97(3) pp 1732-1736
176  *
177  * \param p pressure [bar]
178  * \param S salinity [ppk]
179  * \param T temperature [C]
180  * \return sound velocity [m/s]
181  */
182  inline double getVelocityDelGrosso(const double p, const double S, const double T)
183  {
184  const double C000 = 1402.392;
185  const double CT1 = 0.5012285E1;
186  const double CT2 = -0.551184E-1;
187  const double CT3 = 0.221649E-3;
188  const double CS1 = 0.1329530E1;
189  const double CS2 = 0.1288598E-3;
190  const double CP1 = 0.1560592;
191  const double CP2 = 0.2449993E-4;
192  const double CP3 = -0.8833959E-8;
193  const double CST = -0.1275936E-1;
194  const double CTP = 0.6353509E-2;
195  const double CT2P2 = 0.2656174E-7;
196  const double CTP2 = -0.1593895E-5;
197  const double CTP3 = 0.5222483E-9;
198  const double CT3P = -0.4383615E-6;
199  const double CS2P2 = -0.1616745E-8;
200  const double CST2 = 0.9688441E-4;
201  const double CS2TP = 0.4857614E-5;
202  const double CSTP = -0.3406824E-3;
203 
204  // 1 bar = 100 kPa = 1.019716 kg/cm^2.
205 
206  const double f = 1.019716;
207  const double P = p * f;
208 
209  const double T2 = T * T;
210  const double T3 = T2 * T;
211 
212  const double S2 = S * S;
213 
214  const double P2 = P * P;
215  const double P3 = P2 * P;
216 
217  const double DCT = CT1 * T + CT2 * T2 + CT3 * T3;
218  const double DCS = CS1 * S + CS2 * S2;
219  const double DCP = CP1 * P + CP2 * P2 + CP3 * P3;
220  const double DCSTP = CTP * T*P + CT3P * T3*P + CTP2 * T*P2 + CT2P2 * T2*P2 + CTP3 * T*P3 + CST * S*T + CST2 * S*T2 + CSTP * S*T*P + CS2TP * S2*T*P + CS2P2 * S2*P2;
221 
222  return C000 + DCT + DCS + DCP + DCSTP;
223  }
224 
225 
226  /**
227  * Get depth.
228  *
229  * Claude C. Leroy and Francois Parthiot, Depth-pressure relationships in the oceans and seas\n
230  * J. Acoust. Soc. Am. 103(3), pp 1346-1352
231  *
232  * \param P pressure [MPa]
233  * \param phi latitude [deg]
234  * \param option option for Mediterranean
235  * \return depth [m]
236  */
237  inline double getDepth(const double P, const double phi, const bool option = true)
238  {
239  const double sd = sin(phi * PI / 180.0);
240  const double g = 9.780318 * (1.0 + 5.2788e-3 * sd*sd + 2.363e-5 * sd*sd*sd*sd);
241  const double z = (9.72659e2 * P - 2.2512e-1 * P*P + 2.279e-4 * P*P*P - 1.82e-7 * P*P*P*P) / (g + 1.092e-4 * P);
242  const double dz = -7e-2 * P + 2e-3* (P*P);
243 
244  return z + (option ? dz : 0.0);
245  }
246 
247 
248  /**
249  * Get pressure.
250  *
251  * Claude C. Leroy and Francois Parthiot, Depth-pressure relationships in the oceans and seas\n
252  * J. Acoust. Soc. Am. 103(3), pp 1346-1352
253  *
254  * \param z depth [m]
255  * \param phi latitude [deg]
256  * \param option option for Mediterranean
257  * \return pressure [MPa]
258  */
259  inline double getPressure(const double z, const double phi, const bool option = true)
260  {
261  const double sd = sin(phi * PI / 180.0);
262  const double g = 9.78031 * (1.0 + 5.3e-3 * sd*sd);
263  const double h45 = 1.00818e-2 * z + 2.465e-8 * z*z - 1.25e-13 * z*z*z + 2.8e-19 * z*z*z*z;
264  const double k = (g - 2e-5*z) / (9.80612 - 2e-5 * z);
265  const double dp = -8.5e-6 * z + 1.4e-9 * z*z;
266 
267  return h45 * k - (option ? dp : 0.0);
268  }
269 }
270 
271 #endif
Mathematical constants.
Auxiliary classes and methods for acoustic position calibration.
double getPressure(const double z, const double phi, const bool option=true)
Get pressure.
Definition: JUNESCO.hh:259
double getVelocityDelGrosso(const double p, const double S, const double T)
Get sound velocity.
Definition: JUNESCO.hh:182
double getGravity(const double phi)
Get gravitational constant.
Definition: JUNESCO.hh:25
double getVelocityCoppens(const double D, const double S, const double T)
Get sound velocity.
Definition: JUNESCO.hh:71
double getVelocityMackenzie(const double D, const double S, const double T)
Get sound velocity.
Definition: JUNESCO.hh:46
double getDepth(const double P, const double phi, const bool option=true)
Get depth.
Definition: JUNESCO.hh:237
double getVelocityUNESCO(const double P, const double S, const double T)
Get sound velocity.
Definition: JUNESCO.hh:95
static const double PI
Mathematical constants.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).