トップ > ライブラリ > 計算機 > データ処理・グラフィックス

計算機・データ処理とグラフィックス

現在工事中です。ここではFortran言語を用いたグラフィックス描画についての知見を解説します。 Fortranによる計算結果をグラフやグラフィックスで表現・表示することにより、ユーザーにとって直観的で分かりやすい形式の出力を得ることができます。

Fortranによる技術計算では、大量の計算結果をユーザーが計算による結果が容易に判断・理解できるようデータの加工をする必要があります。ここでは手間をかけずに、また手間をかけたなりの美しいグラフィック出力を得るための情報を提供します。

先頭に戻る

データ処理について

Fortranコードで技術計算を実行すると、計算の規模にも依存するが、大量の数値出力の結果が得られる。数値形式のままファイル等に保存して、印刷しても数字の羅列だけで計算結果に何らかの工夫を施し、理解しやすいように加工する必要があります。 計算結果を見易く加工するためには、MS-Excelのような外部アプリケーションを利用する方法や、独自にグラフを描画する(一昔前のプロッター出力する)方法、ディスプレイ画面に3Dイメージで描画する(OpenGL)方法など多くの出力方法が選択できる。

以上のように、Fortran言語を用いて、大量のデータを加工する方法として、次の3つが考えられる。

もちろん、言語としてFortranを用いる必要はないが、環境さえ整えれば、Fortran言語でも充分なコードを描画することができる。 ここでデータ加工とは、計算結果を何らかの処理をするだけでなく、電子ファイル化を行い、電子ドキュメントとして計算結果を保存するまでの処理をいう。

このデータ処理方法は、一番上の既存アプリを利用する方法が最もFortranプログラマーにとっては容易な、グラフィックス処理を一切しない手軽な方法になる。そしてQwinやOpenGLなど独自のアプリケーションを開発するとなると、 対象にもよるがハードルが高くなり、一朝一夕にアプリを開発することは難しくなる。

【注】1980-1990年代のNEC PC98シリーズのパソコンでは、N88Basicによるグラフィックスが全盛であり、Basicに慣れた方はQwinグラフィックスはとっつき易いと思う。

以下データ処理方法の得失を簡単に紹介する。

先頭に戻る

MS-Excelのグラフ機能

既存アプリケーションの利用は、具体的にはMS-Excelのグラフ表示機能を流用することを指している。MS-Excel(以下Excelと称す)では2次元の表形式に数値を並べれば、Excelの持つグラフツールで多くの種類のグラフを作成することができる。 Fortran側で、行と列の出力数値の桁位置を揃えてファイルにテキスト出力することにより、Excel側でファイルを読み込むとき固定フォーマットで読み込み、各数値をセルに配分することができる。 Excelでは、CSV(comma separated values)ファイルの読み込みをデフォルトでサポートしており、Fortran側でCSV形式で計算結果を出力すれば、Excelで読み込み可能となり、テキストファイルの読み込みに比べ手間が削減できる。

流体解析(CFD)以外のシミュレーションなど極めて大量の数値出力がある場合を除き、Excelのグラフ描画機能を利用するのが最も簡便な手段である。

反応器シミュレータをFortranで作成し、DLL化し、入出力をExcelシート上で実施するように作成すれば、その出力シート上にExcelのグラフツールでグラフ化するよう組んでおけば、Excelのシート上のボタンをクリックすることにより、シミュレーションの実行から結果のグラフ化までが自動でできる。 入力条件をいろいろ変えたケーススタディを簡単・容易にできる。

CSV形式のファイルを、Fortranから出力する方法については、また別のところで解説する。

先頭に戻る

Qwin (Quick Win)による独自アプリ

昔のMS Power Fortranをはじめ、DECのVisual Fortran、CompaqのVisual Fortan、そして現在のIntel Visual Fortran(以下IVF)と、以前からあるグラフィック機能である QWIN(Quick Windows)を使うグラフィックス描画方法がある。点を打つ、線を描く、文字を描くなどの基本ルーチンをユーザーが利用することができる。この方法はディスプレーやプロッターに出力することを想定しており、いわゆるドロー系のソフトを開発することになる。

