Intel Math Kernel Libraryでの大規模疎行列の直接解法<動機>

そこらの教科書による独学で力学分野における数値計算を学び、プログラム実装を行う場合、悲しいことに、連立方程式のソルバの検討に一番時間を食う。

たいていの場合、学習者のレベルが上がるにつれて、使用するソルバは

直接法(ガウスの消去法・LU分解)

定常反復法(ガウス・ザイデル法、SOR法)

非定常反復法(CG法ベース)

という流れになるのではないだろうか。日本語の教科書にはそのように書かれているし。計算対象が大規模になるにつれ、直接法より反復法、それもCGベースの非定常反復法が持て囃されていく。

しかしながら、CGベースの方法は対角成分は他より相対的に小さい場合には、まー収束しない。ひどい場合は発散する。この手の問題はだいたい何かの連成問題で頻繁に生じる(複数構造物の接触、流体構造連成、電気機械連成など)。ただでさえ複雑な定式化、実装を抱えて疲弊しているのに。


そんな理由から、数値計算として十分研究レベルになりうるレベルの計算を行う場合、普通の非定常反復法のさらにその先がほしくなる。その一番手っ取り早い方法がLU分解ベースの直接解法である。古くはスカイライン法やウェーブフロント法などがあるが、並列化効率のよいマルチフロンタル法が提案・実装されはじめ、欧米発のライブラリが結構世に出ている。Intel math kernel libraryに付属しているPardisoも大規模疎行列の直接解法ソルバーである。ここではその使用方法を備忘録としてまとめておきたい。ま、マニュアルが相当充実してるので、その必要もないかもしれないけど…。