LAPACKの使い方でいつも困るので自分用も兼ねてまとめる。
LAPACKのインストールの仕方については沢山サイトがあるので割愛。
LAPACK95 -- Fortran95 interface to LAPACK
Index of LAPACK95 Routines
LAPACK95のサブルーチンのリスト。
スタンダードな感じの無味乾燥としたページ。
LAPACK95についてはこれで事足りる気がする。
LAPACKサンプルプログラム目次
nagによるサブルーチン(LAPACK)のリスト。
サンプルプログラムのソースも載っているが、nag独自のmoduleもガンガン使っているので、そのままコピペしても動かない。
入力データと出力結果の例が見れるのは良いと思うが、ページの見方に慣れが必要。
結局はリンク先のマニュアルページを見ることになる。
LAPACK
NECによるサブルーチン(LAPACK)のリスト。
一ページにサブルーチンの名前と簡単な説明が全部載っているので、何があるかザっと見るには良いページだと思う。
サブルーチン名をクリックした先にある詳細な説明も見易くて良い。
LAPACKでは、サブルーチンの名前は「"接頭辞" + "名前"」になっており、変数の型によって接頭辞を変える必要がある。
とは言っても、数値計算では倍精度の実数か複素数を使うことになるので、慣れれば気にならない。
一方、LAPACK95では、「"LA_" + "名前"」がサブルーチンの名前になっていて、変数の型を気にせずに呼び出すことができる。
LAPACK・LAPACK95を利用するには、対応したモジュールを使用することをプログラム内で宣言する必要がある。
use f77_lapack
use f95_lapack
両方を宣言する必要はない。LAPACKのサブルーチンを使いたいのか、LAPACK95のサブルーチンを使いたいのか、どちらかだけで良い。
この「f77_lapack, f95_lapack」というのは、moduleファイル(*.mod)ファイルの名前でもある。コンパイルする際には「f77_lapack.mod, f95_lapack.mod」が存在するPATHをincludeする必要がある。上手くコンパイルできないときは、一度確認することをお勧めする。筆者の場合には、"include"ディレクトリの中の"lapack95_modules"にmoduleファイルが入っていたため、"include"ディレクトリを指定しても上手く行かなかった。
LAPACK と LAPACK95 で引数が異なることがある。
大体の場合、LAPACK95の方が楽ちんだと(勝手に)思っている。
例えば、複素エルミート行列の固有値と固有ベクトルを求める「ZHEEV or LA_HEEV」を見てみると、
! LAPACK
SUBROUTINE ZHEEV (JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, INFO)
! LAPACK95
SUBROUTINE LA_HEEV( A, W, JOBZ=jobz, UPLO=uplo, INFO=info )
LA_HEEVの場合には、二個引数を入れるだけで動いてくれる(後ろの3つはoptionalだから指定しなくても可)が、ZHEEVは毎回全ての引数を用意しないといけない。
また、両者で引数の順番が違うことにも注意。LAPACKの方を知っているからといって、LAPACK95をマニュアル無しで使おうとすると失敗する。
試しにLA_HEEVを使うと、
program check_lapack95
use f95_lapack, only : LA_HEEV
implicit none
integer, parameter :: dp = selected_real_kind( 8 )
real( dp ) :: W( 2 )
complex( dp ) :: A( 2, 2 )
A = reshape( [ cmplx( 1, 0 ), cmplx( 0, 2 ), cmplx( 0, -2 ), cmplx( 1, 0 ) ], shape( A ), order = [ 2, 1 ] )
call LA_HEEV( A, W, 'V' )
end program check_lapack95
コンパイルする際は、includeファイルとlibraryに関するコンパイルオプションをお忘れなく。