プリミティブなルーチンだけで、Excelのグラフと同等なグラフを描くにはかなりの手間を必要とする。円を描く、矢印を描くなどグラフィック要素を描くためのグラフィックス・ライブラリを独自に開発しておく必要がある(注)。

(注)DOSVマシンが出始めたころ、HPGL(Hewlett Packard Graphics Language)といったプロッタで作画することをした経験がある。プロッタ出力をする前に画面に出力してプリビューするためのライブラリを、QWINを利用して作成した経験がある。

QWINは、DOS Promptから起動するが、Fortranプログラマーにとっては、作るのはそれほどハードルは高くないと思う。

QWIN以外に、純粋にFortran言語で描画用のWindowsアプリを開発することもできるが、Windows OS自体の仕組み・知識が必要になるため、ハードルというか敷居は高い。

先頭に戻る

OpenGLによる独自アプリ

OpenGLによる描画は、3D表現が可能でしかも高精細なグラフィックスを描画できるため、利用価値は高い。

流体解析ソフトなど、三次元解析の結果を、ディスプレイ上で3D表現でき、しかもグラデーションを施す、視点を変える、回転させるなどいろいろな機能を盛り込むことができる。

Fortranを用いたOpenGLは、次のサイトが参考になる。情報がやや古いが、OpenGLのアプリを自作する場合には必見と思う。以前はDEC Visual Fortranでアプリを開発したが、Intel Fortranでもアプリをコンパイルできる。
f90gl-1.2.15: http://math.nist.gov/f90gl/から

なおOpenGLにより、グラフィックス描画をするため、ほかのライブラリGLUT、GLU、GLAUXを必要とする。これらもダウンロードします。
gut-3.7: http://www.opengl.org/resources/libraries/glut/から
glut-3.7.6: http://user.xmission.com/~nate/glut.htmlから
glaux: http://www.asahi-net.or.jp/~YW3T-TRNS/opengl/glaux/index.htmから

glauxは必須ではないが、aux系のコマンドを利用するときは必要。

先頭に戻る

MS-Excelを利用したグラフ化

MS-Excelの持つグラフィックス機能のうち、各種のグラフ作図機能を、Fortran側で何とか利用しよう、また手軽に描画させようという考えが発端である。 すでに市販のプロセスシミュレータASPENやPro/2ではその出力(たとえば物質収支や熱収支など)をExcelへ出力する機能が標準となっている。

同様にFortranプログラムによる技術計算の結果を、Excelに取り込み、Excelのグラフ機能を利用することを考える。Excelは基本的に行と列の二次元配列を取り扱っており、三次元配列はそれほど得意ではない。 そのため三次元流体解析の結果をExcelで処理しようとするには無理があり、せいぜい二次元解析の結果で、それほどデータ量が多くないことが要求される。

化学工学エンジニアは、多くの場合、Excelを使った日常業務を行っているので、計算結果をExcelに取り込みグラフ化することで、報告書の作成や検討書の作成が同じ土俵の上で実現できることのメリットは非常に多い。

反応器シミュレーションに限らず、単位操作と呼ばれる化学工学の分野ではそれほど大量のデータ処理を行う訳でもないため、Fortranで作成したプログラムをExcelを通してコントロールすることができれば業務効率の改善につながる。

Fortranアプリ側からMS-Excelのグラフ化機能を利用するとき、次のようなデータの受渡方法がある。

こうした方法でExcelシート上に行と列でデータの組を構築すれば、あとはExcelのグラフ機能をもちいて種々グラフを作成することができる。

先頭に戻る

テキストファイルの読み込み

Fortranアプリ側で計算結果をテキストファイル出力を行い、このテキストファイルをExcelで読み込む。テキストファイル1行が、セル1つに割り当てられ、複数行に亘るときExcel側でも複数のセルに割り当てられる。 セルに割り当てられた数値が、スペース区切りで複数個含まれるとき、データツールでその区切り位置をExcelに指定することにより、1行のテキストを複数列のセルに分割することができる。

例えば、次の出力はほぼ固定フォーマットのテキストであり、これをExcelで読み込むと先頭のA列に一行が割り当てられる。

