地球流体電脳ライブラリ Q and A 集 保守管理者: Last updated:$Date: 2006/03/30 04:01:31 $ この文書は田中泰宙さんが作成した地球流体電脳ライブラリの問答形式 Tips 集を, バージョン 5.3 用に改訂したものです. 基本的な内容はメーリングリ ストで話題になった問答を基にしております. 項目の追加, 提案, 質問などは 保守管理者までご連絡下さい. 一般編 地球流体電脳ライブラリ(DCL)とは何ですか?

地球流体電脳ライブラリは FORTRAN77 で記述された可視化処理, 数 値計算処理, 文字処理用の関数群を集めたライブラリです. 簡易マ ニュアル『らくらく DCL』から一部抜粋すると以下の通りです. 地球流体電脳ライブラリ(DCL)は, 地球流体電脳倶楽部という集ま りの下で, 地球流体力学関係の研究者有志が長年にわたって開発, 改良, あるいは収集してきた「研究者による研究者のためのライブ ラリ」です. また, このライブラリは, 急速に変化しつつある計算 機環境に対応するために, 現在でもつねに開発, 改訂が行われてい る「生きているライブラリ」でもあります. 情報工学などとは畑違 いの者にとってこのようなライブラリを維持することは決して楽な ことではありませんが, 計算機の利用が不可欠となった現在, 我々 はあえてこの困難な作業に取り組み, 確実な技術に基づく地球流体 力学の着実な発展をめざしています. 具体的に何ができるのかについては『らくらく DCL』を参照下さい.

DCL にはどんな特徴があるのですか?

『らくらく DCL』マニュアルの 『はじめに』には, 次のように記さ れています. 地球流体力学という分野における, 特に大学での研究教育活動の現 状を反映して, DCLは次のような特徴を持っています. 「標準言語」としてライブラリの体系がわかりやすく, 柔 軟である. プログラムが適当に構造化され, 可読性が高い. 複数の計算機上で同じプログラムが実行できる. 標準的に FORTRAN 言語を使う. 高品質な2次元の図形出力がサブルーチンコールの形でで きる. 欠損値の存在するデータ(観測値)を, そのまま扱える. このうち1, 2 の特徴は大学で使うという事情を反映したものであ り, 3, 4 は現在の我々を取り巻く計算機環境に関係しています. また, 5, 6 は, 常に計算機の能力いっぱいの仕事が存在するとい う地球流体力学の特徴に関係するものです.

『DCL』って何の略ですか?

Dennou Club Library の略です.

DCL はどこから入手できるでしょうか?

電脳サーバーと呼ばれる WWW / Anonymous FTP サーバーから入手 可能です. URL は などです. それぞれの資源の著作権に関してはそれぞれの資源に記さ れている指示を守って利用するようにしてください.

DCL はフリーですか?

はい, フリーソフトウェアです. 著作権は GNU Public License に準 拠しております. 因みにパッケージ内の CREDITS には版権を以下の ように定めております. 本資源の版権は地球流体電脳倶楽部に属する. 資源の利用にあたっ ては地球流体電脳倶楽部の定める規定にしたがっていただきたい. 原則として, 教育的目的の場合には自由に使用・改変して良いもの としている.

地球流体電脳倶楽部のメーリングリストはありますか?

あります. を参照してください.

DCL の開発に参加したいのですが.

に御相談下さい.

インストール編 BSD 系オペレーティングシステムで DCL のコンパイルがうまくできません.

FreeBSD, NetBSD, BSD/OS などのBSD系の OS に付属の make では Makefile の include の文法が異なることがあるため, make が実行 できない可能性があります. その場合は GNU make (gmake)を使って みて下さい.

C版 DCL を一度ビルド後,

例えば demo/rakuraku/ ディレクトリにあるプログラム color1.c をコンパイル及び実行すると次のようなエラーメッセージが でるかもしれません. % cd demo/rakuraku/color/ % cdclcc color1.c % ./a.out WORKSTATION ID (I) ? ; 1:X, 2:PS, 3:Tek, 4:Gtk ; 1 *** MESSAGE (SWDOPN) *** GRPH1 : STARTED / IWS = -1. ***** ERROR (SWCMLL) *** COLORMAP LIST DOES NOT EXIST. IOT Trap Aborted これは最初の /usr/local) と, % rm src/math1/syslib/glcqnp.c % rm src/math1/syslib/gliqnp.c % rm src/math1/syslib/glrqnp.c を行ってから

