塩分の測定が海洋観測の基本 | 海洋観測

塩分は水温とともに海水の状態を表す最も基本的な物性の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.0015035.000000
1.2020200037.245628
0.655150027.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);
}

脚注

  1. UNESCO (1983) “Conductivity Ratio to Salinity Conversion” Unesco technical papers in marine science No.44 ↩︎
  2. 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 ↩︎
目次