流線とは、あるベクトル場が与えられたときに、 接ベクトルがその場所のベクトル場と一致するように 引かれた曲線である。
streamline.rb
ベクトル場を与えて、流線を描画する。
描画開始点と終了点を自動的に探索する。
streamline(u,v,xx,yy,dl,*opt)
require "streamline"
= NArray.sfloat(100,100)
= NArray.sfloat(100,100)
x = NArray.sfloat(100,100)
y = NArray.sfloat(100,100)
dummy = NArray.sfloat(100).indgen!
for i in 0..99
x[true,i] = dummy
y[i,true] = dummy
end
#ベクトル場の設定
for i in 0...100
for j in 0...100
u[i,j] = -10.0 * Math.sin(Math.atan2(i-50,j-50))
v[i,j] = 10.0 * Math.cos(Math.atan2(i-50,j-50))
end
end
#ベクトル場の描画
DCL.gropn(1)
DCL.grfrm
DCL.grswnd(0.0,99.0,0.0,99.0)
DCL.grsvpt(0.2,0.8,0.2,0.8)
DCL.grstrf
DCL.usdaxs
for i in 0...(u.shape[0])
for j in 0...(v.shape[1])
if i%5==0 and j%5==0 then
DCL.sglau(i,j,i+u[i,j]/5.0,j+v[i,j]/5.0)
end
end
end
#
#流線の描画
DCL.grfrm
DCL.grswnd(0.0,99.0,0.0,99.0)
DCL.grsvpt(0.2,0.8,0.2,0.8)
DCL.grstrf
DCL.usdaxs
streamline(u,v,x,y,1,1)
DCL.grcls
気象データでの使用例:メソモデルMM5出力の水平風
INDEX
アルゴリズム
- 適当な間隔で流線の描画を開始。
開始するかどうかは既に引いた線との距離で決める。
- 流線を描画。時間積分は4次Runge-Kutta法。
- 領域の端に当たるか、他の線、もしくは今引いている線のほかの部分に当たれば終了。
ここで最も難しいのは今引いている線のほかの部分に当たって描画終了するのを判定する部分。
INDEX
MM5データファイルの取り扱い
-
MM5とは
The Fifth-Generation NCAR/PSU Mesoscale Model (MM5)
とは、アメリカのNCARとペンシルベニア州立大学で開発された
メソスケール気象モデルである。
誰でもフリーでダウンロードして使うことができる。
日本でも多くの研究者が利用している。
MM5の入力・出力データは独自の形式になっている。
一般には専用の解析ツール「RIP」を用いるか、
GrADS形式への変換ツール「MM5toGrADS」を用いて解析を行う。
-
MM5データ読み込みルーチンの概要
MM5のデータをrubyから利用する為のルーチンは以下のもので構成される。
すべてRubyで書かれている。
- mm5_io.rb
:コアモジュール
- varraymm5.rb
:VArrayオブジェクト生成ルーチン
- gphys_mm5_io.rb
:GPhysオブジェクト生成ルーチン
読み込みに関しては
- TERRAIN_DOMAIN* :TERRAIN出力、MM5入力地形
- REGRID_DOMAIN* :REGRID出力、INTERPF入力
- MMINPUT_DOMAIN* :INTERPF出力、MM5入力初期値
- MMOUT_DOMAIN* :MM5出力
に対応している。
現在は書き込みには対応していない。
gphys_mm5_io.rb は gphys_io.rb のファイル種別識別ルーチンの
補正コードを含む。
-
使い方
ここではデータファイルを MMOUT_DOMAIN1 とする。
サンプルデータ:
MMOUT_DOMAIN1.tgz
mm5_io.rb、varraymm5.rb、gphys_mm5_io.rb を $(RUBYLIB)/numru/gphys/
以下に格納したものとする。
- GPhysを利用した読み込み
require "numru/gphys"
require "numru/gphys/gphys_mm5_io.rb"
include NumRu
# 変数"T"を開く
data = GPhys::IO.open("MMOUT_DOMAIN1","T")
- mm5_io.rb のみを利用した読み込み
高速な読み込みを必要とするなら mm5_io.rb のみを使い、
直接データを扱う。
require "numru/gphys/mm5_io.rb"
include NumRu
# ファイルのオープン
mm5data = MM5Data.open("MMOUT_DOMAIN1")
# ヘッダの読み込み
# (ヘッダの内容は解析に必要)
mm5data.bh_read
# ファイルに含まれる変数名を得る
vars = mm5data.var_names
# ファイルに含まれる時間ステップの総数を得る
n = mm5data.ntime
# n番目の時刻の変数"T"の読み込み
data = mm5data.read(n,"T")
-
改造してGAVEでMM5データを読み込む
MM5データ読み込みルーチンがGPhysに取り込まれれば
何もせずにGAVEでMM5データが読めるが、
現状で読むには以下の作業が要る。
-
mm5_io.rb、varraymm5.rb、gphys_mm5_io.rb を $(RUBYLIB)/numru/gphys/ 以下に格納。
-
gave のソースコードを開き、
require "numru/gphys"
の直後に
require "numru/gphys/gphys_mm5_io"
を追加。
以上でGAVEからMM5のデータが読めるようになる。
最新版の改造済みのものはこちら。
ただし今はMM5のデータかどうかを、ファイル名に"_DOMAIN"が含まれるか
どうかで判定している。元のままのファイル名なら問題ない。
INDEX
-
TODO
-
未対応のデータをなくす。
-
真面目に単位を入れる。
-
現在は緯度経度情報を捨てて、左下からの距離[m]で表しているのをなんとかしたい。
今のところ可能なのはメルカトル図法の場合のみか。
-
時刻はモデルの初期時刻からの経過時間[min]で表しているのを
年月日にもできるようにしたい。切り替えはどうする?
-
GPhys::MM5_IOからヘッダ情報のうち必要なものを見えるようにしたい。
-
速度アップ。
INDEX
-
データ構造