塩分は水温とともに海水の状態を表す最も基本的な物性の1つで、海水1kg中に含まれる固形物質の全量で表されます。
実際に溶存物質を直接測定することは困難なため、PSS-78標準溶液(1kg中に32.4356gの塩化カリウムを含んだ水溶液)との電気伝導度比から塩分を求めるのが一般的で、これを実用塩分といいます。実用塩分は無単位ですが、慣習的に「PSU(Pratical Salinity Unit)」を用いる場合もあります。
現在塩分を最も正確に測定する方法としては、現場の海水を採水し、Guildline Instrumet社のAUTOSALで標準海水と比較することになると思います。しかし現実としてそんなことはできないため、電気伝導度・水温・圧力の各センサーを搭載した計測器で海水を測定し、以降に示す計算式で実用塩分を求めるのが一般的です。このため海洋観測において最も重要な電気伝導度(conductivity)・水温(temperature)・圧力(depth/pressure)の3センサーを搭載した計測器に、その頭文字を取ってCTDと名付けることが多くあります。
実用塩分の計算式
- 本計算式の定義は古く、現在の温度の定義ITS-90とは異なるIPTS-68の時代のものです。このため本計算を行うためには、ITS-90とIPTS-68の温度換算が必要です。本ページ内において「$T$」はITS-90の温度を、「$t$」はIPTS-68の温度を表します。
- 1MPa = 100dbar ≒ 100m
水温を$T$ [℃]、圧力を$P$ [dbar]、電気伝導度を$C$ [mS/cm]とすると、実用塩分$S$は下記式1により求められます。
$ \begin{aligned}
S &= \sum_{f=0}^{5} \left( a_{f} \cdot R_{t}^{f/2} \right) + \frac{ t – 15 }{ 1 + k \cdot ( t – 15 ) }\cdot \sum_{f = 0}^{5} \left( b_{f} \cdot R_{t}^{f/2} \right) \\
t &= 1.00024 \cdot T \\
R_{t} &= \frac{ R }{ R_{p} \cdot r_{t} } \\
R &= \frac{ C }{ C(35, 15, 0) } \\
R_{p} &= 1 + \frac{ P \cdot \left( e_{1} + e_{2} \cdot P + e_{3} \cdot P^{2} \right) }{ 1 + d_{1} \cdot t+ d_{2} \cdot t^{2} + ( d_{3} + d_{4} \cdot t ) \cdot R } \\
r_{t} &= c_{0} + c_{1} \cdot t + c_{2} \cdot t^{2} + c_{3} \cdot t^{3} + c_{4} \cdot t^{4}
\end{aligned} $
上記計算式で使用する係数は下記のとおりです。
$a_{0} = 0.0080$、$a_{1} = -0.1692$、$a_{2} = 25.3851$、$a_{3} = 14.0941$、$a_{4} = -7.0261$、$a_{5} = 2.7081$
$b_{0} = 0.0005$、$b_{1} = -0.0056$、$b_{2} = -0.0066$、$b_{3} = -0.0375$、$b_{4} = 0.0636$、$b_{5} = -0.0144$
$c_{0} = 0.6766097$、$c_{1} = 2.00564 \times 10^{-2}$、$c_{2} = 1.104259 \times 10^{-4}$、$c_{3} = -6.9698 \times10^{-7}$
$d_{1} = 3.426 \times 10^{-2}$、$d_{2} = 4.464 \times 10^{-4}$、$d_{3} = 4.215 \times 10^{-1}$、$d_{4} = -3.107 \times 10^{-3}$
$e_{1} = 2.070 \times 10^{-5}$、$e_{2} = -6.370 \times 10^{-10}$、$e_{3} = 3.989 \times 10^{-15}$
$k = 0.0162$
$C(35, 15, 0) = 42.914$2
なお上記式は水温$t$が-2~35℃、圧力$P$が0~10,000dbar、実用塩分$S$が2~42の範囲で有効です。
$R$ | $t$ [℃] | $P$ [dbar] | $S$ |
---|---|---|---|
1.00 | 15 | 0 | 35.000000 |
1.20 | 20 | 2000 | 37.245628 |
0.65 | 5 | 1500 | 27.995347 |
サンプルコード
[salinity.c]
/**
* @file salinity.c
* @brief 塩分計算
* @brief 1MPa = 100dbar
*/
//------------------------------------------------------------------------------
// include
//------------------------------------------------------------------------------
#include <float.h>
#include <math.h>
#include "salinity.h"
/** ----------------------------------------------------------------------------
* @brief 塩分の計算 (PSS-78)
* @details UNESCO (1983) "Conductivity Ratio to Salinity Conversion"
*
* @param temp : 水温[℃] (ITS-90) [-2 - 35 (IPTS-68)]
* @param cond : 電気伝導度[mS/cm]
* @param press : 圧力[dbar] [0 - 10000]
* @return 塩分 [2 - 42]
*/
double Calc_Salinity(double temp, double cond, double press)
{
static const double a[6] = {0.0080, -0.1692, 25.3851, 14.0941, -7.0261, 2.7081};
static const double b[6] = {0.0005, -0.0056, -0.0066, -0.0375, 0.0636, -0.0144};
static const double c[5] = {0.6766097, 2.00564e-2, 1.104259e-4, -6.9698e-7, 1.0031e-9};
static const double d[5] = {0.0, 3.426e-2, 4.464e-4, 4.215e-1, -3.107e-3};
static const double e[4] = {0.0, 2.070e-5, -6.370e-10, 3.989e-15};
static const double k = 0.0162;
double r, rp;
double rt, rt2, rt3, rt4, rt5;
double sal, tmp;
double t, t2, t3, t4;
double p, p2;
double aa, bb, cc, dd, ee;
if (cond < DBL_EPSILON) {
return 0.0;
}
p = press;
if (p < DBL_EPSILON) {
p = 0.0;
}
p2 = p * p;
t = temp * 1.00024; // ITS-90 ⇒ IPTS-68
t2 = t * t;
t3 = t2 * t;
t4 = t3 * t;
r = cond / 42.914; // Culkin and Smith (1980)
cc = c[0] + c[1] * t + c[2] * t2 + c[3] * t3 + c[4] * t4;
dd = 1.0 + d[1] * t + d[2] * t2 + (d[3] + d[4] * t) * r;
ee = e[1] + e[2] * p + e[3] * p2;
if (fabs(dd) < DBL_EPSILON) {
rp = 1.0;
} else {
rp = 1.0 + (ee * p) / dd;
}
rt = cc;
if ((fabs(rp) < DBL_EPSILON) || (fabs(rt) < DBL_EPSILON)) {
rt = 0.0;
} else {
rt = r / rp / rt;
}
if (rt < DBL_EPSILON) {
return 0.0;
}
rt2 = rt;
rt = sqrt(rt);
rt3 = rt2 * rt;
rt4 = rt3 * rt;
rt5 = rt4 * rt;
aa = a[0] + a[1] * rt + a[2] * rt2 + a[3] * rt3 + a[4] * rt4 + a[5] * rt5;
bb = b[0] + b[1] * rt + b[2] * rt2 + b[3] * rt3 + b[4] * rt4 + b[5] * rt5;
tmp = 1.0 + k * (t - 15.0);
if (fabs(tmp) < DBL_EPSILON) {
sal = aa;
} else {
sal = aa + (t - 15.0) / tmp * bb;
}
if (sal < DBL_EPSILON) {
sal = 0.0;
}
return sal;
}
[salinity.h]
#ifndef SALINITY_H
#define SALINITY_H
#ifdef __cplusplus
extern "C" {
#endif
//------------------------------------------------------------------------------
// function
//------------------------------------------------------------------------------
double Calc_Salinity(double temp, double cond, double press);
#ifdef __cplusplus
}
#endif
#endif
サンプルコードの使用例
使用例代わりに、CppUTestによるテストコードを掲載しておきます。
#include "CppUTest/TestHarness.h"
#include "salinity.h"
// clang-format off
TEST_GROUP(salinity){
TEST_SETUP(){
}
TEST_TEARDOWN(){
}
};
// clang-format on
TEST(salinity, Test_salinity)
{
double sal;
sal = Calc_Salinity(15.0 / 1.00024, 42.914, 0.0);
DOUBLES_EQUAL(sal, 35.0, 5e-7);
sal = Calc_Salinity(20.0 / 1.00024, 42.914 * 1.20, 2000.0);
DOUBLES_EQUAL(sal, 37.245628, 5e-7);
sal = Calc_Salinity(5.0 / 1.00024, 42.914 * 0.65, 1500.0);
DOUBLES_EQUAL(sal, 27.995347, 5e-7);
}
脚注
- UNESCO (1983) “Conductivity Ratio to Salinity Conversion” Unesco technical papers in marine science No.44 ↩︎
- Culkin and Smith (1980) “Determination of the concentration of potassium chloride solution having the same electrical conductivity, at 15℃ and infinite frequency, as standard seawater of salinity 35.0000‰ (chlorinity 19.37394‰)” IEEE J. Oceanic Eng., 5 ↩︎