疎行列連立一次方程式(Ax=B)の計算には,MKLに収録されている”PARDISO”を使っていたが,環境をintel fortran + MKL からgfortran + Lapack95 に移行したのに合わせて,”SuperLU”に移行したのでメモ.(OSは,fedora 22)
まず,SuperLUをインストール.
#dnf install SuperLU
次に,正常にインストールできていることを確認する.
サンプルコードを入手するため,まずSuperLU本体をココ(http://crd-legacy.lbl.gov/~xiaoye/SuperLU/)からダウンロードする.
次に/SuperLU_*/EXAMPLE (*はSuperLUのver.)の中に入っている,”superlu.c”を以下コマンドでコンパイル/実行する.(ここで,superlu.cの冒頭を”int main(int argc, char *argv[]”と書き換えないとコンパイルは通らないので注意.)
$gcc -lsuperlu -I/usr/include/SuperLU superlu.c
$./a.out
正常なら上記コンパイル及び実行ができるはず.
C言語からはSuperLUを直接利用できる.しかし,FortranからSuperLUを使用する場合,ラッパーを書いてあげる必要がある.(/SuperLU_*/FORTRAN 内のファイルを参考にすると良い)
そこで,ラッパーとなるCプログラム(dgssv.c)と,SuperLUを呼び出すFortranプログラム(test.f90)を書いてみた.
なお,test.f90では例として,
A =
1 2 3 0
0 0 0 1
2 0 0 2
0 1 0 1
B =
2
3
1
2
の疎行列連立方程式を解くこととしている.
SuperLUでは,CRS形式またはCCS形式(疎行列の格納方法はココを参照)等の疎行列格納方法を使用できる.今回はCRS形式を使用することとしている.
もし,CCSなど別の形式を使用したい場合は,dgssv.cの中身を書き換える必要がある.(superlu.cはCCS形式で計算しているので,比較すればどのあたりを変えればいいかわかるはず.)
また,FortranからC言語で書いたプログラムを呼ぶ場合は,配列の処理等々注意する必要がある.(ココを参考)
dgssv.c と test.f90をコンパイルするには,以下コマンドを叩く.
$gcc -c -I/usr/include/SuperLU dgssv.c
$gfortran -lsuperlu -lblas dgssv.o test.f90
うまくコンパイルできていれば,”a.out”ができているので,実行すれば以下が表示されるはず.
$./a.out
Success dgssv
-2.5000000000000000
-1.0000000000000000
2.1666666666666665
3.0000000000000000
参考だがSuperLUでは,様々な設定ができる.具体的にはdgssv.cの中の以下で設定している.
set_default_options(&options);
options.ColPerm = NATURAL;
上記では,まずすべての設定をデフォルトとし,そのうち”ColPerm”の内容だけ,”NATURAL”に変更している.
なお設定項目の詳細は,/SuperLU_*/DOC 内のSuperLUのマニュアルに記載してあるので参照のこと.
参考
http://www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html