海水の比熱 | 海洋観測

海水の比熱は空気の約4倍で、大気の総量と海水の総量まで加味すると、海水全体の熱容量は大気全体の1000倍ともいわれています。したがって大気と違い海水温の変化は緩やかです。通常私たちが気に掛ける気温の変化は、1℃または0.1℃単位です。これを海洋に当てはめた場合、0.01℃または0.001℃単位の変化を捉える必要があるということになります。したがって海洋観測では、非常に高精度で高速応答の温度センサーが必要となるのです。

目次

比熱の計算式

  • 本計算式の定義は古く、現在の温度の定義ITS-90とは異なるIPTS-68の時代のものです。このため本計算を行うためには、ITS-90とIPTS-68の温度換算が必要です。本ページ内において「$T$」はITS-90の温度を、「$t$」はIPTS-68の温度を表します。
  • 1MPa = 100dbar ≒ 100m

実用塩分を$S$、水温を$T$ [℃]、圧力を$P$ [dbar]とすると、海水中の比熱$C_{P}$ [J/(kg・℃)]は下記式1により求められます。

$ \begin{aligned}
C_{P}(S, t, p) &= C_{P}(S, t, 0) + \Delta_{1} C_{P}(0, t, p) + \Delta_{2} C_{P}(S, t, p) \\
t &= 1.00024 \cdot T \\
p &= P / 10 \\
C_{P}(S, t, 0) &= C_{P}(0, t, 0) + A \cdot S + B \cdot S^{3/2} \\
C_{P}(0, t, 0) &= C_{0} + C_{1} \cdot t + C_{2} \cdot t^{2} + C_{3} \cdot t^{3} + C_{4} \cdot t^{4} \\
A &= a_{0} + a_{1} \cdot t + a_{2} \cdot t^{2} \\
B &= b_{0} + b_{1} \cdot t + b_{2} \cdot t^{2} \\
\Delta_{1} C_{P}(0, t, p) &= \left( d_{0} + d_{1} \cdot t + d_{2} \cdot t^{2} + d_{3} \cdot t^{3} + d_{4} \cdot t^{4} \right) \cdot p \\
& + \left( e_{0} + e_{1} \cdot t + e_{2} \cdot t^{2} + e_{3} \cdot t^{3} + e_{4} \cdot t^{4} \right) \cdot p^{2} \\
& + \left( f_{0} + f_{1} \cdot t + f_{2} \cdot t^{2} + f_{3} \cdot t^{3} \right) \cdot p^{3} \\
\Delta_{2} C_{P}(S, t, p) &= \left\{ \left( g_{0} + g_{1} \cdot t + g_{2} \cdot t^{2} + g_{3} \cdot t^{3} + g_{4} \cdot t^{4} \right) \cdot S + \left( h_{0} + h_{1} \cdot t + h_{2} \cdot t^{2} \right) \cdot S^{3/2} \right\} \cdot p \\
& + \left\{ \left( i_{0} + i_{1} \cdot t + i_{2} \cdot t^{2} + i_{3} \cdot t^{3} \right) \cdot S + j \cdot S^{3/2} \right\} \cdot p^{2} \\
& + \left\{ \left( k_{0} + k_{1} \cdot t + k_{2} \cdot t^{2} \right) \cdot S + l \cdot t \cdot S^{3/2} \right\} \cdot p^{3}
\end{aligned} $

なお上記計算式で使用する係数は下記のとおりです。

$a_{0} = -7.643575$、$a_{1} = 0.1072763$、$a_{2} = -1.38385 \times 10^{-3}$
$b_{0} = 0.1770383$、$b_{1} = -4.07718 \times 10^{-3}$、$b_{2} = 5.148 \times 10^{-5}$
$c_{0} = 4217.4$、$c_{1} = -3.720283$、$c_{2} = 0.1412855$、$c_{3} = -2.654387 \times 10^{-3}$、$c_{4} = 2.093236 \times 10^{-5}$
$d_{0} = -4.9592 \times 10^{-1}$、$d_{1} = 1.45747 \times 10^{-2}$、$d_{2} = -3.13885 \times 10^{-4}$、$d_{3} = 2.0357 \times 10^{-6}$、$d_{4} = 1.7168 \times 10^{-8}$
$e_{0} = 2.4931 \times 10^{-4}$、$e_{1} = -1.08645 \times 10^{-5}$、$e_{2} = 2.87533 \times 10^{-7}$、$e_{3} = -4.0027 \times 10^{-9}$、$e_{4} = 2.2956 \times 10^{-11}$
$f_{0} = -5.422 \times 10^{-8}$、$f_{1} = 2.6380 \times 10^{-9}$、$f_{2} = -6.5637 \times 10^{-11}$、$f_{3}= 6.136 \times 10^{-13}$
$g_{0} = 4.9247 \times 10^{-3}$、$g_{1} = -1.28315 \times 10^{-4}$、$g_{2} = 9.802 \times 10^{-7}$、$g_{3} = 2.5941 \times 10^{-8}$
$g_{4} = -2.9179 \times 10^{-10}$
$h_{0} = -1.2331 \times 10^{-4}$、$h_{1} = -1.517 \times 10^{-6}$、$h_{2} = 3.122 \times 10^{-8}$
$i_{0} = -2.9558 \times 10^{-6}$、$i_{1} = 1.17054 \times 10^{-7}$、$i_{2} = -2.3905 \times 10^{-9}$、$i_{3} = 1.8448 \times 10^{-11}$
$j = 9.971 \times 10^{-8}$
$k_{0} = 5.540 \times 10^{-10}$、$k_{1} = -1.7682 \times 10^{-11}$、$k_{2} = 3.513 \times 10^{-13}$
$l = -1.4300 \times 10^{-12}$