因みにこの問題は2004年12月2日版より解決しております.

C版 DCL が Fedora Core 3 でインストールできません.

f2csrc/sle.c のコンパイル中に conflicting types for 'malloc' とエラーメッセージが出てビルドに失敗します. これは gcc-3.4.2 以降から型チェックが厳しくなったからのようです. f2csrc/sle.cextern char *malloc() という 記述を extern void *malloc() に変更することで対処でき ます.

この問題は dcl-5.3-C-20050523.tar.gz 以降で解決済みです.

Compaq Alpha に DCL をインストールする際 configure が途中でとまってしまうのですが.

もし止まっている個所が checking for C-equivalent to Fortran routine "SUB"... nm: conftest.o: File truncated であれば, /usr/bin/nm ではなく別のものが用いられている可能性が あります (例えば GNU binutils に含まれている 利用編 ウインドウのサイズを変えたいのですが.

SWPACK の内部変数 例 1) プログラムで CALL SWISET('IWIDTH', 600) CALL SWISET('IHEIGHT', 400) 例 2) コマンドライン引数から % ./a.out -sw:iwidth=600 -sw:iheight=400 例 3) 環境変数で (csh 系) % setenv SW:IWIDTH 600 % setenv SW:IHEIGHT 400 例 4) .dclrc というファイルを作り, そこに sw:iwidth 400 sw:iheight 400 と指定する. 環境変数の指定方法の詳細に関しては MATH1マニュアルの『概要/内 部変数』を参照して下さい.

なお, ウインドウ・マネージャーでサイズを変えようとしても, 図の サイズは変わりません.

以後内部変数の変更については例1〜4までのいずれの方法も適用でき ます.

ウインドウの表示位置を固定したいのですが.

SWPACK の内部変数 CALL SWISET('IPOSX', 30) CALL SWISET('IPOSY', 30) これは左上(原点)から右に30ピクセル, 下に30ピクセルの位置を原点と したウィンドウが生成される例です. X Windows システムではリソース 設定で geometry エントリに負値を指定すると x 方向は右から, y方向 は下からの値に読み替えられますが, ここではそのようにならないこと に注意が必要です.

PostScript 出力ファイル名を dcl.ps 以外に変えたいのですが.

SWPACK の内部変数 FNAME を設定すると変わります. 例え ば, プログラムで CALL SWCSET('FNAME', 'foo') とすると, PostScript 出力ファイル名は foo.ps になりま す. また, X Window システムにおけるのウィンドウダンプしたファ イル名は foo.xwd になります. 詳しくは GRPH1 のマニュ アルの 7.8.1 節を参照して下さい.(また, も参考になるでしょう.)

コーナーのマーク(┐)を消したいのですが.

SGPACK の内部変数 CALL SGLSET('LCORNER', .FALSE.) また, コーナーマーク付きで描かれた PostScript の図からコーナー マークを除去するツールとして

因みに dcl-5.3 からは規定値として フォントを変えたいのですが.

SGPACK の内部変数 CALL SGISET('IFONT', 2) ただし, 出力結果のファイルのサイズが少し大きくなります.

PostScript の図の場合, 座標軸の太さや色を変えたいのですが.

U[XYZ]PACK で座標軸を描いているいる場合, 座標軸のライン・イン デクス(線の太さや色などの属性) は, 内部変数 となっていますので, 例えばプログラム中で CALL UZISET('INDEXT1', 44) CALL UZISET('INDEXT2', 29) とすることにより座標軸は太くなり, 軸と大きい刻みは赤に, 小さい 刻みは青になります. 詳しくは GRPH2 マニュアルの U[XYZ]PACK の 章の『LLA における属性の指定方法』および UZpGET/UZpSET のパラ メーターの説明の項を参照してください.

