はじめに
気象モデルの高解像度な(例えば、東西10240 x 南北5120 x 鉛直18くらいの)出力結果のnetCDFファイルは、見たい現象の空間スケールと比べて細かい場合は、サイズが大きくデータの取り扱いが大変であったりします。こうしたデータは水平格子を粗くして解析することがあります。
netCDFのデータの解像度変換を行う方法には色々ありますが、ここではCDO (Climate Data Operators) という便利なコマンドラインツールを使って簡単に行う方法を紹介します。
インストール
LinuxやIntel Macの場合、Anaconda(Miniconda)を使うことでインストールできます。
conda install -c conda-forge cdo
Intel macやApple Siliconでは、Homebrewを使うことでインストールできます。
brew install cdo
解像度変換
サンプルコード
水平高解像度なnetCDFファイル(in_hires.nc
)を低解像度なnetCDFファイル(out_lowres.nc
)へと変換する場合、シェル(Bash)で以下のコマンドを実行します。
export MAX_REMAPS=1
cdo -f nc4 -P <スレッド数> remapcon,grid_output in_hires.nc out_lowres.nc
このとき、カレントディレクトリにgrid_output
という名前の出力格子定義ファイルをあらかじめ用意しておきます。
gridtype = latlon
xsize = 360
ysize = 180
xunits = 'degree'
yunits = 'degree'
xfirst = 0.5
xinc = 1.0
yfirst = -89.5
yinc = 1.0
解説
格子の解像度変換をするオペレーターには、remap
から始まる様々なものが用意されています。こうしたオペレーターには、高解像度化するのに適したものと低解像度化するのに適したものがあります。remapbil
は周囲の格子からバイリニア内挿(線形内挿)をするオペレーターのため、高解像度な格子へと変換するのに向いています。一方、remapcon
はfirst order conservative remapping、要は物理量の面積分が変換前と変換後で等しくなるようなオペレーターのため、どちらかといえば低解像度な格子へと変換するのに向いています。
CDOにはスレッド並列のオプションがあり、-P
オプションでスレッド数を指定できます。並列化効率が良いかはオペレーターによりますが、解像度変換をするremap
から始まるオペレーターは並列化と相性が良いようです。
高解像度なデータを扱うときには、メモリの使用量にも注意が必要です。陸地があるなど鉛直方向で未定義な格子数が異なっている場合、解像度変換の重み係数は再利用するためにすべての異なる層について保存されます。そのため、高解像度データを扱う場合に大量のメモリを使用してしまうことがあります。これを解決するには、異なる層の重みをメモリに保存しないように、環境変数MAX_REMAPS
に1を設定します。このことは以下のページに書かれていました。
参考になるページ
CDOの公式マニュアルはこちらです。
日本語だと、以下のページが参考になります。