リスト1:テキストファイルの例

  変数             平均         分散     標準偏差       最大値       最小値
  -------------------------------------------------------------------------
   X( 1)         18.625      260.240       16.132       50.000      -10.000
   X( 2)          1.193        0.165        0.407        2.181        0.466
   X( 3)          0.371        0.121        0.348        1.384        0.005
   X( 4)          2.458        1.350        1.162        6.585        0.459
   X( 5)          7.454        2.422        1.556       10.737        4.271
   X( 6)          7.261       34.561        5.879       26.064        0.000
   X( 7)          0.003        0.000        0.000        0.004        0.003
   X( 8)          0.008        0.000        0.001        0.011        0.007
   X( 9)         53.785    42474.473      206.093     1301.304        1.000
   X(10)         80.691    21655.135      147.157      820.198        0.000
   X(11)          0.994        0.500        0.707        3.114        0.000
   X(12)          1.475        3.226        1.796        9.699        0.000
  -------------------------------------------------------------------------

Excelのデータツールを利用して、各数値(ヘッダを含め)をセルに分配することができる。

図1:Excelのデータツール(クリック:拡大)

テキストファイルの読み込みとしてExcelシートに値を取り込むほかにも、テキストファイルを部分的にCopy & Pasteすることにより取り込み、上のデータツールを用いてセルに再配置することができる。

先頭に戻る

CSVファイルの読み込み

Excelの機能として、CSVファイルをもともとサポートしている。そのためFortranアプリ側で計算結果をCSV出力すれば、そのまま手を加えることなくExcelで読み込むことが可能である。

CSV(Comma-Separated Values)ファイルは、いくつかの項目をカンマ","で区切ったテキストファイルであり、リスト2にサンプルを示す。

リスト2:CSVファイルの例

,,,Main Feed,Sum of Side Feed,Sum of Inlet,Outlet
,Molar Flow Rate      ,[kmol/s] , 0.64130583E+00, 0.00000000E+00, 0.00000000E+00, 0.70297278E+00
,Mass  Flow Rate        ,[kg/s] , 0.11273056E+02, 0.55497222E+01, 0.16822778E+02, 0.16822736E+02
,Volume Flow Rate       ,[m3/s] , 0.14575970E-01, 0.00000000E+00, 0.00000000E+00, 0.21776283E-01
,Pressure                ,[MPa] , 0.80000000E+01, 0.00000000E+00, 0.00000000E+00, 0.79821959E+01
,Temperature            ,[degC] , 0.12000000E+03, 0.00000000E+00, 0.00000000E+00, 0.16810663E+03
,Density at 0degC      ,[kg/m3] , 0.86880000E+03, 0.00000000E+00, 0.00000000E+00, 0.90656197E+03
,Density               ,[kg/m3] , 0.77340000E+03, 0.00000000E+00, 0.00000000E+00, 0.77252559E+03
,Molar Density       ,[kmol/m3] , 0.43997471E+02, 0.00000000E+00, 0.00000000E+00, 0.32281578E+02
,Specific Heat       ,[kJ/kg/K] , 0.50639201E+01, 0.00000000E+00, 0.00000000E+00, 0.41489851E+01
,Viscosity                ,[cP] , 0.11262080E+00, 0.00000000E+00, 0.00000000E+00, 0.64583997E-01
,Ther.Conductivity     ,[W/m/K] , 0.36897212E+00, 0.00000000E+00, 0.00000000E+00, 0.14792208E+01
,Enthalpy              ,[kJ/kg] ,-0.10224283E+05, 0.00000000E+00, 0.00000000E+00,-0.69447020E+04
,Av.Molecular Weight ,[kg/kmol] , 0.17578283E+02, 0.00000000E+00, 0.00000000E+00, 0.23930849E+02
,Space Velocity          ,[m/s] , 0.86672406E+00, 0.00000000E+00, 0.00000000E+00, 0.73921227E+00
,Conversion     ,[wt.base] , 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99999992E+00
(途中省略)
----- Physical Properties Profiles -----
No,Z[m],Time[s],P[Bar],T[degC],U[m/s],Conv[-],Den[kg/m3],Vis[cP],Cp[kJ/kg/K],H[kJ/kg],THC[W/m/K]
Inlet, 0.00000000E+00, 0.00000000E+00, 0.80000000E+02, 0.10058786E+03, 0.10970405E+01, 0.00000000E+00, 0.86548124E+03, 0.14174591E+00, 0.39487352E+01,-0.77604065E+04, 0.33120350E+00
    1, 0.00000000E+00, 0.00000000E+00, 0.80000000E+02, 0.10058786E+03, 0.10970405E+01, 0.18919777E-15, 0.86548124E+03, 0.14174591E+00, 0.39487352E+01,-0.77604065E+04, 0.33120350E+00
    2, 0.20000000E+01, 0.18231881E+01, 0.79999284E+02, 0.10055170E+03, 0.10969795E+01, 0.73850181E-03, 0.86552930E+03, 0.14180501E+00, 0.39485483E+01,-0.77604937E+04, 0.33135630E+00
    3, 0.40000000E+01, 0.36464754E+01, 0.79998568E+02, 0.10051656E+03, 0.10969198E+01, 0.14803722E-02, 0.86557640E+03, 0.14186252E+00, 0.39483653E+01,-0.77605761E+04, 0.33150812E+00
    4, 0.60000000E+01, 0.54698599E+01, 0.79997852E+02, 0.10048243E+03, 0.10968614E+01, 0.22256806E-02, 0.86562254E+03, 0.14191845E+00, 0.39481865E+01,-0.77606537E+04, 0.33165897E+00
