地球流体電脳ライブラリ
らくらくDCL

Index

はじめに

はじめに

地球流体電脳ライブラリ(DCL)

DCLの背景

DCLの特徴と将来

DCLの構成

本書の構成


計算機のなまり 1

FORTRANの方言

計算機言語には各国の標準機関(日本ではJIS) 及び国際標準機関 (ISO) によ り定められた規格があります.FORTRAN も例外ではなく,いわゆる FORTRAN77 の規格があります.

FORTRAN コンパイラは通常,「標準語」としての FORTRAN77 規格 + α の機能を持っています.この + α が拡張機能と呼ばれるものです. このような FORTRAN77 上位互換コンパイラは,コンパイラとしての機能は高 いのですが,逆に,+αの機能を使ったプログラムは,そのコンパイラ でないとコンパイルできないことになります.そういうわけで,ここでは +αの部分を「方言」と呼びます.

例えば,INCLUDE 文や4倍精度の実数,行末コメントなどは,良く知られた 「方言」です.このような FORTRANの「方言」は特定の計算機を使いこなすに は便利な場合も多いのですが,そのプログラムが他の計算機で動く保証はどこ にもありません.プログラムの可搬性(他の計算機への移植のしやすさ)を高め るには,そのプログラムを「標準語」化する必要があります.

しかし,どんなコンパイラでも大なり小なり「方言」を持っており,「方言」 を含まないプログラムを書くことは容易なことではありません.そもそも,あ る1つの計算機しか使ったことがなければ,何が「標準語」で何が「方言」か を見分けることすら困難です.

DCL は,極力この「方言」を避けるように努めています.どうしても「方言」 を使わなければならないところでも直接「方言」は使わないで,「電脳標準語」 を定義して各プログラムの中ではこの「電脳標準語」を使うようにしています. この「標準語」化の努力が DCL の最大の特徴であり,DCL の可搬性を生み出 しているのです.


とりあえず使ってみよう

とりあえず使ってみよう

とりあえず折れ線

とりあえず等高線図

とりあえず2次元ベクトル場


計算機のなまり 2

実数の内部表現

整数の内部表現は,ほとんどの機種で同一の表現となっているのに対して,実 数型変数に関してはいくつかの規格が存在します.

一般に,実数型の変数は浮動小数点の形で表現されます. すなわち,β進法を使った場合,実数は [ ±(0. f_1 f_2 f_3 ... f_m)_β β^± E ] という形で表されています. ここで, [ ±(0. f_1 f_2 f_3 ... f_m)_β = ± (f_1 β^-1 + f_2 β^-2 + f_3 β^-3 + ... f_m β^-m) ] は仮数部で,f_iは0からβ-1までの整数(f_1 ≠ 0 )です. また,β^± Eは指数部で,Eは0または正の整数です.

主要な実数表現として,IBM形式とIEEE(アイ・トリプル・イーと読む)形式と があります.どちらも,32ビットを1語とする点では同じですが,採用されて いる進法が異なり,表現できる実数の範囲や精度に違いがあります.

IBM形式は16進演算が基本になっていて,各ビットの使い方は以下の通りです.

{0.5mm |c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c| c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c| 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 & 17 & 18 & 19 & 20 & 21 & 22 & 23 & 24 & 25 & 26 & 27 & 28 & 29 & 30 & 31
± & E+64 & f_1 & f_2 & f_3 & f_4 & f_5 & f_6 >

IEEE形式は2進法の浮動小数点形式で,IBM形式に比べて相対精度が高いという 特徴があります.各ビットの使い方は以下の通りです.

{0.5mm |c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c| c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c| 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 & 17 & 18 & 19 & 20 & 21 & 22 & 23 & 24 & 25 & 26 & 27 & 28 & 29 & 30 & 31
± & E+126 & f_2 f_4} & f_5 ... f_8} & f_9 ... f_12} & f_13 ... f_16} & f_17 ... f_20} & f_21 ... f_24} >

