海水中では電波や光は減衰してしまい遠くまで伝搬しません。このため海では昔から音波がよく用いられています。分かりやすいところでは潜水艦や魚群探知機で用いられているソナーです。音の反射で周囲に物体がないか、あるならそれまでの距離は?形は?そのような基本的な情報が得られます。またその他でも、ドップラー効果により流速を測定したり、近年では音波による長距離通信も実用化されています。
音速の計算
- 本計算式の定義は古く、現在の温度の定義ITS-90とは異なるIPTS-68の時代のものです。このため本計算を行うためには、ITS-90とIPTS-68の温度換算が必要です。本ページ内において「$T$」はITS-90の温度を、「$t$」はIPTS-68の温度を表します。
- 1MPa = 100dbar ≒ 100m
水温を$T$ [℃]、圧力を$P$ [dbar]、実用塩分を$S$とすると、海水中の音速$V$ [m/s]は下記式1により求められます。
$ \begin{aligned}
V(S, t, p) &= C_W + A \cdot S + B \cdot S^{3/2} + D \cdot S^{2} \\
t &= 1.00024 \cdot T \\
p &= P / 10 \\
C_{W} &= C_{00} + C_{01} \cdot t + C_{02} \cdot t^{2} + C_{03} \cdot t^{3} + C_{04} \cdot t^{4} + C_{05} \cdot t^{5} \\
& + \left( C_{10} + C_{11} \cdot t + C_{12} \cdot t^{2} + C_{13} \cdot t^{3} + C_{14} \cdot t^{4} \right) \cdot p \\
& + \left( C_{20} + C_{21} \cdot t + C_{22} \cdot t^{2} + C_{23} \cdot t^{3} + C_{24} \cdot t^{4} \right) \cdot p^{2} \\
& + \left( C_{30} + C_{31} \cdot t + C_{32} \cdot t^{2} \right) \cdot p^{3} \\
A &= A_{00} + A_{01} \cdot t + A_{02} \cdot t^{2} + A_{03} \cdot t^{3} + A_{04} \cdot t^{4} \\
& + \left( A_{10} + A_{11} \cdot t + A_{12} \cdot t^{2} + A_{13} \cdot t^{3} + A_{14} \cdot t^{4} \right) \cdot p \\
& + \left( A_{20} + A_{21} \cdot t + A_{22} \cdot t^{2} + A_{23} \cdot t^{3} \right) \cdot p^{2} \\
& + \left( A_{30} + A_{31} \cdot t + A_{32} \cdot t^{2} \right) \cdot p^{3} \\
B &= B_{00} + B_{01} \cdot t + \left( B_{10} + B_{11} \cdot t \right) \cdot p \\
D &= D_{00} + D_{10} \cdot p
\end{aligned} $
なお上記計算式で使用する係数は下記のとおりです。
$A_{00} = 1.389$、$A_{01} = -1.262 \times 10^{-2}$、$A_{02} = 7.164 \times 10^{-5}$、$A_{03} = 2.006 \times 10^{-6}$、$A_{04} = -3.21 \times 10^{-8}$
$A_{10} = 9.4742 \times 10^{-5}$、$A_{11} = -1.2580 \times 10^{-5}$、$A_{12} = -6.4885 \times 10^{-8}$、$A_{13} = 1.0507 \times 10^{-8}$、$A_{14} = -2.0122 \times 10^{-10}$
$A_{20} = -3.9064 \times 10^{-7}$、$A_{21} = 9.1041 \times 10^{-9}$、$A_{22} = -1.6002 \times 10^{-10}$、$A_{23} = 7.988 \times 10^{-12}$
$A_{30} = 1.100 \times 10^{-10}$、$A_{31} = 6.649 \times 10^{-12}$、$A_{32} = -3.389 \times 10^{-13}$
$B_{00} = -1.922 \times 10^{-2}$、$B_{01} = -4.42 \times 10^{-5}$
$B_{10} = 7.3637 \times 10^{-5}$、$B_{11} = 1.7945 \times 10^{-7}$
$C_{00} = 1402.388$、$C_{01} = 5.03711$、$C_{02} = -5.80852 \times 10^{-2}$、$C_{03} = 3.3420 \times 10^{-4}$、$C_{04} = -1.47800 \times 10^{-6}$、$C_{05} = 3.1464 \times 10^{-9}$
$C_{10} = 0.153563$、$C_{11} = 6.8982 \times 10^{-4}$、$C_{12} = -8.1788 \times 10^{-6}$、$C_{13} = 1.3621 \times 10^{-7}$、$C_{14} = -6.1185 \times 10^{-10}$
$C_{20} = 3.1260 \times 10^{-5}$、$C_{21} = -1.7107 \times 10^{-6}$、$C_{22} = 2.5974 \times 10^{-8}$、$C_{23} = -2.5335 \times 10^{-10}$、$C_{24} = 1.0405 \times 10^{-12}$
$C_{30} = -9.7729 \times 10^{-9}$、$C_{31} = 3.8504 \times 10^{-10}$、$C_{32} = -2.3643 \times 10^{-12}$
$D_{00} = 1.727 \times 10^{-3}$、$D_{10} = -7.9836 \times 10^{-6}$
なお上記式は水温$t$が0~40℃、圧力$P$が0~10,000dbar、実用塩分$S$が0~40の範囲で有効です。
$S$ | $t$ [℃] | $P$ [dbar] | $V$ [m/s] |
---|---|---|---|
25 | 0 | 0 | 1435.8 |
25 | 20 | 10000 | 1676.8 |
35 | 0 | 0 | 1449.1 |
35 | 20 | 10000 | 1687.2 |
サンプルコード
[sound_speed.c]
/**
* @file sound_speed.c
* @brief 海水中の音速の計算
* @brief 1MPa = 100dbar
*/
//------------------------------------------------------------------------------
// include
//------------------------------------------------------------------------------
#include <math.h>
#include "sound_speed.h"
/** ----------------------------------------------------------------------------
* @brief 海水中の音速の計算
* @details UNESCO (1983) "Sound Speed in Seawater"
*
* @param temp : 水温[℃] (ITS-90) [0 - 40 (IPTS-68)]
* @param sal : 塩分 [0 - 40]
* @param press : 圧力[dbar] [0 - 10000]
* @return 音速[m/s]
*/
double Calc_SoundSpeed(double temp, double sal, double press)
{
static const double a0[5] = {1.389, -1.262e-2, 7.164e-5, 2.006e-6, -3.21e-8};
static const double a1[5] = {9.4742e-5, -1.2580e-5, -6.4885e-8, 1.0507e-8, -2.0122e-10};
static const double a2[4] = {-3.9064e-7, 9.1041e-9, -1.6002e-10, 7.988e-12};
static const double a3[3] = {1.100e-10, 6.649e-12, -3.389e-13};
static const double b0[2] = {-1.922e-2, -4.42e-5};
static const double b1[2] = {7.3637e-5, 1.7945e-7};
static const double c0[6] = {1402.388, 5.03711, -5.80852e-2, 3.3420e-4, -1.47800e-6, 3.1464e-9};
static const double c1[5] = {0.153563, 6.8982e-4, -8.1788e-6, 1.3621e-7, -6.1185e-10};
static const double c2[5] = {3.1260e-5, -1.7107e-6, 2.5974e-8, -2.5335e-10, 1.0405e-12};
static const double c3[3] = {-9.7729e-9, 3.8504e-10, -2.3643e-12};
static const double d00 = 1.727e-3;
static const double d10 = -7.9836e-6;
double v;
double t, t2, t3, t4, t5;
double p, p2, p3;
double aa, bb, cc, dd;
double aa0, aa1, aa2, aa3;
double bb0, bb1;
double cc0, cc1, cc2, cc3;
double sal15;
t = temp * 1.00024; // ITS-90 ⇒ IPTS-68
t2 = t * t;
t3 = t2 * t;
t4 = t3 * t;
t5 = t4 * t;
sal15 = sqrt(sal) * sal;
p = press / 10.0; // dbar ⇒ bar
p2 = p * p;
p3 = p2 * p;
aa0 = a0[0] + a0[1] * t + a0[2] * t2 + a0[3] * t3 + a0[4] * t4;
aa1 = a1[0] + a1[1] * t + a1[2] * t2 + a1[3] * t3 + a1[4] * t4;
aa2 = a2[0] + a2[1] * t + a2[2] * t2 + a2[3] * t3;
aa3 = a3[0] + a3[1] * t + a3[2] * t2;
bb0 = b0[0] + b0[1] * t;
bb1 = b1[0] + b1[1] * t;
cc0 = c0[0] + c0[1] * t + c0[2] * t2 + c0[3] * t3 + c0[4] * t4 + c0[5] * t5;
cc1 = c1[0] + c1[1] * t + c1[2] * t2 + c1[3] * t3 + c1[4] * t4;
cc2 = c2[0] + c2[1] * t + c2[2] * t2 + c2[3] * t3 + c2[4] * t4;
cc3 = c3[0] + c3[1] * t + c3[2] * t2;
aa = aa0 + aa1 * p + aa2 * p2 + aa3 * p3;
bb = bb0 + bb1 * p;
cc = cc0 + cc1 * p + cc2 * p2 + cc3 * p3;
dd = d00 + d10 * p;
v = cc + aa * sal + bb * sal15 + dd * sal * sal;
return v;
}
[sound_speed.h]
#ifndef SOUND_SPEED_H
#define SOUND_SPEED_H
#ifdef __cplusplus
extern "C" {
#endif
//------------------------------------------------------------------------------
// function
//------------------------------------------------------------------------------
double Calc_SoundSpeed(double temp, double sal, double press);
#ifdef __cplusplus
}
#endif
#endif
サンプルコードの使用例
使用例代わりに、CppUTestによるテストコードを掲載しておきます。
#include "CppUTest/TestHarness.h"
#include "sound_speed.h"
// clang-format off
TEST_GROUP(sound_speed){
TEST_SETUP(){
}
TEST_TEARDOWN(){
}
};
// clang-format on
TEST(sound_speed, Test_sound_speed)
{
double v;
v = Calc_SoundSpeed(0.0 * 0.99976, 25.0, 0.0);
DOUBLES_EQUAL(v, 1435.8, 5e-2);
v = Calc_SoundSpeed(20.0 * 0.99976, 25.0, 10000.0);
DOUBLES_EQUAL(v, 1676.8, 5e-2);
v = Calc_SoundSpeed(0.0 * 0.99976, 35.0, 0.0);
DOUBLES_EQUAL(v, 1449.1, 5e-2);
v = Calc_SoundSpeed(20.0 * 0.99976, 35.0, 10000.0);
DOUBLES_EQUAL(v, 1687.2, 5e-2);
}
脚注
- UNESCO (1983) “Sound Speed in Seawater” Unesco technical papers in marine science No.44 ↩︎
コメント