(以下省略)

Fortran側で、Delimiterを1文字の変数とし、CSV出力のときは","(comma)を、テキスト出力のときは" "(space)にすることにより切り替えることが可能となる。

先頭に戻る

FortranアプリをDLL化(VBA経由で取り込む)

図2:VBA経由DLL利用(入力)(クリック:拡大)

図3:VBA経由DLL利用(出力)(クリック:拡大)

VBA・DLLとの連携のところでも述べたように、アプリケーションの規模にもよるが、ExcelのVBAを通してFortranプログラムを呼び出し、シミュレーションを実施し、終了後再びExcelに戻るという手順が考えられる。 FortranプログラムをDLL化することができれば、Excelから入出力制御することが可能であり、出力を表形式でワークシート上に吐き出すようにすれば、Excelのグラフ作成ツールで描画することが容易にできる。

簡単な蒸留計算(化学工学の分野で頻繁に利用される単位操作:蒸留塔の操作型問題を解く計算)をDLL化したとき、蒸留計算の入力データのサンプルを図2に示す。入力データのシート上に計算実行ボタン、計算結果のクリアボタンなどを配置し、データ作成が完了したら、ボタンをクリックすることにより蒸留計算を実行するよう、VBAを組んだ例である。

同様に、蒸留計算(DLL)の結果を、Excelの出力シート上に吐き出した例を図3に示す。

出力シートの計算結果(温度分布、成分濃度分布、気液流量分布などの蒸留塔内の分布)を、Excelのグラフツールでグラフ化することが可能となる。

蒸留計算以外にも、反応器のシミュレーションなど問題が大きくなければ、ほとんどの化学工学計算をDLL化し、Excelから入出力と実行を制御することが可能となる。

逆にExcelで不得意な、三次元データ処理、流体解析のような数万から数百万点の大量データの処理、計算時間がかかる処理(大きな収束計算、繰り返し計算)などは、VBA経由でExcelから利用するメリットはない。専用のアプリケーションとして開発し、グラフ化などは次のQwinやOpenGLで表示した方が望ましい。

先頭に戻る

Qwinグラフィックス

Qwinグラフィックスによるアプリ開発の詳細は、Fortranコンパイラーに付属する文書を参照していただき、ここでは省略する。 ただし、Qwinを利用したサンプル出力例を図4に示す。

図4:Qwinグラフィックス出力(クリック:拡大)

図4は二次元正方キャビティフロー(Re=100)の流体解析結果を示している。キャビティフローとは、無限に長い正方形流路を考え、その中に粘性流体が充満している。上面の蓋が一定速度で右方向に移動するとき、内部流体が粘性により定常渦を生成する。この流体挙動をxyの2次元で解析しようとするものです。

流体解析の結果表示をQwinで描画したとき、 左は流線の等高線を、右は渦度の等高線を示している。 四隅の等高線がぎざぎざになっているのは分割数を20とし、メッシュが粗いためである。

Qwinグラフィックスによる図に示した描画は、むかしのプロッター出力をディスプレー画面上に再現しようとしており、Fortranユーザーにとってはとっつき易いグラフィックス描画方法と思われる。1980-1990年代のPC98系パソコンで動いたN88Basic言語のグラフィックスとある面で類似している。

