使用方法

Ngraph を使用して、等高線を作図する場合について、使用方法を説明します。
 

1. Ngraph の準備

2. サンプルプログラムのコンパイルと実行

ng2d トップページ

1. Ngraph の準備


 Ngraph スクリプトは、通常、完成したグラフを保存するときにできるもの(拡張子 ngp)と汎用的な道具として使うアドインスクリプト(拡張子 nsc)があります。本サブルーチンが出力する Ngraph スクリプトは、たとえば等高線10本分のファイルや凡例の設定などを行うためだけなどという部分的かつ非汎用的なものなので、これらと区別してグラフの一部分を設定するものという意味で part という拡張子を付けました。このスクリプトを Ngraph で読み込むために part.nsc というのアドインスクリプトを使用します。このアドインスクリプトは機能的には Ngraph シェルで shellオブジェクトをつくって part スクリプトを起動するだけの簡単なものです。
まず、この part.nsc を Ngraph に登録します。
part.nsc を Ngraph をインストールしたディレクトリにコピーして、Ngraphを起動し、

   設定 -> アドインスクリプト -> 追加

を選び

   名称       : PART: parts of graph
   スクリプト : part.nsc

などと入力し OK ボタンを押します。パーミッションなどのため part.nsc を Ngraph をインストールしたディレクトリにコピーできない場合は、スクリプトの欄で part.nsc をフルパスで指定すれば大丈夫でしょう。そして、

   設定 -> 初期状態としてセーブ(各種設定)-> アドイン設定 -> OK

とします。

2. サンプルプログラムのコンパイルと実行


等高線サブルーチンは、格子点の位置座標の配列 x(i,j),y(i,j) と等高線にしたい値の配列 z(i,j) から、等高線の座標などが入ったデータファイルと、Ngraph での設定を補助するスクリプトファイル (*.part) を出力します。ここでは、描画領域を x(i,j), y(i,j) の変域全体とし、等高線のレベルを、z(i,j)の値域の最大値および最小値から等間隔的に自動的に決めるサブルーチン ngcc1a の例で説明します。

      subroutine ngcc1a(nd,fname,nx,ny,x,y,z,nc)
        カラー等高線、レベル等間隔分割

nd は出力装置番号、fname はファイル名のプレフィックス、nx,ny は2次元配列の大きさ、x(i,j),y(i,j)は格子点の位置座標の配列、z(i,j)は等高線にしたい値の配列、nc は等高線の本数です。等間隔分割の場合は z(i,j)の最大値と最小値の間を nc-1 個に等間隔分割します。
装置番号を引数に入れたのは、他のファイルをオープンした状態でこれらのサブルーチンを呼ぶときなどに装置番号がかち合わないように明示的に設定するためです。

 以下のサンプルプログラムを用いて、使用方法を説明します。このプログラムは (x1,y1),(x2,y2) に電荷がある場合の静電ポテンシャルのようなものを作図するためのものです。行番号は説明のために記したものです。ポテンシャルは電荷の位置で発散するので、格子点の位置と重ならにならないようずらしています。

  sample1.f

     1       program main
     2       parameter (nx=40,ny=40)
     3       dimension x(nx,ny),y(nx,ny),u(nx,ny)
     4       character*80 fname
     5 c
     6       x1=5.0
     7       y1=0.0
     8       x2=-5.0
     9       y2=0.0
    10 c
    11       do 10 j=1,ny
    12          do 10 i=1,nx
    13             x(i,j) = float(i-1)*0.5-9.75
    14             y(i,j) = float(j-1)*0.5-9.75
    15             r1=sqrt((x(i,j)-x1)*(x(i,j)-x1)+(y(i,j)-y1)*(y(i,j)-y1))
    16             r2=sqrt((x(i,j)-x2)*(x(i,j)-x2)+(y(i,j)-y2)*(y(i,j)-y2))
    17              if ((r1.eq.0).or.(r2.eq.0)) goto 10
    18             u(i,j)= 1.0/r1 + 1.0/r2
    19  10   continue
    20 c
    21 c     --- I/O unit number
    22       nd=10
    23 c
    24 c     --- number of contour lines
    25       nc=15
    26 c
    27       fname='u'
    28       call ngcc1a(nd,fname,nx,ny,x,y,u,nc)
    29       fname='frame'
    30       call ngfrma(nd,fname,nx,ny,x)
    31 c
    32       stop
    33       end

