海水は0℃では凍りません。これは塩分を多く含んでいるためで、海水の氷点(凍り始める温度)は約-1.8℃です。さらに海水の比熱は大気と比べて非常に大きいため、気温が真冬に-20℃になったとしても、海水温は4℃前後にまでしか下がらないのです。したがって基本的に海水は凍りません。
海水の比熱 | 海洋観測
海水の比熱は空気の約4倍で、大気の総量と海水の総量まで加味すると、海水全体の熱容量は大気全体の1000倍ともいわれています。したがって大気と違い海水温の変化は緩や…
目次
氷点の計算式
- 本計算式の定義は古く、現在の温度の定義ITS-90とは異なるIPTS-68の時代のものです。このため本計算を行うためには、ITS-90とIPTS-68の温度換算が必要です。本ページ内において「$T$」はITS-90の温度を、「$t$」はIPTS-68の温度を表します。
- 1MPa = 100dbar ≒ 100m
水温の定義 | 海洋観測
ITS-90とIPTS-68 海水の温度は圧力、塩分とともに海水の状態を調べるための最も基本的な要素です。 温度の定義は実は何度か変わっています。現在温度というとITS-90(In…
圧力を$P$ [dbar]、実用塩分を$S$とすると、氷点$T$ [℃]は下記式1により求められます。
$ \begin{aligned}
T &= 0.99976 \cdot t \\
t &= a_{0} \cdot S + a_{1} \cdot S^{3/2} + a_{2} \cdot S^{2} + b \cdot P
\end{aligned} $
上記計算式で使用する係数は下記のとおりです。
$a_{0} = -0.0575$、$a_{1} = 1.710523 \times 10^{-3}$、$a_{2} = -2.154996 \times 10^{-4}$
$b = -7.53 \times 10^{-4}$
なお上記式は大気圧下で実用塩分$S$が4~40の範囲で有効です。
計算例
スクロールできます
$S$ | $P$ [dbar] | $t$ [℃] |
---|---|---|
5 | 0 | -0.274 |
5 | 500 | -0.650 |
30 | 0 | -1.638 |
30 | 500 | -2.014 |
サンプルコード
[freezing_point.c]
/**
* @file freezing_point.c
* @brief 海水の氷点の計算
* @brief 1MPa = 100dbar
*/
//------------------------------------------------------------------------------
// include
//------------------------------------------------------------------------------
#include <math.h>
#include "freezing_point.h"
/** ----------------------------------------------------------------------------
* @brief 海水の氷点の計算
* @details UNESCO (1983) "Freezing Point Temperature of Seawater"
*
* @param sal : 塩分
* @param press : 圧力[dbar]
* @return 氷点[℃] (ITS-90)
*/
double Calc_FreezingPoint(double sal, double press)
{
static const double a[3] = {-0.0575, 1.710523e-3, -2.154996e-4};
static const double b = -7.53e-4;
double temp, sal15;
sal15 = sqrt(sal) * sal;
temp = a[0] * sal + a[1] * sal15 + a[2] * sal * sal + b * press;
temp *= 0.99976;
return temp;
}
[freezing_point.h]
#ifndef FREEZING_POINT_H
#define FREEZING_POINT_H
#ifdef __cplusplus
extern "C" {
#endif
//------------------------------------------------------------------------------
// function
//------------------------------------------------------------------------------
double Calc_FreezingPoint(double sal, double press);
#ifdef __cplusplus
}
#endif
#endif
サンプルコードの使用例
使用例代わりに、CppUTestによるテストコードを掲載しておきます。
#include "CppUTest/TestHarness.h"
#include "freezing_point.h"
// clang-format off
TEST_GROUP(freezing_point){
TEST_SETUP(){
}
TEST_TEARDOWN(){
}
};
// clang-format on
TEST(freezing_point, Test_freezing_point)
{
double temp;
temp = Calc_FreezingPoint(5.0, 0.0);
DOUBLES_EQUAL(temp, -0.274 * 0.99976, 5e-4);
temp = Calc_FreezingPoint(5.0, 500.0);
DOUBLES_EQUAL(temp, -0.650 * 0.99976, 5e-4);
temp = Calc_FreezingPoint(30.0, 0.0);
DOUBLES_EQUAL(temp, -1.638 * 0.99976, 5e-4);
temp = Calc_FreezingPoint(30.0, 500.0);
DOUBLES_EQUAL(temp, -2.014 * 0.99976, 5e-4);
}
脚注
- UNESCO (1983) “Freezing Point Temperature of Seawater” Unesco technical papers in marine science No.44 ↩︎
コメント