このように,同じビット数で実数を表現しても,実数として表現できる範囲や 精度はシステムによって異なります.IBM形式で表される0でない実数は,絶対 値が5.397605 10^-79 〜 7.237005 10^75の範囲であ り,相対誤差は 6 10^-8 〜 10^-6 程度です. 一方, IEEE形 式では,絶対値が1.40129846 10^-45 〜 3.40282347 10^38 の範囲の実数が表現できて,相対誤差は 3 10^-8 〜 6 10^-8 程度です.

DCL では,このようなシステム依存の定数を MATH1/SYSLIB の GLRSET/GLRGET で管理しています.また,システムに依存する実数表現を解釈する道具が REALLIB です.

詳細は,MISC1 のマニュアル(dcl-x.x/doc/misc1/gaiyou/real.tex)を御覧下 さい.


描画の基本(1)

描画の基本(1))

仮想直角座標系(V-座標系)での基本描画

ポリラインプリミティブ

ポリマーカープリミティブ

テキストプリミティブ

トーンプリミティブ


DCLのしくみ 1

SGPACKルーチンの名付け方

SGPACKの各出力プリミティブを定義するサブルーチン名の名付け方は以下のよ うになっています.

  1. 先頭の2文字はすべてSGで始まる.
  2. 属性を設定/参照する場合, 3文字目はS (set)/ Q (query)である.
  3. 各プリミティブの名前がそれに続く.それぞれ,
    • PL : ポリラインプリミティブ.
    • PM : ポリマーカープリミティブ.
    • TX : テキストプリミティブ.
    • TN : トーンプリミティブ.
    • LA : アローサブプリミティブ.
    • LN : ラインサブプリミティブ.
  4. プリミティブを定義(出力)するルーチンについて,属性を同時に指定する 場合はZが続く.
  5. さらにプリミティブをどこに定義するかによって, U (U-座標系で定義する), V (V-座標系で定義する) またはR (R-座標系で定義する)が続く.
  6. プリミティブの属性を設定/参照する場合, 6文字目はその属性を示す.
    • T : ラインタイプ,マーカータイプ.
    • I : ラインインデクス.
    • S : マーカーサイズ,文字の高さ.
    • R : 文字列の回転角.
    • C : 文字列のセンタリングオプション.
    • P : トーンパターン.


描画の基本(2)

描画の基本(2))

ユーザー座標系(U-座標系)での基本描画

もっとポリライン

もっとテキスト

アローとラインのサブプリミティブ


DCLのしくみ 2

xxpGET/xxpSET で内部変数管理

地球流体電脳ライブラリでは,例えば,SGLGET/SGLSET のような内部変 数管理ルーチンが多く使われています.内部変数管理ルーチンとは,設定され た変数の値を保持し,問い合わせに答えて値を返す機能を持ったルーチンで, 「掲示版」のような役目をするものです.この様なルーチンを使う理由として, 次のようなことがあげられます.

複数のサブルーチンで情報を共有するには,COMMON BLOCK を使うこともでき ますが,大きなパッケージでこれを多用するとプログラムの可読性を落とすこ とにつながります. また,サブルーチンの引数を少くすると融通が効かなく なりますが,かといって,むやみに引数の数を増やすとかえって使いにくいも のです.

このような問題を解決するのが内部変数管理ルーチンです.もともと「パッケー ジの内部で使われる変数」という意味で,内部変数という言葉を使っています が,その変数はパッケージ外からも参照/設定できるので,その有効範囲から すると C 言語の「外部変数」に似た性格を持つものです.

内部変数管理ルーチンは xxpGET, xxpSET という名前です.xx は通常パッケージの先頭2文字で,p は変数の型によって,I(整数型), R(実数型), L(論理型), C(文字型)のうちの ひとつになります.内部変数は,あらかじめシステムが用意した値(初期値)を デフォルトで保持しています.この値は xxpGET ルーチンによって参照 し,xxpSET ルーチンによって変更することがでます.ユーザーが何も 指定しなければ初期値を使うことになります.