グラフがビューポートをはみ出てしまいます.

CALL SGLSET('LCLIP', .TRUE.) のようにして, SGPACK の内部変数 CALL SGLSET('LCLIP', .FALSE.)

ポーラーステレオが円からはみ出して四角く描画されてしまいます.

ポーラーステレオに依らず, いずれかの地図投影を CALL SGSTXY(西端経度, 東端経度, 南端緯度, 北端緯度) と指定します. ポーラーステレオの場合には円形にクリッピングさ れます.

因みに

参考までにサンプルプログラムを添付します. PROGRAM TEST CALL GROPN(1) ! 画面に出力 CALL GRFRM CALL GRSVPT(0.2, 0.8, 0.2, 0.8) CALL GRSTRN(31) CALL UMSCWD(90.0, 90.0, 75.0) ! 円形のウィンドウを設定 CALL SGSTXY(-180.0, 180.0, 15.0, 90.0) ! 描画範囲を指定 CALL UMPFIT CALL GRSTRF CALL SGLSET('LCLIP', .TRUE.) CALL UMPMAP('coast_world') CALL UMPGLB ! 緯経線と地球の輪郭を描く CALL GRCLS STOP END ! PROGRAM TEST

ポートレート(縦方向)に出力したいのですが.

既に出力してしまった PostScript の図は

Bourne shell 系のシェルでは, 環境変数で DCL 内部変数を指定できないのですが.

sh 系のシェルは ":"が演算子として用いられるため, DCL 内部変数を 例えば $ export SW:IHEIGHT=480 のように設定することができません. そこで $ export DCLENVCHAR=_ $ export SW_IHEIGHT=480 のように環境変数 DCLENVCHAR を設定し, 外部からパッケージ名と内部 変数名のセパレータを変更することによって, 内部変数の値を環境変数 によって指定できるようになります.

コマンドラインオプションで内部変数を指定できません.

お使いのFortranコンパイラにサービス関数

関数 math2 の FFTPACK は本当に任意の長さのデータについて高速フーリエ変換ができるのですか?

その通りです. といっても高速フーリエ変換(FFT)となるのは, データ 長が 2nや (2i)(3j)(5k)のような場合の時で, データ長が素数の場合には単なるデジタルフーリエ変換となります. 時 系列解析でデータ数が多い場合には, 最初或は最後のデータを1個や2個 削ったところで結果が大きく変わることはありませんから, うまく約数 の多いデータ数に調節してあげると計算速度の向上に繋がるでしょう.

UDPACKで等高線を描いたときに, コンターラベルが図中にまったく表示されないことがあります

UDPACK で描かれるラベル付きの等値線は, GRPH1 の SGpGET/SGpSET が 管理する内部変数 'LCHAR' を .TRUE. に設定して,実際には線分を描 く下位ルーチンによって描かれてます. ラベル付き線分の描画において, ラベルを付けるか付けないかに影響する内部変数は以下の通りです. これらの内部変数を適宜調節すると等値線のラベルが表示されるように なります. 内部変数 | 説明 | 規定値 @ FWC | 文字列を描くための空白域の幅を全文字幅を単位としてどれだけとる かを指定する係数 | 1.25 @ CWL | 1サイクルあたり,線分部分の長さを文字高を単位として何文字分 とるかを指定する係数 | 30.0 @ LBUFF | 折線の終わりが文字列を描くべき空白部分であるとき, そこを線 分で結ぶためのバッファリングをするかどうかを指定する. .TRUE. の時にバッファリングを行い, .FALSE. の時にはしない | .TRUE. @ NBUFF | バッファリングをするときその長さを指定する | 20 @ LCURV | 折線のなす角が大きなところなどではラベルを書かないことを指定 する. 正確には, LCURV が .TRUE. で, かつ文字を書くべきスペー スが次のパラメタ RCURV の係数以下のときラベルを書かない. .FALSE. の時にはラベルを書く | .TRUE. @ RCURV | LCURV が .TRUE. で, かつ文字を書くべきスペースが次のパ ラメタ RCURV の係数以下のときラベルを書かない. | 1.0 @

