LAPACKの使い方でいつも困るので自分用も兼ねてまとめる。
LAPACKのインストールの仕方については沢山サイトがあるので割愛。
- サブルーチンのリスト(マニュアル)
LAPACK95 -- Fortran95 interface to LAPACK
Index of LAPACK95 Routines
LAPACK95のサブルーチンのリスト。
スタンダードな感じの無味乾燥としたページ。
LAPACK95についてはこれで事足りる気がする。
LAPACKサンプルプログラム目次
nagによるサブルーチン(LAPACK)のリスト。
サンプルプログラムのソースも載っているが、nag独自のmoduleもガンガン使っているので、そのままコピペしても動かない。
入力データと出力結果の例が見れるのは良いと思うが、ページの見方に慣れが必要。
結局はリンク先のマニュアルページを見ることになる。
LAPACK
NECによるサブルーチン(LAPACK)のリスト。
一ページにサブルーチンの名前と簡単な説明が全部載っているので、何があるかザっと見るには良いページだと思う。
サブルーチン名をクリックした先にある詳細な説明も見易くて良い。
- LAPACKとLAPACK95について(1)
LAPACKでは、サブルーチンの名前は「"接頭辞" + "名前"」になっており、変数の型によって接頭辞を変える必要がある。
とは言っても、数値計算では倍精度の実数か複素数を使うことになるので、慣れれば気にならない。
一方、LAPACK95では、「"LA_" + "名前"」がサブルーチンの名前になっていて、変数の型を気にせずに呼び出すことができる。
- LAPACKとLAPACK95について(2)
LAPACK・LAPACK95を利用するには、対応したモジュールを使用することをプログラム内で宣言する必要がある。
use f77_lapack ! LAPACK use f95_lapack ! LAPACK95
両方を宣言する必要はない。LAPACKのサブルーチンを使いたいのか、LAPACK95のサブルーチンを使いたいのか、どちらかだけで良い。
この「f77_lapack, f95_lapack」というのは、moduleファイル(*.mod)ファイルの名前でもある。コンパイルする際には「f77_lapack.mod, f95_lapack.mod」が存在するPATHをincludeする必要がある。上手くコンパイルできないときは、一度確認することをお勧めする。筆者の場合には、"include"ディレクトリの中の"lapack95_modules"にmoduleファイルが入っていたため、"include"ディレクトリを指定しても上手く行かなかった。
- LAPACKとLAPACK95について(3)
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 ) ! input/output matrix A = reshape( [ cmplx( 1, 0 ), cmplx( 0, 2 ), cmplx( 0, -2 ), cmplx( 1, 0 ) ], shape( A ), order = [ 2, 1 ] ) ! LA_HEEV( A, W, (JOBS, UPLO, INFO) ) call LA_HEEV( A, W, 'V' ) ! 'V': eigenvector will be stored in A ! A( 1, : ) = i/sqrt{2}, -1/sqrt{2} ! A( 2, : ) = i/sqrt{2}, 1/sqrt{2} ! W = -1, 3 end program check_lapack95