レイアウト

レイアウト

1ページに複数の図形

マージンに文字列を書く

紙を一杯に使う


FORTRANのひけつ 1

不定の概念

FORTRAN 規格の基本的な概念に「不定」という概念があります.これは最も重 要な概念の一つでありながら,最もわかりにくい概念でもあります.岩波 FORTRAN 辞典には,

プログラム実行中に,変数,配列要素または部分列が想定できるような値 を持たない定義状態.
とありますが,なかなかイメージが湧きません.簡単にいえば,「○○の時, 変数××は不定となる.」という文章は,コンパイラをつくる人に対しては, 「○○の時, 変数××が占めていた記憶領域をどのように使ってもよい.」と いうことになり,我々プログラマに対しては,「コンパイラをつくる人に,上 のように言ってしまったので,××がどうなるかわからない.」ということに なります.

「不定」とは逆に,規格によって値が保証されている状態を「確定」といいま す.規格上,プログラムの中で引用できる変数は「確定」された変数だけです. 変数が「不定」となる例に次のようなものがあります.

2番めの状況を回避するには SAVE 文を使います.SAVE 文は,サブルーチンの 実行が終ってもサブルーチン内の変数の値を保持するように指示する宣言文で す.コンパイラによっては(というより多くのコンパイラでは)サブルーチン の中で使われる局所変数を保存しますが,これは「方言」です. ただし, DATA 文で指定された変数は,.そ.の.値.が.書.き.換.え.ら.れ. な.い.限.り,RETURN 文または END 文を実行しても「不定」にはなりません.

因みに,DCL の xxpGET/xxpSET ルーチンが,掲示板の役目を果たせる のは,この DATA 文と SAVE 文のおかげです.


USPACKを一工夫

USPACKを一工夫

タイトルを描く

USGRPHの分解

複数のデータを1つのグラフに描く

等間隔データをおまかせにする


DCLのしくみ 3

根回し型ルーチンと上意下達型ルーチン

SGPACK の各出力プリミティブにはそれぞれ2種類の描画ルーチンがあります.

例えば,ポリラインプリミティブでは,SGPLV, SGPLU ルーチン で折れ線を描くように説明しました.ポリラインの属性は SGSPLT, SGSPLI などのルーチンで前もって設定しておきました.これらは,い ろいろ属性を決めておいてから描画ルーチンを呼ぶという「根回し型」のルー チンです.

これに対して,属性も同時に指定してポリラインを描画するルーチンも用意さ れています.呼び出し方法は,それぞれ,

CALL SGPLZV(N,VPX,VPY,ITYPE,INDEX)
CALL SGPLZU(N,UPX,UPY,ITYPE,INDEX)
です.引数の ITYPE でラインタイプを与え,INDEX でラインイ ンデクスを与えます.これらは,サブルーチンひとつで一度に描いてしまう 「上意下達型」のルーチンです.

同様に,他の出力プリミティブも上意下達型のルーチンが用意されています. 引数の説明は省きますが,次のように呼び出します.

CALL SGPMZV(N,VPX,VPY,ITYPE,INDEX,RSIZE)
CALL SGPMZU(N,UPX,UPY,ITYPE,INDEX,RSIZE)
CALL SGTXZV(VX,VY,CHARS,RSIZE,IROTA,ICENT,INDEX)
CALL SGTXZU(UX,UY,CHARS,RSIZE,IROTA,ICENT,INDEX)
CALL SGTNZV(N,VPX,VPY,ITPAT)
CALL SGTNZU(N,UPX,UPY,ITPAT)
CALL SGLAZV(VX1,VY1,VX2,VY2,ITYPE,INDEX)
CALL SGLAZU(UX1,UY1,UX2,UY2,ITYPE,INDEX)
CALL SGLNZV(VX1,VY1,VX2,VY2,INDEX)
CALL SGLNZU(UX1,UY1,UX2,UY2,INDEX)

