NetCDF データの利用方法
NetCDFは,大気関連データの主要記録フォーマットとして利用されている事が多い.
Fortran90/95 による読み出し
事前準備
関連ライブラリのインストールおよび環境設定が必須.
- NetCDFのセットアップ = NetCDF_setup
読み出しプログラムの例
NetCDF データの取り扱いの際には,CDOがあると何かと便利. See also CDO 使用方法(hysk)
NetCDF 3系列
基本的には,Fortran 90/95 によるサンプルプログラムのみを置く.
読み出しだけなら,実際に使うサブルーチンの種類は少ない.
- nf90_open()
- nf90_inquire()
- nf90_inquire_dimension()
- nf90_inquire_variable()
- nf90_inq_varid()
- nf90_inquire_attribute()
- nf90_inq_attname()
- nf90_get_var()
- nf90_get_att()
せいぜい上記程度.
- CMIP5 プロダクトの読み出し例 (see also データリスト > 将来予測データ(hysk))
- WRF 計算結果の読み出し例 (see also 機構気象関連 > WRF セットアップ(hysk))
NetCDF 4系列
under construction
書き出し(NetCDF作成)
自分で書き出すことがほとんどないので,pending.
コマンド実行例 (ncdump, etc.)
ncdump
ヘッダ情報表示
ncdump の hオプション (-h) を使う.
ncdump -h hoge.nc
NetCDFファイルのヘッダ情報を表示. 変数名,格子点情報(格子点数など), など. 初めて取り扱うデータの場合,まずは最初に見るべき情報.
例: CMIP5,気象庁の大気海洋結合モデル(MRI-CGCM3)の historical 実験,月平均地上気温(変数名tas)の場合.
See also
データリスト > 将来予測データ(hysk);
気候気象関連 > GCMメモ(hysk);
$ ncdump -h tas_Amon_MRI-CGCM3_historical_r1i1p1_185001-200512.nc netcdf tas_Amon_MRI-CGCM3_historical_r1i1p1_185001-200512 { dimensions: time = UNLIMITED ; // (1872 currently) lat = 160 ; lon = 320 ; bnds = 2 ; variables: double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01" ; time:calendar = "standard" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; double lat(lat) ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(lat, bnds) ; double lon(lon) ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(lon, bnds) ; double height ; height:units = "m" ; height:axis = "Z" ; height:positive = "up" ; height:long_name = "height" ; height:standard_name = "height" ; float tas(time, lat, lon) ; tas:standard_name = "air_temperature" ; tas:long_name = "Near-Surface Air Temperature" ; tas:units = "K" ; tas:original_name = "TA" ; tas:cell_methods = "time: mean (interval: 30 minutes)" ; tas:cell_measures = "area: areacella" ; tas:history = "2011-05-01T21:29:49Z altered by CMOR: Treated scalar dimension: \'height\'. 2011-05-01T21:29:49Z altered by CMOR: replaced missing value flag (-9.99e+33) with standard missing value (1e+20)." ; tas:coordinates = "height" ; tas:missing_value = 1.e+20f ; tas:_FillValue = 1.e+20f ; tas:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_atmos_fx_MRI-CGCM3_historical_r0i0p0.nc areacella: areacella_fx_MRI-CGCM3_historical_r0i0p0.nc" ; // global attributes: :institution = "MRI (Meteorological Research Institute, Tsukuba, Japan)" ; :institute_id = "MRI" ; :experiment_id = "historical" ; :source = "MRI-CGCM3 2011 atmosphere: GSMUV (gsmuv-110112, TL159L48); ocean: MRI.COM3 (MRICOM-3_0-20101116, 1x0.5L51); sea ice: MRI.COM3; land: HAL (HAL_cmip5_v0.31_04); aerosol: MASINGAR-mk2 (masingar_mk2-20110111_0203, TL95L48)" ; :model_id = "MRI-CGCM3" ; :forcing = "GHG, SA, Oz, LU, Sl, Vl, BC, OC (GHG includes CO2, CH4, N2O, CFC-11, CFC-12, and HCFC-22)" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; (中略.実験設定の概要などが続く) :parent_experiment = "pre-industrial control" ; :modeling_realm = "atmos" ; :realization = 1 ; :cmor_version = "2.5.9" ; }
格子点情報表示
ncdump の cオプション (-c) を使う.
ncdump -c hoge.nc
NetCDFファイルの時間 & 格子点情報を表示. ガウス緯度のデータの場合,これで緯度の値を確認できる.
例: CMIP5,気象庁の大気海洋結合モデル(MRI-CGCM3)の historical 実験,月平均地上気温(変数名tas)の場合
$ ncdump -c tas_Amon_MRI-CGCM3_historical_r1i1p1_185001-200512.nc netcdf tas_Amon_MRI-CGCM3_historical_r1i1p1_185001-200512 { dimensions: time = UNLIMITED ; // (1872 currently) lat = 160 ; lon = 320 ; bnds = 2 ; (中略.ヘッダ情報と同じ) data: time = 15.5, 45, 74.5, 105, 135.5, 166, 196.5, 227.5, 258, 288.5, 319, 349.5, 380.5, 410, 439.5, 470, 500.5, 531, 561.5, 592.5, 623, 653.5, 684, (中略) 56597.5, 56628.5, 56658, 56687.5, 56718, 56748.5, 56779, 56809.5, 56840.5, 56871, 56901.5, 56932, 56962.5 ; lat = -89.14152, -88.02943, -86.91077, -85.79063, -84.66992, -83.54895, -82.42782, -81.30659, -80.18531, -79.06398, -77.94262, -76.82124, (中略) 79.06398, 80.18531, 81.30659, 82.42782, 83.54895, 84.66992, 85.79063, 86.91077, 88.02943, 89.14152 ; lon = 0, 1.125, 2.25, 3.375, 4.5, 5.625, 6.75, 7.875, 9, 10.125, 11.25, 12.375, 13.5, 14.625, 15.75, 16.875, 18, 19.125, 20.25, 21.375, 22.5, (中略) 345.375, 346.5, 347.625, 348.75, 349.875, 351, 352.125, 353.25, 354.375, 355.5, 356.625, 357.75, 358.875 ; } $
NetCDF library, module 使用時の失敗例
些細なことだが,失敗例も記す. 失敗したことは結構忘れにくい.
文字変数長さの不一致
ifort だと稼働するのに,gfortran だと(コンパイルは通るが)実行時に停止する... という状況に遭遇. 結論は,コンパイラ依存ではなく NetCDF 読み出し時の文字変数長さの設定ミス.
ifort だと,結構いい加減な書き方をしても実行できる事が多いが, gfortran にすると失敗する事が多い.
CMIP5 データ読み出し時, char型変数を nf90_get_att() 使用してデコードしようとして失敗. subroutine から返される文字変数の長さが不足.長ければよい. 256文字にしても不足.最長で389文字があったので. 仮に512文字としたら正常終了.
nf90_byte (1), nf90_char (2), nf90_short (3), nf90_float (4), nf90_double (6) などのNetCDF用パラメータは,${NETCDF}/include/netcdf.mod 内に設定されてる. source では,v3系なら (netcdf_src)/f90/, v4系なら (netcdf_src)/fortran/ 以下の netcdf_constants.f90 に記載.
ifort だと動いていたので,3年ほど気付かなかった. (ifortを利用できない)VMware 上のLinuxやMacOS で読み出しテストしていて,問題が表面化した. ここに気付くまで悩んだ時間: 6-hr (他の作業やりながらとはいえ,気付くのが遅い...).
sample F90 module (非公開, personal memo) = ~/cmip/decode/module/mod_get_global_attribute.F90
リンク
NetCDF ライブラリのソース入手先
NetCDF ビューア
- Ncview:
NetCDFファイルの簡易ビューア.データの中身を quick-view するのに有効.
X環境が必須.コンパイルは容易.ただし NetCDF v.4 系列が必須(nc-config を使用.少なくとも v2.1.5 では.checked at 2015-10-07).
./configure --with-nc-config=/usr/local/netcdf4/bin/nc-config
- Panoply: HDF, netCDF, GRIB データのビューア. 取り敢えずデータをさっと見たい時に使える. Java ベースなので,大抵のOSで同じビューアを利用できるのも良い. Java SE 7 or 8 ランタイム環境が必要. 私のように,マウスでポチポチ操作するのが苦痛な人には向いてない.
更新履歴
更新日 | 内容 |
---|---|
2015-10-10 | CDOへのリンク,更新履歴を追加. |
201?-xx-xx | 記述開始日,記録が残ってない.多分,2013年頃だと思う. |