最低限 UNIX / Linux [III]

  1. シェル
    [1.1] シェル (Shell) とは
    [1.2] シェルの役割
    [1.3] 代表的なシェルの紹介
    [1.4] シェルの確認と変更
    [1.5] bash の機能
    [1.6] 環境のカスタマイズ (Bash)
    [1.7] その他のシェル
  1. 最低限 vi
    [2.1] vi とは
    [2.2] ファイルオープン/クローズ
    [2.3] vi の基礎 - 状態遷移
    [2.4] vi の基礎 - コマンドモード
    [2.5] vi の基礎 - 挿入モード
    [2.6] 実践編
    A 参考 [vi の応用]
  1. シェルスクリプト
    [3.1] シェルスクリプト入門
    [3.2] シェルスクリプト応用
    A 参考 [特殊記号の復習]
  1. gpview
    [4.1] gpview とは
    [4.2] gpview の使い方
  1. 本日の課題
    課題
    ヒント
    投稿の前に
<< 情報実験第4回トップへ

4. gpview

今回の課題では皆さんに動画を作成してもらいます. このページでは動画の作成の際に用いる gpview というコマンドについて簡単に解説します.

[4.1] gpview とは

gpview とは第 1 回座学編で紹介した 地球流体電脳倶楽部 が提供する描画用のコマンドです. Gphys というデータ解析・描画の為のソフトウェアをインストールすると gpview を使うことが出来るようになります. 情報実験機には既に Gphys がインストール済みですので, 早速 gpview を使ってみることにしましょう.

[4.2] gpview の使い方

[4.2.1] 基本的な使い方

gpview コマンドではデータファイルを読み込んで描画を行います. 今回サンプルデータファイルを用意してありますので, 先ずはそれを情報実験機にダウンロードする所から始めましょう. ウェブ上のデータをダウンロードする為には wget というコマンドを利用すると良いでしょう.

$ wget http://www.ep.sci.hokudai.ac.jp/~inex/y2010/0507/jitsugi/KdV.nc

ダウンロードしたサンプルデータの名前を見ると, .nc というあまり見慣れない拡張子になっていますね. この拡張子は NetCDF という形式のデータファイルであることを表しています. gpview では NetCDF 以外に GrADS, grib という形式のデータファイルを取り扱うことが出来ます. 今回はデータの形式については触れませんが, 興味がある人はウェブなどで調べてみると良いでしょう. NetCDF の詳細については NetCDF ユーザマニュアル などを参照すると良いでしょう.

gpview の最も基本的な書式は「gpview (ファイル名)@(変数名)」です. とりあえず以下のようにコマンドを打ってみましょう.

$ gpview KdV.nc@u 

以下のような図が表示されるはずです. 図を消すには Enter を押すか, 図の右上にある x 印をクリックします. ちなみに今回のサンプルデータは「ソリトン」 と呼ばれる波に関する数値計算の結果をデータとして書き出したものです.

上の図では等値線を描くのと色の塗り分けが同時に行われていますが, 色塗りのみ行なったり, 等値線のみ描くことも可能です. その為にはそれぞれオプションとして --nocont, --noshade を追加します.

$ gpview --nocont KdV.nc@u 
$ gpview --noshade KdV.nc@u 

データファイルに書かれている変数名を調べるには gplist というコマンドを用います. 先程指定した u という変数も確かにデータに含まれていることが分かります.

$ gplist KdV.nc 
  KdV.nc:
  x   [x=256] 'X-coordinate' (1)
  t   [t=2501]        'time' (1)
  u   [x=256,t=2501]  'displacement' (1)

nc ファイルの詳細な中身を調べるには ncdump というコマンドを使います. 使用例は以下の通りです.

$ ncdump KdV.nc |less 

上の図は 2 次元でしたが, 1 次元の図も描くことが出来ます. 例えば時刻 t= 0.8 での変位 u のスナップショットを表示してみましょう. 座標(この場合 x, t)を指定する場合には, 変数の後にコンマを打って記述します.

$ gpview KdV.nc@u,t=0.8 

上の図では変位 u の表示範囲が u の最小値から最大値までとなっていますが, 自分で表示範囲を指定することが出来ます. --range というオプションを使い, 数値の指定は (指定したい最小値):(指定したい最大値) という形で行います.

$ gpview --range -1.0:3.0 KdV.nc@u,t=0.8 

[4.2.2] 少し進んだ使い方

これで皆さんは gpview で図を表示出来るようになりました. 次に表示した図を画像ファイルとして保存する方法について説明します.

とりあえず以下のコマンドを打ってみて下さい.

$ gpview --wsn 4 --range -1.0:3.0 KdV.nc@u,t=0.8 

先程と同様の図が表示されたものと思います. しかし実は先程と今とでは描画に用いたソフトが違います. 先程は X (第 11 回の講義で出て来ます)と呼ばれるソフトで描画していたのですが, 今は Gtk と呼ばれるソフトウェアで描画しました. -- wsn オプションは図の出力先(ワークステーションナンバー;wsn はこれの略) を決めるオプションで, 1 を指定すると X で描画し, 4 を指定すると Gtk で描画します. デフォルトでは(wsn を何も指定しないと), 1 が指定されるようになっています.

Gtk を用いると, 表示した図を dcl_001.png という png 形式の画像として保存してくれます. 保存する為には, 図が表示された状態で D キーを 1 回タイプします. これは便利ですね!!