他のグラフィクスパッケージでも,GKS の流れは前者の型で,CALCOMP 系のも のは後者の型です.これまでにどちらかの型に馴染んでいるユーザーは,好み の方をお使い下さい.


座標軸

座標軸

線形座標軸

対数座標軸

これはうれしい日付軸

中途半端なウインドウ


計算機のなまり 3

文字の内部表現

文字の内部表現も実数表現と同様に機種に依存しています.DCL の CHGLIB と CHKLIB のサブパッケージは,機種依存する文字処理を規格化するためのもの です.

FORTRAN では以下の FORTRAN 文字集合が定められており,プログラムは,注 釈行や文字型データの中は例外として,これらの文字だけで書かなければなり ません.

                                           
  英字:       ABCDEFGHIJKLMNOPQRSTUVWXYZ   
                                           
  数字:       0123456789                   
                                           
  特殊文字:   空白 !'()                    
              *+,-./:=! 通貨記号           
                                           

したがって,小文字で FORTRAN プログラムを書くのは厳密に言えば文法違反 になります.

これらのFORTRAN文字を含めて,文字の内部表現方法はFORTRANの規格では特に 規定されていません.文字の内部表現方法は実数の場合と同様に,IBM規格で あるEBCDICと,アメリカの標準規格であるASCIIとに大別されます.

EBCDIC は,IBM によって定められた拡張2進化10進情報交換用コード (Extended Binary Coded Decimal Interchange Code)です. 富士通,日立な どのいわゆる IBM 互換の汎用機でも採用されていますが,各社で微妙に定義 が異なります.富士通のコードには,IBM規格以外の制御コードも定義されて おり,日立のEBCDIK(最後のKはカナ)ではアルファベットの小文字のコードが 異なります.

ASCIIコードはアメリカ規格協会(ANSI)で規定された文字コード体系です. UNIX, MS-DOS などで採用されている文字コードです.日本では,ほぼ同じも のがJIS X0201として規定されています. ASCII コードは7ビットで,最上位 桁は0ですが,JISには8ビット全部使ってカタカナまで規定した8単位符号表が あります.

詳細は,MISC1 のマニュアル(dcl-x.x/doc/misc1/gaiyou/char.tex)を御覧下 さい.


もっと座標軸

もっと座標軸

注文の多い目盛りうち

右も左も日付軸

好みの場所に好みの軸を

同じ側に何本もの軸を


計算機のなまり 4

ファイルの構造

ファイルの形式も機種によりかなり異なります.FORTRAN規格におけるファイ ルの属性は,基本的に,書式のありなし(FORMATTED/UNFORMATTED)とアクセス 方法(SEQUENTIAL/DIRECT)の組み合せで決ります.書式のありなしは,例えば WRITE文を実行するときに,内部表現を文字に変換するか,内部表現をそのま ま出力するかということを指定するものであり,いわば「ファイルの中身」を 指定するものです. 一方, アクセス方法の指定は文字どおり解釈すれば,順 番に読み書きするか,ランダムに読み書きするかという指定ですが,実際には 「アクセス方法」よりも,そのアクセス方法を実現する「ファイルの構造」の 方が問題となります.

規格上,DIRECT ファイルではレコード長を指定するRECL指定子を書かなけれ ばならず,SEQUENTIAL ファイルの場合には,これを書いてはいけません.つ まり,「アクセス方法」の指定は,DIRECT ファイルは固定長レコードのファ イルであり,SEQUENTIAL ファイルは可変長レコードのファイルであるという 「ファイル構造」を暗黙のうちに指定することになるのです.

FORTRANプログラム上の論理的なレコードが,実際に記録媒体の上でどのよう に記録されるかということに関しても,大きく分けてメインフレーム系(IBM系) とUNIX系の2種類あり,それぞれファイルの扱い方がかなり異なります.

詳細は,MISC1 のマニュアル(dcl-x.x/doc/misc1/gaiyou/file.tex)を御覧下 さい.


2次元量の表示

2次元量の表示

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

格子点が不等間隔の場合

配列の一部分だけを描く