3行目で配列を宣言し、11行目から19行目で、配列 x(i,j),y(i,j) に格子点の位置座標を入れ、配列 u(i,j) にその格子点におけるポテンシャルの値を入れてます。そして、28行目でカラーの等高線の座標データを出力するサブルーチン ngcc1a を呼び出します。この場合は、u(i,j)の最大値と最小値の間を等分割した nc 個のレベルの等高線のファイルを出力します。30行目は描画領域の枠の座標を出力するサブルーチン ngfrma を呼び出します。

用意するものは、

sample.f   : 上記プログラムソース
ng2d.f     : サブルーチン本体
ng2d_par.f : ng2d.f からインクルードされるパラメータ設定用ファイル

です ng2d.f は内部で作業用の配列を使用しており、この配列の大きさを ng2d_par.f で設定していますので適宜変更してください。特にメモリが少い場合、mx,my の値を小さくする必要があります。

      parameter(ncmax=100)     : 等高線のレベルの数(本数)の上限
      parameter(mx=500,my=500) : 処理する2次元配列のサイズの上限

とりあえずコンパイルして実行します。コンパイラとして g77 を使用している場合なら、

  g77 sample.f ng2d.f -o sample

または、

  g77 -c ng2d.f
  g77 sample.f ng2d.o -o sample

などと入力すればよいでしょう。そしてプログラム sample を実行すると、
以下のようなファイルが出力されます

ngcc1a の出力
  u.1, u.2,...,u.10 : レベル別の等高線の座標データファイル
  u.part            : Ngraph スクリプト

ngfrma の出力
  frame.dat         : 枠線の座標データ
  frame.part        : Ngraph スクリプト
Ngraph を起動して、

  グラフ -> アドイン -> PART : parts of graph -> OK

とし Files リストの frame.part を選A択して OK してください。すると Data Window に frame.dat がセットされ Draw ボタンを押すと枠が描かれます。同様に PARTアドインから u.part を選択して OK してください。すると、ファイル名、データタイプ(line)、凡例などが設定されます。そして Draw ボタンを押すとカラーの等高線が描かれます。Ngraph がデフォルトの設定になってる場合右上に凡例が表示されているはずです。

この等高線は隣接する4つの格子点がつくる四辺形の曲面領域を、4つの三角形に分割して、各三角形の平面で近似して、この平面と等高面との交線を求めたものです。等高線や枠線のデータファイルは次のように 、各行に曲線を構成する点のx座標、y座標が並んだものです。線が切れるところで ' = =' が出力されます。

u.12 の一部
# value =      2.33477E+00
 -0.53677E+01 -0.36772E+00
 -0.52500E+01 -0.43903E+00
 -0.50604E+01 -0.43963E+00
 -0.49400E+01 -0.44002E+00
 -0.47500E+01 -0.44062E+00
 -0.46308E+01 -0.36919E+00
 -0.45587E+01 -0.25000E+00
 -0.45587E+01 -0.58667E-01
 -0.45587E+01  0.58667E-01
 -0.45587E+01  0.25000E+00
 -0.46308E+01  0.36919E+00
 -0.47500E+01  0.44062E+00
 -0.49400E+01  0.44002E+00
 -0.50604E+01  0.43963E+00
 -0.52500E+01  0.43903E+00
 -0.53677E+01  0.36772E+00
 -0.54385E+01  0.25000E+00
 -0.54385E+01  0.61490E-01
 -0.54385E+01 -0.61490E-01
 -0.54385E+01 -0.25000E+00
 -0.53677E+01 -0.36772E+00
 = =
  0.46308E+01 -0.36919E+00
  0.47500E+01 -0.44062E+00
  ........................

ng2dトップページ