海洋観測では距離(メートル)を直接測定することは困難なため、圧力で代用します。なお海洋観測では慣習的に圧力の単位に「dbar」を用いること、また海面の圧力を0dbarとするのが特徴です。海面は1気圧ではないのです。
- 1MPa = 100dbar ≒ 100m
深さによる区分
海は深さによっていくつかに区分されています。この区切り方に決まった定義はありませんが、おおむね次のように区切られます。
- 0~200m:表層
- 200~1000m:中層
- 1000~3000m:漸深層
- 3000~6000m:深海層
- 6000m~:超深海層
ここで一般的に、200mより深い海域を深海、浅い海域を表層と呼びます。水深200mにもなると真っ暗闇ですが、可視光以外の光は水深1000mほどまで届いており、光合成が可能といわれています。なお最深部はマリアナ海溝のチャレンジャー海淵で、その深さは1万920メートルとなります。
圧力から深度への換算式
圧力から深度(海面からの垂直距離)へ換算する計算式を紹介します。
淡水の場合
淡水の場合の、圧力から深度への換算は容易です。圧力を$P$ [dbar]とすると、深度$D$ [m]は下記式により求められます。
$D = 1.019716 \cdot P$
海水の場合
計算式
圧力を$P$ [dbar]、緯度を$L$ [°]とすると、深度$D$ [m]は下記式1により求められます。
$ \begin{aligned}
D &= \frac{ C_{1} \cdot P + C_{2} \cdot P^{2} + C_{3} \cdot P^{3} + C_{4} \cdot P^{4} }{ g +\displaystyle\frac{1}{2} \cdot \gamma’ \cdot P } + \frac{ \Delta D }{ 9.8 } \\
g &= 9.780318 \times \left( 1.0 + 5.2788 \times 10^{-3} \cdot x^{2} + 2.36 \times 10^{-5} \cdot x^{4}\right) \\
x &= \sin \left( \frac{L}{57.29578} \right)
\end{aligned} $
ここで$\Delta D$の項目は通常省略します。また上記計算式で使用する係数は、下記のとおりです。
$C_{1} = 9.72659$、$C_{2} = -2.2512 \times 10^{-5}$、$C_{3} = 2.279 \times 10^{-10}$、$C_{4} = -1.82 \times 10^{-15}$
$\gamma’ = 2.184 \times 10^{-6}$
$P$ [dbar] | $L$ [°] | ||||
---|---|---|---|---|---|
0 | 30 | 45 | 60 | 90 | |
1000 | 992.12 | 990.81 | 989.50 | 988.19 | 986.88 |
5000 | 4915.04 | 4908.56 | 4902.08 | 4895.60 | 4889.13 |
10000 | 9725.47 | 9712.65 | 9699.84 | 9687.03 | 9674.23 |
サンプルコード
[pressure.c]
/**
* @file pressure.c
* @brief 圧力計算
* @brief 1MPa = 100dbar
*/
//------------------------------------------------------------------------------
// include
//------------------------------------------------------------------------------
#include <float.h>
#include <math.h>
#include "pressure.h"
/** ----------------------------------------------------------------------------
* @brief 圧力から深度への換算 (淡水仕様)
*
* @param press : 圧力[dbar]
* @return 深度[m]
*/
double PressToDepth_Freshwater(double press)
{
double depth;
depth = press * 1.019716;
return depth;
}
/** ----------------------------------------------------------------------------
* @brief 圧力から深度への換算 (海水仕様)
* @details UNESCO (1983) "Pressure to Depth Conversion"
*
* @param press : 圧力[dbar]
* @param g : 重力加速度[m/s2] (Calc_GravityVariationで計算)
* @return 深度[m]
*/
double PressToDepth_Seawater(double press, double g)
{
static const double c[5] = {0.0, 9.72659, -2.2512e-5, 2.279e-10, -1.82e-15};
static const double kGamma = 2.184e-6;
double depth;
double p, p2, p3, p4;
double cc;
double tmp;
if (g < DBL_EPSILON) {
return 0.0;
}
p = press;
p2 = p * p;
p3 = p2 * p;
p4 = p3 * p;
cc = c[1] * p + c[2] * p2 + c[3] * p3 + c[4] * p4;
tmp = g + kGamma * p / 2.0;
if (fabs(tmp) < DBL_EPSILON) {
depth = 0.0;
} else {
depth = cc / tmp;
}
return depth;
}
/** ----------------------------------------------------------------------------
* @brief 重力加速度の計算
*
* @param latitude : 緯度[°]
* @return 重力加速度[m/s2]
*/
double Calc_GravityVariation(double latitude)
{
double g;
double x, x2, x4;
x = sin(latitude / 57.29578);
x2 = x * x;
x4 = x2 * x2;
g = 9.780318 * (1.0 + 5.2788e-3 * x2 + 2.36e-5 * x4);
return g;
}
[pressure.h]
#ifndef PRESSURE_H
#define PRESSURE_H
#ifdef __cplusplus
extern "C" {
#endif
//------------------------------------------------------------------------------
// function
//------------------------------------------------------------------------------
double PressToDepth_Freshwater(double press);
double PressToDepth_Seawater(double press, double g);
double Calc_GravityVariation(double latitude);
#ifdef __cplusplus
}
#endif
#endif
サンプルコードの使用例
使用例代わりに、CppUTestによるテストコードを掲載しておきます。
#include "CppUTest/TestHarness.h"
#include "pressure.h"
// clang-format off
TEST_GROUP(pressure){
TEST_SETUP(){
}
TEST_TEARDOWN(){
}
};
// clang-format on
TEST(pressure, Test_freshwater)
{
double depth;
depth = PressToDepth_Freshwater(100.0);
DOUBLES_EQUAL(depth, 101.9716, 5e-5);
}
TEST(pressure, Test_seawater)
{
double depth, g;
g = Calc_GravityVariation(0.0);
depth = PressToDepth_Seawater(500.0, g);
DOUBLES_EQUAL(depth, 496.65, 5e-3);
g = Calc_GravityVariation(45.0);
depth = PressToDepth_Seawater(500.0, g);
DOUBLES_EQUAL(depth, 495.34, 5e-3);
g = Calc_GravityVariation(90.0);
depth = PressToDepth_Seawater(500.0, g);
DOUBLES_EQUAL(depth, 494.03, 5e-3);
g = Calc_GravityVariation(0.0);
depth = PressToDepth_Seawater(10000.0, g);
DOUBLES_EQUAL(depth, 9725.47, 5e-3);
g = Calc_GravityVariation(90.0);
depth = PressToDepth_Seawater(10000.0, g);
DOUBLES_EQUAL(depth, 9674.23, 5e-3);
}
脚注
- UNESCO (1983) “Pressure to Depth Conversion” Unesco technical papers in marine science No.44 ↩︎