機械系エンジニアのための数値計算用ライブラリ考察(c++)

昨今の機械系エンジニアリングの舞台で、自分でわざわざコードを書くのは車輪の再開発で終わる事例が非常に多く、商用ソルバーを使用するほうがはるかに効率的である。

 

とはいえ予算の問題もある。数値計算手法や内部の物理は、自前でコードを書いて計算してみて初めて理解できる面もある。自作コード作成はたとえそれが貧相な車輪の再開発でしかなくても、本人にとっては非常に意味のあることだと信じたい。

 

しかし、だからといってフルスクラッチでコードの全てを書こうとするのは全くもって非効率である。時間の無駄である。

自分がやりたいメインの計算以外の箇所の実装にかかる時間はできる限り短くするべきだし、そのための努力は惜しむべきではない。

エンジニアは自分が楽をするためなら如何なる苦労をも厭わない人種である。

出典は知らないが、この言葉に従わないものはエンジニアではない。

 

以上から、機械系のエンジニアでわざわざ自作のコードを作成する場合、推奨される言語は今のところc++一択であろう。我々機械系が直面する偏微分方程式の解法では確実に大規模疎行列による連立方程式を解くことになり、かなり計算コストがかかる問題となる。もちろんCSR形式などにして簡略化はするものの、限度がある。高級言語であるMatlabpythonでは荷が重い。

Fortranは機械系では未だに使用者が多く嘆かわしい限りだが、これはおそらく所属先の上司からFortranを強制される・所属先で引き継いだコードがFortranといった日本社会の都合からくるものであろう。もちろんLapackなどFortran用のライブラリもあるが、数値計算に特化しているため画像の入出力などは全くもって不向きである。用途が限られてしまうため、その道のプロとして一生食べていく気がないなら、大人しく汎用性の高いC++を使用した方がいいように思うのだが…。

 

そういうわけで、様々な汎用性や豊富なライブラリを目指し、結局たどり着くのはc++である。

 

海外の研究者のウェブサイトを見ると、機械系で自作コードによる開発をしている人は、その多くがコードを公開しており、また、多くのオープンソースのライブラリを使用している。これはFortranによるフルスクラッチに慣れ切った日本のエンジニアにとっては一見殺しにも等しく、容易にマネできない。

こういうライブラリ関連の資料は書籍化されないため、コミュニティ全体の雰囲気としてライブラリの使用に興味がなければ、全く手法の改善が起きないのは困った問題である。

 

そういうわけから、機械系のエンジニアがC++で簡単に使える便利なライブラリを検討してみたい。

導入が簡単そうなのは、Blitz++やPETScだろうか。両方とも日本語の説明が少しはある。ともにC++Fortran並の計算速度を達成するためのライブラリ群となっている。配列を定義するとき、vectorを使わずこれらのライブラリが提供する形のものを使用すればよいだけである。PETScには連立方程式のソルバーも入っているので便利かもしれない。

 

また、下記のHDF5は地味にとても便利な気がする。

HDF5フォーマットに関するメモ書き - たまに書きます

大量の時系列データを特定のフォーマットで軽量かつ高速に管理できるなら非常に楽だ。可視化のインターフェースとしてXDMFファイルを用いれば、HDF5形式で保存した計算結果をそのまま可視化できる。まじめにこのライブラリの使用を以後検討してみる。

 

2016/2/26追記

 これまでの自身の低レベルな計算環境を払拭するためだけに、このような駄文を数か月前に書いた。上でこう言っているものの、小-中規模の計算ならばfortran90は良い選択肢の一つであるし、とにかく演算効率を求めるならばfortranは依然強い言語である。

 C++の良さは中-大規模コードの作成にあたり高い可読性を維持できるところにあり、豊富なライブラリの存在は副次的なメリットにすぎない。特に最先端のスパコンクラスタの使用において好きに外部ライブラリをインストールできない状況も多々あり、ここ数か月の試行から、結局必要に迫られて車輪の再開発をする曲面が多く生じることがわかった。ベクトル型とかスカラー型とか、自社開発のコンパイラとか、計算効率のためにそのスパコンに特化したプログラミングを要求される事例がわりと多い。機械系のエンジニアとして求められるプログラミングのスタイルを、まだ自分は見えないでいる。