nano_exit

基礎的なことこそ、簡単な例が必要だと思うのです。

LAPACK・LAPACK95の使い方。

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

コンパイルする際は、includeファイルとlibraryに関するコンパイルオプションをお忘れなく。