2次元量の表示

[here]章で見たように,2次元データを手早くコンタリングしたいと いうときには,サブルーチン UDCNTR を呼ぶだけで,とりあえず等高線 図が得られました.これは,GRPH2 の2次元等高線図描画ルーチンパッケージ UDPACK に含まれるサブルーチンです.ここでは,UDPACK のいくつかの機能を 簡単なプログラム例で示します.

なお,UDPACK はU-座標系で作画していますから,第[here]章で簡単に ふれる地図投影にも対応できます.

コンターラインをコントロール

[here]節で扱ったデータを用いて,コンターラインをユーザー の好みで制御することを考えてみましょう(U2D1).

u2d1/u2d1.f


u2d1.f: frame1

デフォルトではラベル付きの太線が1本おきに引かれますが,これをメジャー ラインとよびます.このメジャーラインに付いているコンターラベルのフォー マットは,UDSFMT ルーチンで設定できます.29行めのように,指定す るフォーマットを文字型で与えます.コンターラインにつけるラベルは,コン ターレベルを決定するルーチンの中で生成されますから,UDSFMT ルー チンはコンターラインを生成するルーチン(UDGCLAUDGCLB)の 前に呼ばなければなりません.

コンターラインの生成ですが,ここでは,UDGCLA ルーチンで等間隔の コンターレベルを生成します.最初の2つの引数がコンターレベルの最小値と 最大値で,30行めの例では負のコンターは描かれません.最後の引数は刻み 幅ですが,これが負の時にはその絶対値程度の本数のコンターレベルを生成し ます.

これらのルーチンでは,等間隔のコンターレベルしか生成されません.もしも, 不等間隔のコンターレベルを指定したい場合や,特定のコンターレベルを追加 したい場合は,31行めのように UDSCLV ルーチンで1本1本のコンターレ ベルを生成します.最初の引数がコンターレベルの値で,残りの4つがコンター ラインの属性です.順に,ラインインデクス,ラインタイプ,ラベル,V-座標 系におけるラベルの大きさ,です.逆に,ある1本のコンターレベルを無効に するには UDDCLV ルーチンを呼びます.引数はコンターレベルの値で, この例では,0.6の等高線を描いていません.また,すべてのコンターレベル を無効にするには UDICLV ルーチンを呼びます.

あとは,同じ UDCNTR ルーチンを呼ぶだけです. このプログラムを実行すると,次のようなメッセージが出るはずです.

*** MESSAGE (UDCNTR) *** INAPPROPRIATE DATA WILL BE MODIFIED INTERNALLY.
*** MESSAGE (-CNT.-) *** Z( 1, 1)= -1.00000000 ===> -1.00000119
UDCNTR では,ある格子点での値がコンターレベルと等しい時に,格子 点値をわずかにずらして作画し,このようなメッセージを出力します.たいて いの場合,このメッセージを気にする必要はありません.

もう少しコンターラインにこだわってみましょう.次のプログラム U2D2 では,内部変数を変更することにより,コンターラインをコントロール しています.UDPACK サブルーチンパッケージで使用する内部変数の参照と変 更は,UDpGETUDpSET のルーチンで行ないます.ここで, p は,内部変数の型によって L(論理型), I(整数型), R(実数型)のどれかをとります.この例では,内部変数 'LABEL'.FALSE. にして,メジャーラインにラベルを付けないようにします. 'LDASH'.FALSE. にして正も負も同じラインタイプでコンター ラインを描くことにします.また,その時のラインタイプを 'ISOLID' で2(破線)と指定しています.さらに,'ICYCLE' を4として,4本に1本 の割合でメジャーラインを引くことにします. 結果は,正負の区別もつかず, わけのわからない等高線図となってしまいましたが,このような機能もあると いうデモンストレーションです.

u2d1/u2d2.f


u2d2.f: frame1

格子点が不等間隔の場合

UWPACK は2次元の格子点座標に関する情報を管理するサブルーチンパッケージ です.UDCNTR ルーチンを呼ぶ前に UWPACK のサブルーチンを呼んで格 子点の座標値をあらかじめ指定しておけば,不等間隔な格子点でもコンタリン グが可能です(U2D3).

u2d1/u2d3.f

この例では,これまでと同じ2次元配列データですが,y方向にはサイン緯度 (-1から1の値を取る)の座標系を設定してコンタリングをおこないます.ま ず,配列 UY1 に格子点の座標をU-座標系の値で用意します.UY2 は,UYAXLB ルーチンでy座標軸のラベルを描くために,その座標値を 用意する配列です.40行めではUYAXDV ルーチンでサイン緯度の座標軸 を等間隔に刻んで描きます.次に,右側のy座標軸にラベルが描けるように して,UYAXLB ルーチンでデータのある格子点に目盛をつけ,緯度30度 毎にラベルをつけます.

次に,x方向については,UWSGXB ルーチンを用いて,最小値,最大値 および格子点数を指定することによって,格子点座標に関する情報を設定しま す.ただし,ここでは格子点をウインドウいっぱいに設定するようにしている だけなので,UWSGXB ルーチンを呼ばなくても結果は同じです.そして, UWSGYA ルーチンを用いて不等間隔の格子点を設定しています.引数は, 座標値を指定する配列名 UY1 とその長さです.x軸に不等間隔の格子 点を設定するには,UWSGXA ルーチンを用います.

あとは,UDCNTR ルーチンを呼ぶと,格子点が不等間隔の場合でも御覧 のように等高線図が描かれます.


u2d3.f: frame1

配列の一部分だけを描く

配列の一部分だけを作画するにはどうしたらよいのでしょう? これまでと同じ データで,その一部分だけを描くことを考えてみましょう(U2D4).

経度80^から320^, 緯度-60^から60^の 部分だけを描くことにします.6行めのパラメータ文で与えているように,格 子点の範囲はx方向に9 ≦ i ≦ 33, y方向に7 ≦ j ≦ 31と なります.ウインドウの設定をこの範囲とし,36行めのUDCNTR ルーチ ンで等高線図を描くのですが,ここで一工夫が必要です.最初の引数としては, この矩形領域の左下に対応する配列要素 P(KXMN,KYMN) を陽に与え,2 番めには実際に宣言した配列の第1次元寸法 NX, 3, 4番めには実際の作 画に使う配列の第1次元および第2次元寸法 (KXMX-KXMN+1,KYMX-KYMN+1) を与えることによって配列の一部分だけを作画することができます.

この辺の事情を正しく理解するためには,FORTRAN において,2次元の配列要 素が記憶領域上でどのように順序づけられ,サブルーチンの引数にある配列が どのように扱われているかを知る必要があります.FORTRAN マニュアルなどを 参照してください.

u2d1/u2d4.f


u2d4.f: frame1


Back to Main


Latex Source


地球流体電脳倶楽部 : 95/6/9 (Version 5.0)

NUMAGUTI Atusi <a1n@gfdl.gov>
Last Modified: Thu Aug 31 13:11:45 EDT 1995