Gtk を用いた画像保存は確かに便利ですが, 複数の画像を保存したりする際に いちいち D キーを押すのは煩わしいと思う人もいることでしょう. 実は D キーを押さずに画像を保存する方法があります. 答えから先に述べると, 描画の前に以下のコマンドを実行すれば良いということになります.

  $ export DCLENVCHAR=_
  $ export SW_LWAIT=false
  $ export SW_LWAIT1=false
  $ export SW_LDUMP=true

図が表示されたときに図の上の方に DCL という文字が見えたと思います. gpview コマンドを用いて描画する際には, 地球流体電脳ライブラリ (DCL) を用いています. gpview において画像を X で表示するか, Gtk で表示するかを選択できるようになっているのは実は DCL のお陰なのです. 画像生成などの設定を行うには DCL の設定を変更する必要があります. 一行目は DCL の設定を環境変数で指定できるようにする為のコマンドです. 二行目は図を表示する際に一時停止しないようにする為のコマンドです. 三行目は図を表示を終える際に一時停止しないようにする為のコマンドです. 四行目は図を表示後に画像ファイルを作成する為のコマンドです. SW_LWAIT, SW_LWAIT1 を true にすると, キー入力待ち状態となり, キーを 押さない限りいつまで経っても画像が生成されません. また SW_LDUMP を true にすると, SW_LWAIT, SW_LWAIT1 が false であっても 画像が作成されません.

[4.2.3] おまけ(ruby スクリプトでの描画)

ここまで波の変位 u を描画してきました. 研究に解析はつきもので, ある物理量の平均や, 物理量同士の掛け算などを行ないたくなることもあることでしょう. 例えば u の 2 乗が描きたくなったとしましょう. この場合, gpview で描画させることは出来るかと言うと, 実は出来ません (平均操作など簡単な演算は出来ますが). しかし Gphys の付属ライブラリー GGraph を利用して陽にコマンドを作ると, 物理量の四則演算(+, -, *, /)が出来るようになります (gpview の中でも GGraph が用いられています). ここではスクリプト言語 ruby を用いた描画スクリプトについて簡単に触れましょう. ruby の詳細については ruby 公式ページ などをご覧ください.

wget コマンドで ruby スクリプトのサンプルを入手しましょう. なお ruby スクリプトの拡張子は .rb とするのが慣習となっています.

$ wget http://www.ep.sci.hokudai.ac.jp/~inex/y2010/0507/jitsugi/draw_uu.rb

ファイルの中身を覗いてみると, 以下のようになっています.

$ less draw_uu.rb

#!/usr/bin/env ruby

require "numru/ggraph" 
require "numru/dcl" 
require "getoptlong"
include NumRu

parser = GetoptLong.new
parser.set_options( ['--Time', GetoptLong::REQUIRED_ARGUMENT] )

begin
  parser.each_option do |name, arg|
    eval "$OPT_#{name.sub(/^--/, '').gsub(/-/, '_')} = '#{arg}'"
  end
    rescue
  exit(1)
end

time = $OPT_Time.to_f

file = "KdV.nc"

gp_vel = GPhys::IO.open(file, "u")
gp_vel = gp_vel.cut('t'=>time)
gp_vel2 = gp_vel * gp_vel

DCL.gropn(4)
DCL.uzfact(0.7)

GGraph::set_fig('view'=>[0.09,0.90,0.29,0.71])
GGraph.set_axes('xunits'=>'m','yunits'=>'m','xtitle'=>'x','ytitle'=>'u times u')
GGraph.line( gp_vel2, true, 'title'=>'u times u')

DCL.grcls

--> インタプリタとして ruby を指定

--> ggraph の読み込み
--> dcl ライブラリーの読み込み
--> コマンドラインでのオプションを使えるようにする
--> 名前空間の確保(変数を 1:1 対応させる為)

--> オプションの設定, ここから








--> オプションの設定, ここまで

--> オプションとして与える時刻の定義

--> データファイル(netcdf ファイル)の指定

--> 描くべき変数の指定
--> t = time でのデータを抽出
--> u の二乗の計算

--> DCL のオープン
--> 図がはみ出さないように微調整

--> 描画領域の指定
--> 横軸と縦軸の情報
--> 曲線を描く

--> DCL のクローズ


以下のコマンドを実行してみましょう. t=0.3 における u の 2 乗の空間分布が表示されるはずです.

$ ruby draw_uu.rb --Time 0.3

もし時間があったら, 出力時刻を変えたり, 座標軸名を変えたりして遊んでみると良いでしょう.

Gphys の詳細は こちら に書かれているので, 参考にしてみて下さい. GGraph の詳細は こちら(英語のみ) に書かれているので, いろいろと凝ってみたい人は試行錯誤しつつ色々試してみて下さい. また Gphys のインストール方法については こちら を参照すると良いでしょう. gpview のより詳しい使い方については Gphys コマンドチュートリアルのページgpview リファレンスマニュアル(英語のみ) を参照して下さい.

さて, これで gpview と Gphys の最低限の使い方をフォロー出来たと思いますので, いよいよ本日の課題のページに進むことにしましょう.




<< 戻る (シェルスクリプト)      次へ >> (課題)      情報実験 第4回 のトップへ >>

最終更新日: 2010/04/29(山下 達也) Copyright © 2010 inex