なお上記式は実用塩分$S$が0~40、水温$t$が0~35℃の範囲で有効です。

計算例
スクロールできます
$S$$t$ [℃]$P$ [dbar]$C_P$ [J/(kg・℃)]
25004048.4
2510100003842.3
35003986.5
3530100003844.3

サンプルコード

[specific_heat.c]

/**
 * @file specific_heat.c
 * @brief 海水の比熱の計算
 * @brief 1MPa = 100dbar
 */

//------------------------------------------------------------------------------
// include
//------------------------------------------------------------------------------
#include <math.h>

#include "specific_heat.h"

/** ----------------------------------------------------------------------------
 * @brief 海水の比熱の計算
 * @details UNESCO (1983) "Specific Heat of Seawater"
 *
 * @param temp : 水温[℃] (ITS-90) [0 - 35 (IPST-68)]
 * @param sal : 塩分 [0 - 40]
 * @param press : 圧力[dbar]
 * @return 比熱[J/(kg・℃)]
 */
double Calc_SpecificHeat(double temp, double sal, double press)
{
  double cp, cp0, dcp1, dcp2;
  double aa, bb, cc, dd, ee, ff, gg, hh, ii, kk;
  double sal15;
  double t, t2, t3, t4;
  double p, p2, p3;

  static const double a[3] = {-7.643575, 0.1072763, -1.38385e-3};
  static const double b[3] = {0.1770383, -4.07718e-3, 5.148e-5};
  static const double c[5] = {4217.4, -3.720283, 0.1412855, -2.654387e-3, 2.093236e-5};
  static const double d[5] = {-4.9592e-1, 1.45747e-2, -3.13885e-4, 2.0357e-6, 1.7168e-8};
  static const double e[5] = {2.4931e-4, -1.08645e-5, 2.87533e-7, -4.0027e-9, 2.2956e-11};
  static const double f[4] = {-5.422e-8, 2.6380e-9, -6.5637e-11, 6.136e-13};
  static const double g[5] = {4.9247e-3, -1.28315e-4, 9.802e-7, 2.5941e-8, -2.9179e-10};
  static const double h[3] = {-1.2331e-4, -1.517e-6, 3.122e-8};
  static const double i[4] = {-2.9558e-6, 1.17054e-7, -2.3905e-9, 1.8448e-11};
  static const double j    = 9.971e-8;
  static const double k[3] = {5.540e-10, -1.7682e-11, 3.513e-13};
  static const double l    = -1.4300e-12;

  t     = temp * 1.00024;
  p     = press / 10.0;
  sal15 = sqrt(sal) * sal;

  t2 = t * t;
  t3 = t2 * t;
  t4 = t3 * t;
  p2 = p * p;
  p3 = p2 * p;

  aa = a[0] + a[1] * t + a[2] * t2;
  bb = b[0] + b[1] * t + b[2] * t2;
  cc = c[0] + c[1] * t + c[2] * t2 + c[3] * t3 + c[4] * t4;
  dd = d[0] + d[1] * t + d[2] * t2 + d[3] * t3 + d[4] * t4;
  ee = e[0] + e[1] * t + e[2] * t2 + e[3] * t3 + e[4] * t4;
  ff = f[0] + f[1] * t + f[2] * t2 + f[3] * t3;
  gg = g[0] + g[1] * t + g[2] * t2 + g[3] * t3 + g[4] * t4;
  hh = h[0] + h[1] * t + h[2] * t2;
  ii = i[0] + i[1] * t + i[2] * t2 + i[3] * t3;
  kk = k[0] + k[1] * t + k[2] * t2;

  dcp2 = (gg * sal + hh * sal15) * p + (ii * sal + j * sal15) * p2 + (kk * sal + l * t * sal15) * p3;
  dcp1 = dd * p + ee * p2 + ff * p3;
  cp0  = cc + aa * sal + bb * sal15;
  cp   = cp0 + dcp1 + dcp2;

  return cp;
}

[specific_heat.h]

#ifndef SPECIFIC_HEAT_H
#define SPECIFIC_HEAT_H

#ifdef __cplusplus
extern "C" {
#endif

//------------------------------------------------------------------------------
// function
//------------------------------------------------------------------------------
double Calc_SpecificHeat(double temp, double sal, double press);

#ifdef __cplusplus
}
#endif

#endif

サンプルコードの使用例

使用例代わりに、CppUTestによるテストコードを掲載しておきます。

#include "CppUTest/TestHarness.h"

#include "specific_heat.h"

// clang-format off
TEST_GROUP(specific_heat){
  TEST_SETUP(){
  }

  TEST_TEARDOWN(){
  }
};
// clang-format on

TEST(specific_heat, Test_specific_heat)
{
  double cp;

  cp = Calc_SpecificHeat(0.0, 25.0, 0.0);
  DOUBLES_EQUAL(cp, 4048.4, 5e-2);

  cp = Calc_SpecificHeat(10.0, 25.0, 10000.0);
  DOUBLES_EQUAL(cp, 3842.3, 5e-2);

  cp = Calc_SpecificHeat(0.0, 35.0, 0.0);
  DOUBLES_EQUAL(cp, 3986.5, 5e-2);

  cp = Calc_SpecificHeat(30.0, 35.0, 10000.0);
  DOUBLES_EQUAL(cp, 3844.3, 5e-2);
}

脚注

  1. UNESCO (1983) “Specific Heat of Seawater” Unesco technical papers in marine science No.44 ↩︎

コメント

コメントする

CAPTCHA


目次