UETONE でべた塗りをすると三角形の白抜きが発生するんですが.

これは src/grph2/uepack/uearea.f の不具合のようですが, dcl-5.3以 降では修正されています.

等値線図で, 横軸のタイトルが等値線間隔のメッセージよりも下に描かれてしまいます.

等値線間隔のメッセージとタイトルの両方とも描く場合には, 座標軸 →等値線の順に描くとタイトルが上, 等値線間隔のメッセージが下に なります.

UDPACK が描くコンター間隔に関するメッセージは, そのときの座標軸 情報(もっとも外まで文字が描かれている位置; 具体的には

そのため, 次に座標軸を描こうとするとタイトルがメッセージより下に 描かれることになります.

こういうときには, ある状態の座標軸情報を覚えるルーチン 等値線図で, 等値線のラベルの有効桁数を 3 桁から変更したいのですが.

CALL UDSFMT('(i4)') とします.

フォーマットについての詳細は「MISC1」マニュアルの FMTLIB を参照 してください.

地図投影で, ビューポートを変えても地図の縦横比が変わりません.

地図上の描画をする場合には縦横比が投影方法によって自動的に決定さ れますので, 自分が定めた縦横比を持つ仮想画面に描くことはできませ ん.

また, 縦横比が自動的に決定されることから, 指定したビューポート内 に地図がおさまらない場合もあります. その場合は, CALL GLRGET('rundef', rundef) CALL GRSVPT(vxmin, vxmax, rundef, rundef) と x 方向のビューポートを指定し, y 方向のビューポートを自動決定 させるとビューポートにおさまります.

前項のようにビューポートの y座標を不定にしたとき, 実際に使われる vymin, vymax の値を取得したいのですが, sgrget('vymin', vymin)では取得できません.

CALL SGQVPT(vxmin, vxmax, vymin, vymax) とすると, ビューポートの四隅の座標を取得することが出来ます(GRPH1 マニュアル 2.5.1 SGSVPT 参照).

ベクトル図で, 地図を描いた後にユニットベクトルが表示されません.

ビューポートの外に地図を描かないために, クリッピングを設定してい ませんか. 地図を描いた後は, クリッピングを設定解除しておきましょ う. CALL SGLSET('LCLIP', .TRUE.) CALL UMPMAP('coast_world') CALL SGLSET('LCLIP', .FALSE.)

海岸線を描くだけでなく, 陸地部分を特定の色で塗りたいのですが.

dcl-5.3 以降では正式に陸地部分を特定の色あるいはパターンで塗るルー チンを導入致しました. 陸地塗り潰しにはサブルーチン CALL UMISET('IPATLAND', 2999) とします. これは色が赤(色番号2)のべた塗り(パターン番号999)に設定 する方法です. また湖を陸地とは別の色で塗りたい場合には, CALL UMLSET('LFILLAKE', .TRUE.) CALL UMISET('IPATLAKE', 2999) とします. 上記3つの内部変数の規定値は以下の通りです. IPATLAND : 1999 : 黒のべた塗り IPATLAKE : 9999 : シアンのべた塗り LFILLAKE : .false. : 湖は塗りつぶさない

尚, このべた塗りに対応した海岸線データは現在までのところ, coast_world coast_japan のみです. また Fortran90 版 DCL にはまだ導入されておりません.

海岸線を描くように, 中国の省境が描きたいのですが.

DCLのパッケージには国境(border_world), アメリカの州境界 (state_usa), 日本の県境(pref_japan), 大陸のプレート境界 (plate_world)のデータが内包されております. これらは, 海岸線デー タも含めて, Fortranバイナリデータですが, もともとのデータは ASCII 形式で以下のような緯度・経度の並びになっています. N I maxLAT minLAT maxLON minLON LAT0001 LON0001 LAT0002 LON0002 LAT0003 LON0003 LAT0004 LON0004 LAT0005 LON0005 LAT0006 LON0006 .... ..... LAT_N/2 LON_N/2 ここで N はデータの個数(地点数×2), I はデータのインデクス値です では, I=1 が海岸線, I=2 が湖岸線を表すとしております. maxLAT, minLAT, maxLON, minLON はセグメントの北端緯度, 南端緯度, 東端経 度, 西端経度を表します. データは(緯度, 経度)の組が繰り返され, 各 行に5点分(10個のデータ)が収められています. 言うまでもありません が, (LAT0001,LON0001)〜(LAT_N/2,LON_N/2)は連続した折線でなければ なりません. 従って複数の折線の集合としてデータを構成する場合には (これが一般的ですが), 上のようなデータの塊が複数連続したものとな ります. 緯度・経度のデータは Fortran のF型書式指定で '(F8.3)' で 書かれています. このような形式のデータを準備した後に, パッケージ の src/env1/mapdata/ 以下にある cvmapd というコマンドを用いて, % echo province_china.asc province_china | ./cvmapd とすることにより, province_china というバイナリデータができます ので, このデータを

海岸線のように塗り潰しを行えるデータにするためには, 上の一塊のデー タの並びは任意の折線に対するものではなく, 一筆書きとなった海岸線 あるいは境界線に対するものとなります. また閉じた海岸線・境界線は 反時計回りに辿らねばなりません. 但し N の最大値は塗り潰しを行う ルーチンの都合で 16384 となっています.

dcl-5.2或はそれ以前のバージョンからdcl-5.3に更新したらカラーマップが使えなくなりました.

dcl-5.3 よりカラーマップの参照方法の仕様変更がなされました. これ までは ./colormap.x11 DUPATH/colormap.x11 DSPATH/colormap.x11 の順番に直接カラーマップファイル colormap.x11 を探しにいっていま したが, dcl-5.3 からは, まず ./cmaplist DUPATH/cmaplist DSPATH/cmaplist の順番に複数のカラーマップファイルが定義されているリスト cmaplist を探索し, 次に SWPACK の内部変数 ICLRMAP で定義されてい る値に対応する順番のファイルを同様の順番に探しに行くようになりま した. 規定値では ICLRMAP=1 なので, 探索するカラーマップファイル の規定値は cmaplist の1番目のファイル colormap_01.x11 となります. ここで DUPATH は DCL の各種データを保存しておくユーザ用のパス名, DSPATH はそれらのオリジナルがインストールされているパス名を表し ます. dcldbs コマンドで DSPATH の確認をすることができます.

dcl-5.2 以前までのように自分の作成したカラーマップファイル (mycolormap.x11) を読ませたい場合には, DUPATHあるいはカレントディ レクトリに 1 mycolormap My_Original_ColorMap という cmaplist を置くだけで実現できます. cmaplist の 1行目はデー タの個数, 2行目以降はファイル名, コメントの組を記載します.

鉛直σ座標系の数値モデルの計算結果を用いて鉛直断面図を描きたいのですが.

dcl-5.3.1 以降のバージョンには, 堀之内さんによる座標変換ルーチン の拡張が含まれており, それにより鉛直σ座標系で表現されたの3次元 変数の鉛直断面図を手軽に描くことができます. 詳細についてはパッケー ジ内の README_itr51 をご覧下さい. サンプルプログラムも記載してあ ります. σ座標系の描画例はパッケージ内の IMG_g2pk02.png でもご覧 頂けます.

DCLで作成した PostScript ファイルを TeX 文書に取り込む際に余白を取りたいのですが.

主に2種類の方法があるかと思います. 1つは TeX 側で適切な BoundingBox を設定してあげることです. \includegraphics*[llx,lly][urx,ury]{file.eps} と指定すると, 左下 (llx,lly) から右上 (urx,ury) までの領域をクリッ ピングしてくれます.

上記方法はクリッピングする位置が分かっている場合にはよいのですが, 通常は gv のような PostScript Viewer で位置を予め調べておくか, 或は試行錯誤で適切な位置を探す必要があります. そこで DCLではお手 軽に余白を取って新しい BoundingBox を設定するスクリプト dclpsmargin を用意しております. 余白は完全に消去するわけではなく, 規定値では図の長辺の 5% の余白を残すようにしてありますが, -m オ プションによりその割合を調節することも可能です. 図にコーナーマー クが存在する場合にはコーナーマークで囲まれた領域にクリッピングさ れるだけですから, 予めコーナーマークを削除しておくことが望ましい でしょう. を参照下さい.

出力デバイス依存の問題 ハードフィルを使った PostScript ファイルが PostScript Level 2 のプリンタで出力できません

ハードフィルを使ったべた塗りでは, PostScript の currentscreen オ ペレータの返り値を setscreen オペレータに渡すことにより, べた塗 りのパターンの設定を行っています. currentscreen オペレータの返り 値及び, setscreen オペレータのオペランドは言語レベル1では, frequency angle proc だけだったのに対し, PostScript の言語レベル2 より frequency angle halftone が追加されました. ここで frequency はカレント・ユーザ空間の単位 で表されたハーフトーン・スクリーンのセルの1インチあたりの数, angle はデバイス座標系に対するハーフトーン・スクリーンの回転角 (順方向は反時計回り), proc はスポット関数を記述した手続き, halftone はハーフトーン辞書を表します. currentscreen の返り値が どちらになるかは, デバイスがサポートしている PostScript 言語レベ ルとハーフトーンの定義の有無に依存します. dcl-5.1 以降のバージョ ンでは修正されているはずですが, 以前ではスタック最上部にある currentscreen の返り値が実行可能な手続きであると仮定して frequency angle {proc} setscreen とハーフトーンの設定をしていましたが, プリンタによっては上記2番 目のようにハーフトーン辞書がスタック最上部に置かれ, これが実行可 能でないが故にエラーが出ておりました. dcl-5.1 以降では proc に相 当する部分を即時評価される名前 (//proc) に変更しておりますので, currentscreen によってハーフトーン辞書が返るプリンタでもエラーな く出力されることと思います.

プリンタによっては中間調を自身で表現できるものもあり, そのような プリンタでは意図した通りのトーンパターンが出力されない可能性があ ります. そのため setscreen に変わる方法を考えなければなりません が, まだ実装はされていません.

言語・プラットホームについて DCL を Fortran 90 で使いたいのですが.

DCL の Fortran90 化プロジェクトにより, 現在では FORTRAN77 版 DCL のラッパールーチンとしての Fortran90 版 DCL が提供されております. 詳しくは を参照してください

Fortran90の特性を生かしたプログラミング手法により書き変える作業 はまだ行われておりません.

DCL を C/C++ 言語から使いたいのですが.

dennou davis プロジェクト により DCL の C 言語バージョンが以下の URLより公開されております.

あるいは, お手持ちのコンパイラで FORTRAN サブルーチンを C コンパ イラから呼ぶ方法があれば, C言語から使うことが可能です. 例えば, f2c の方法に従うものであれば, 関数名の後に "変数は全てアドレス渡しにする 多重配列の順番に気をつける 文字列を渡すときは文字列の長さを引数に加える などです. 詳しくは山口, 『UNIX Super Text (下)』,p.337 - 344 や Feldman, et al.: A Fortran-to-C Converter, Computing Science Technical Report No.149 などを参照し てください.

DCL は Ruby から使えますか?

オブジェクト指向スクリプト言語である のサポートは電脳 Ruby プロジェクトにて行われております. 詳しくは を参照してください.

DCL は Perl から使えますか?

正式にサポートされているわけではありませんが, 田中泰宙さんが作成 された, DCL を Perl から使うパッケージが存在します. パッケージは から入手して下さい. 残念ながら詳細を記したドキュメントはありませ んが, 使用上の注意を簡単に記したREADMEとサンプルスクリプトが内包 されております.

DCL は Microsoft Windows(TM)で使えますか?

『電脳ライブラリ Windows 版』というものがあります. 詳細は を参照して下さい.

DCL は Mac OS(TM), Mac OS X(TM)で使えますか?

Apple 社が無料で配布している MPW (Macintosh Programmer's Workshop)を利用してフリーの描画環境を構築する Mac OS 用のインス トーラ, 及び任意のコンパイラを利用する Mac OS X用インストーラが 以下のURLから提供されております.

また, 上の Mac OS X 用 DCL を Absoft で使う際の情報が以下のURLで 公開されております.