6. データ


6.1 データ型の値、変数

pointer でグラフを書かせる上で、 もっとも重要なことがデータを読み込ませることです。 pointer では読み込んだデータを扱うために データ型という特殊な型の値を用意しています。 この型の値を作るもっとも簡単な方法は data コマンドを使うことです。
> $data=data
としてみてください。 $data という変数にデータ型の値が代入されます。

データ型の値は、データの次元や座標値、 物理量などをあらわすいくつかの整数、実数、 配列などが集まってできています。 これらの値(「要素」あるいは「メンバー」などと呼びます) は '.'(ピリオド)を使って参照することができます。 たとえば、
> echo $data.dim
とすると 1~3 のどれかの値が表示されるはずです。 これは、$data というデータ型の値の "dim" という名前の要素を とりだしています。 dim という要素はデータの次元数をあらわしていて、 これが 2 ならデータは x、y の 二つの座標値を持っていることになります。 データを用意するというのは、 これらデータ型の値のいろいろな要素を すべて決めていくことにあたります。
なお、pointer では座標を x、y... ではなく x1、x2... で あらわすことがあります。 これは場合によって x1、x2... が円柱座標の r、phi... をあらわすため、 そしてグラフの x 軸、y 軸と混同しないためです。


6.2 sequential データ、grid データ

データ型の持つ各要素の説明の前に、 まずデータの種類について説明します。 データには今のところ二つの種類があります。 sequential データと grid データです。

sequential データは、 データの個数分だけの座標値と物理量を持つデータです。 たとえば 100 個のデータがあった時、 100 個分の x1 座標、(二次元以上なら)x2 座標、x3 座標、 それに(あれば)物理量が必要となるわけです。 実際には x-y の簡単なグラフを書かせる時や、 空間上の流線や磁力線などを書かせたい時に使うデータの種類です。
seqential data

grid データは、 空間を格子上に切ってその格子上の各点の物理量を持つデータです。 たとえば二次元空間で x1 方向に 20、 x2 方向に 30 の格子を切ったとすれば、 必要な座標値は x1 が 20、x2 が 30、 物理量は 20x30 だけ必要になります。 この種類のデータは等高線図を作る時などに使います。
grid data


6.3 データ作成の例

データ型の持っている要素について詳しく説明する前に、 まず簡単にデータを作ってみましょう。
ケース1
まず、一番簡単な一次元の sequential データを作ってみましょう。 これはたとえば、時間ごとの温度の変化のような x-y グラフのためのデータです。
試しに以下のプログラムを実行してみて下さい。

$dt=data;
$dt.dtype="seq";
$dt.dim=1;
$dt.nx1=10;
$dt.nv=1;
for($i=0; $i<$dt.nx1; $i++){
   $x=0.1*$i;
   $dt.x1[$i]=$x;
   $dt.v[0][$i]=$x*$x;
}

これを実行すると変数 $dt に v=x^2 をあらわすデータが代入されます。 このあとたとえば

newwin;
scale;
draw $dt;
lim $dt;

とすればデータをグラフとして見られるはずです。

ケース2
grid データも sequential データと 同じような手順で作ることができます。 ただし、配列の長さが grid データと違うので注意して下さい。
次の例は二次元の grid データです。


$dt=data;
$dt.dtype="grid";
$dt.dim=2;
$dt.nx1=10;
$dt.nx2=10;
$dt.nv=1;
for($i=0; $i<$dt.nx1; $i++) $dt.x1[$i]=0.1*$i;
for($j=0; $j<$dt.nx2; $j++) $dt.x2[$j]=0.1*$j;
for($j=0; $j<$dt.nx2; $j++){
   for($i=0; $i<$dt.nx1; $i++){
      $x=$dt.x1[$i];
      $y=$dt.x2[$j];
      $dt.v[0][$j*$dt.nx1+$i]=\
            0.5+0.5*sin(2.0*3.14*$x)*cos(2.0*3.14*$y);
   }
}

v[0] が nx1*nx2 の長さを持った 一次元の配列であることに注意して下さい。
このデータを、たとえば等高線にするには

newwin;
scale;
axis x1 x2;
contour $dt;

としてみてください。


6.4 データ型の持つ要素

以下にデータ型の持っている要素を挙げていきます。

dim(整数型)
データの次元数をあらわす。 一次元から三次元まで。

dtype(文字列型)
データの種類。 今のところ "sequential(seq)" と "grid" の二種類がある。

nx1(整数型)
x1 座標が何点あるか。
nx2(整数型)
x2 座標が何点あるか。 データが二次元以上の時必要。 また、データが sequential の場合は nx1 と同じになる。
nx1(整数型)
x1 座標が何点あるか。 データが三次元の時必要。 また、データが sequential の場合は nx1 と同じになる。

x1(実数配列型)
x1 座標の座標値。 nx1 個の実数配列になる。
x2(実数配列型)
x2 座標の座標値。 nx2 個の実数配列になる。 データが二次元以上の時必要。
x3(実数配列型)
x3 座標の座標値。 nx3 個の実数配列になる。 データが三次元の時必要。

nv(整数型)
各点の物理量のデータが何種類あるか。 たとえば、各点に温度と圧力の値があれば nv=2。 あるいは各点に三次元のベクトル量が与えられていれば nv=3。 またデータが座標値のみしか持たなければ nv=0。

v(実数配列のリスト型)
各点の物理量データ。 v そのものは nv 個のリストで、 リストの各要素(v[0]、v[1]...)がデータを示す実数配列。 配列は、sequential データなら nx1 個、 grid データなら一次元の場合 nx1 個、 二次元の場合 nx1*nx2 個、 三次元の場合 nx1*nx2*nx3 個の実数配列になる。 grid データの場合、 x1 座標が $i 番目、x2 座標が $j 番目、x3 座標が $k 番目のデータは v[0]... 配列の $k*nx1*nx2 + $j*nx1 + $i 番目の要素になる。