海水の氷点 | 海洋観測

海水は0℃では凍りません。これは塩分を多く含んでいるためで、海水の氷点(凍り始める温度)は約-1.8℃です。さらに海水の比熱は大気と比べて非常に大きいため、気温が真冬に-20℃になったとしても、海水温は4℃前後にまでしか下がらないのです。したがって基本的に海水は凍りません。

目次

氷点の計算式

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

圧力を$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$ [℃]
50-0.274
5500-0.650
300-1.638
30500-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);
}

脚注

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

コメント

コメントする

CAPTCHA


目次