早崎トップ 研究(気候気象) 研究(大気汚染) データリスト Linux Tips Mac Tips

NetCDF使用方法

NetCDF データの利用方法

NetCDFは,大気関連データの主要記録フォーマットとして利用されている事が多い.

Fortran90/95 による読み出し

  事前準備

関連ライブラリのインストールおよび環境設定が必須.

 読み出しプログラムの例

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()

せいぜい上記程度.

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年頃だと思う.