計算機・Fortranプログラミング(Fortranの役割)
化学工学分野で、何らかの計算を実行しなければならなくなった場合を想定してみて 下さい。計算の内容、規模、計算機の有無、スキルなど周囲の計算環境や自己の能力に依存して、選択肢 はたくさんあります。
ここでは、化学工学を習得したプロセス・エンジニアを想定し、Fortranコードを自ら作成・開発する ときのメリット・デメリットを紹介したいと思います。
自作コードの開発
プロセス・エンジニアのルーチン・ワークは、Microsoft Officeによる文書(報告書)作成、 既存ソフトによる計算処理、表計算ソフトによるデータの処理(計算を含む)が 大部分です。たいがいの業務は業務指示書や 基準書に従って処理すればよいワークです。しかし、研究・開発部門に在籍されているエンジニアでは頻繁に遭遇しますが、 あるときには指示書や基準書に記載されていないワークも当然発生します。このワークが計算を伴うものであったら あなたはどのように処理しますか。
問題が四則演算や簡単な数学関数だけ解けるのであれば、Excelのワークシート上で、チョコチョコと セルに数式を入れて計算してしまうかも知れません。1回だけの計算なら、関数電卓で 計算し、結果だけを報告書に打ち込むかも知れません。 問題がこれから将来にわたり、何回も繰り返されると予想されるときはExcelのワークシートで計算し、ファイルに計算の 過程を残すことをします。
問題が少し複雑になり、たとえば収束計算になったりしたら、やはりMicrosoft Excelの VBAマクロで記述したり、アドインのゴールシークで間に合わすかも知れません。
問題が更に複雑化、高度化したとき、あるいは自分の手に負えないときは、他所の人や 専門家に依頼することをします。コードを書ける人はVBAでBasic言語で、得意のC言語で さらに、昔とった杵柄でFortranコードに挑戦するのもいいでしょう。
化学工学のプロセス計算で用いられる計算ツール(PCソフトに限定)として考えられるのは 次のツールです。
- Microsoft Excelによる表計算のみ
- Microsoft Excelによるマクロ利用、VBAコードによる計算
- C、C++、Fortranなどコンパイラ言語による計算
当サイトでは、3番目のFortran言語によるアプリケーション・計算ライブラリの作成に重点をおいています。
Fortranについて
ほかの言語、たとえばC言語に比べ、高級言語であるFortranは技術計算に特化しており、 文字列処理やファイル操作など不得意な分野はあるものの、技術者が技術計算で利用する には最も適したコンパイラー言語であると言えます。最近のFortranでは文字列処理や ファイル操作といった処理もできるようになっています。1970年代の大型計算機の Fortran IV(フォー)の時代とかなりのギャップがあります。
また、最近のCPUの性能向上があり、ちょっとした計算もFortranコードで作成し、Excelの外部 関数として利用することもできます。
技術計算の分野では、コードの一行一行を先頭から順番に処理するプロシージャ系の 計算が多く、一方、Windowsアプリと呼ばれるソフトは、マウスをクリックしたとか、 キーボード入力があったとか、イベントがあったときに動作するイベント・ドリブン系のプログラム が主流です。Fortranでイベント系コードを作成できますが、30数年のキャリアを 自負するわたしはいまだイベント系コードを開発したことは数例にしか過ぎません。多くはプロシージャ系 コードを開発し、Dos Prompt上で実行し、結果をテキストファイルに落とすことで出力 を得ます。出力ファイルをCSVファイル(*1)に落とせば、そのままExcelで開くことができます。 イベント系では不必要な部分が多く、余計な心配というか実行速度を上げることに集中 した方がトータルの効率がよい。
また、Fortranコンパイラーを用いて、DLLファイルを生成し、これをExcelから呼び出す ことができます。Excelの作り付けの関数(たとえば sin(), cos(), log(), exp()など)と同じ ようにワークシートから、DLL中のユーザー定義の関数を呼び出し、計算結果をセルに 出力することができます。
流体解析(CFD, Computer Fluid Dynamics)のように大量の出力があるときには、 ファイルに計算結果をBinaryで出力・保存し、別の描画プログラム(やはりFortranで 作成、OpenGL利用)でイベント・ドリブン系のプログラムを作成したこともあります。
Fortranの将来展望
CPUの高速化が2000年代に頭打ちとなり、処理能力の高速化は次第にマルチグリッドを 含むマルチCPU化による高速化に移行しています。こうしたマルチコアを利用する 並列化計算への対応が急務となりつつあります。
現在利用できる並列化手段として次のものがあります。
- Compilerによる自動並列化
Intel Visual Fortran(最近はComposerとかに名称変更されている)のコンパイル・オプションに "/parallel"があり、自動並列化できる。効果は限定的。 - OpenMPによる並列化
OpenMPコンソーシアムによる国際標準化団体が規定する並列化手段。多くのコンパイラー 開発企業がサポートしている。コードに、OpenMPのDirectiveを埋め込み この部分を並列化し、マルチスレッドによる同時実行を行う。プログラマーの負担は少ないが 効果は限定的。 - MPI(*3)による並列化
コード中にスレッド毎に命令コードを割り当て、スレッドがメッセージを交換しながら並列実行をする方法で、 プログラマーの負担が大きいが、効果は大きい場合もある。
並列化については、これから発展する可能性が高く、「地球シミュレータ」、「京」と いったスーパーコンピュータ用はとにかく、民生用のマルチコアCPU搭載のPC上で、 プロセス業務を並列化計算で実行することがこれからの有望な分野と考えられます。
並列化についての話題は、 ここで取り扱っています。 また、VBA経由でDLLを利用する話題については、 ここで取り扱っています。
Fortran以外の言語で、C、C++、Java、Basicなどの話題は、 ここで取り扱っています。
- note
- 1) CSV (Comma Separated Values)は、コンマで区切られたテキスト・データを羅列したファイル形式。
- 2) DLL (Dynamic Linkage Library)は、実行時にリンクされる外部計算プログラム。
- 3) MPI (Message Passing Interface)