海水の比熱は空気の約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・℃)] |
---|---|---|---|
25 | 0 | 0 | 4048.4 |
25 | 10 | 10000 | 3842.3 |
35 | 0 | 0 | 3986.5 |
35 | 30 | 10000 | 3844.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);
}
脚注
- UNESCO (1983) “Specific Heat of Seawater” Unesco technical papers in marine science No.44 ↩︎
コメント