先頭に戻る

OpenGLグラフィックス

上のQwinグラフィックスに比較して、さらに高度なグラフィックスであるOpenGLによる描画をFortran言語を使って行うことができる。そのためにはフリーのパッケージf90glを必要とする。またMicrosoftのSDKパッケージやフリーのGlutパッケージを入手する必要がある。

OpenGL環境の整備

OpenGLをFortranで使うときに必要なLibraryは次のとおり。

4),5)のライブラリは、Glut-3.7.6パッケージから、Microsoft Visual StudioからC言語のコンパイラーを用い作成することができる。

7)のglauxライブラリは、必須ではないがaux系のOpenGLルーチンを呼び出すとき利用することがある。

1),2),3)のライブラリは、f90glパッケージから、ソースコードをIntel Visual Fortranでコンパイルすることにより得られる。得られたライブラリ、ヘッダファイルなど適当な場所にコピーしておく。 詳しくはパッケージのインストール説明を参照されたい。

6)のライブラリは、Microsoft SDKツールのライブラリに収録されている。

こうしたライブラリファイル、ヘッダーファイルをIntel Fortranで利用するときその置き場所をパスが指すよう環境変数をセットしておく。

そのほかあると便利なツールとして、OpenGLで描画した画面をJpeg保存するツール(jpeg-6bパッケージ)をインターネットからダウンロードしておくと便利である。C言語のルーチンでFortran言語から利用するときMixed Languageとなる。

先頭に戻る

OpenGLの概要

OpenGLの最も大きな特徴は、三次元グラフィックスを描画できることである。二次元はもちろん、陰面消去、視界変換、回転・移動・拡大・縮小、光源・シェーディング機能、テクスチャマッピング、アンチエイリアシングなどがサポートされている。

最近のFluent、Star-CDなどの流体解析ソフトのグラフィックス表示はOpenGLを利用し、精細で見た目の美しい描画が特徴となっている。

Fortranプログラマが、OpenGLのコーディングするとき、Fortran言語はプロシージャ・ドリブンで実行順序に従ってコードを描いていくが、OpenGLグラフィックスでは、イベント・ドリブンでコードを書く必要がある。Windows系アプリと同じように、キー入力があるとかマウスが移動すつ、クリックされたなどのイベントに従ってコードを作成する。 イベント・ドリブンのコードを作成するという意味では、Fortranプログラマにとってはハードルとなるかも知れぬ。

簡単なサンプルをベースとし、イベントに対応する機能を順次重ねていくことが早道となろう。

OpenGLの機能やコード例については、専門の図書を参照されたい。

先頭に戻る

OpenGLのサンプル

ここでは、過去作成したOpenGLをFortranから利用したサンプルを紹介する。

図5:OpenGLグラフィックス出力(クリック:拡大)

OpenGLの簡単な描画テストの画面をJpeg保存したものを図5に示す。コードはQwinグラフィックスと同じく、Dos Promptから起動し、描画用のWindowsが表示されその中にコードに従った描画がなされる。 イベント・ドリブン系コードであり、例えばマウスを移動することで表示した図形が回転したり、クリックすることでメニューを表示させたり、アニメーションも可能である。図5はその場面の瞬間を保存したものである。

図5にも一部表示しているが、色のグラデーションによる描画が利用できる。今まで等高線で描画していた図形を、こうしたグラデーション表示することにより、より一層表現力が高まっている。流体解析の計算結果を、グラデーションにより描画した例を図6に示す。

図6:反応器のOpenGLグラフィックス

先頭に戻る

関連ファイル

上に示したサンプルなどの関連ファイルのダウンロードは、こちら(未リンク)で取り扱っています。

先頭に戻る

Literature Cited

OpenGLに関連する書籍は、ほとんどがC言語によるアプリケーションが多い。 また1900年代後半はプロッタをはじめとする、CADやCGのドロー系のグラフィックス関連の資料が多い。

1),2)は、C言語ベースの入門書。

5),6)はQwinベースのグラフィックス用の上位ルーチンライブラリが掲載されており、図4の描画に利用している。

7),8)はOpenGLの公式ドキュメント。

先頭に戻る