FORTRANのひけつ 2

多次元配列の記憶順序

FORTRAN77では多次元(7次元まで)の配列を定義できますが,実際の記憶装置が 多次元構造を持っているわけではなくて,1次元的に管理されています.多次 元配列を1次元的に展開する順序は,FORTRAN77の規格で定めてありますから, 多次元配列を1次元配列と結合することが可能です.

例えば

REAL X(6), Y(2,3)
COMPLEX Z(3)
EQUIVALENCE (X,Y,Z)

という場合,変数 X, Y, Z はどれも長さが6語の配列で, EQUIVALENCE文により同じ記憶領域を占めます.この時, それぞれの変数の並 び方は

+----------+----------+----------+----------+----------+----------+
| X(1)     | X(2)     | X(3)     | X(4)     | X(5)     | X(6)     |
|----------|----------|----------|----------|----------|----------|
| Y(1,1)   | Y(2,1)   | Y(1,2)   | Y(2,2)   | Y(1,3)   | Y(2,3)   |
|----------|----------|----------|----------|----------|----------|
| Re(Z(1)) | Im(Z(1)) | Re(Z(2)) | Im(Z(2)) | Re(Z(3)) | Im(Z(3)) |
+----------+----------+----------+----------+----------+----------+

という様に,2次元配列 Y は添字の左側の数字から変るように1次元的 に展開されます.また,複素数データ Z は2つの実数が並んだ形で展開 されます.したがって,X(3) の数値は,Y(1,2), Re(Z(2)) と同じになります.

この規則は多くのプログラムで積極的に使われており,多次元配列を1次元配 列として扱ったり,複素数データを実数データと見なして処理したりすること が行われています.この規則は,計算機のハードウェアに近い部分の規則なの で,計算機によって異なるように思えるかもしれませんが,FORTRAN77規格で 定められた「標準語」です.例えば,「岩波FORTRAN辞典」(西村恕彦/酒井俊 夫・高田正之 著)の「記憶列の結合」を御覧下さい.


もっと2次元量表示

もっと2次元量表示

トーンパターンを指定する

ベクトル場のスケーリング

等高線とベクトル場の重ね書き


FORTRANのひけつ 3

サブルーチンにおける引数の結合

関数引用やサブルーチンの引用で引数によってデータの結合をおこなうとき, 配列の記憶順序を意識したテクニックがよく使われます.たとえば,第 [here]章のプログラム KIHON2 では,何の説明も無しにつぎの ように使っています.

CALL SGPLV( NMAX+1, X, Y(0,1) )
・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・
CALL SGPLV( NMAX+1, X, Y(0,I) )
FORTRAN では,配列の結合は次のように定められています:

仮引数が配列名である場合の実引数は,実引数配列の記憶列のうちで仮引 数と結合される部分の先頭の記憶単位を指定する.

この例のように,実引数が配列要素名であれば,その配列要素の記憶単位から 配列の最後の記憶単位までの記憶列が仮引数と結合されます.

つまり,配列がサブルーチンに渡されるとき,メインプログラムの配列の中身 がサブルーチンの配列の中身にコピーされるのではなくて,メインプログラム の中の配列の番地だけが渡されて,サブルーチンの方はその番地を基準にして データ列の処理を行なうのです.

このようなことを意識してプログラムを書くと,少ない引数で柔軟な処理が可 能になります.詳細は,「岩波FORTRAN辞典」などをお読み下さい.


欠損値処理いろいろ

欠損値処理いろいろ

ポリライン・ポリマーカーにおける欠損値処理

2次元量表示における欠損値処理

カラーグラフィクス

カラーグラフィクス

カラーマップ

カラーライン

カラートーン

地図投影や3次元図形も

地図投影や3次元図形も

いろいろな地図投影法

3次元透視変換

グラフィクス以外にも

はじめに

MATH1

MATH2

MISC1

ETC

付録

GRPHパッケージ一覧

フォント一覧

トーンパターン一覧

謝辞

CREDITS


Latex Source


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

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