gfortra,lapack,lapack95の導入の備忘録

導入した動機:シャック・ハルトマンセンサーで得られたデータから波面収差をzernike多項式で近似するためのプログラムをfortranで書くためにgfortranとlapack,lapack95を導入した。MacOSX 10.8にgfortran 4.2.1とlapack-3.4.1を導入した。

導入方法:
1.makefikeとか難しいことはよくわかってないので,他のホームページを参考にしながら導入した。参考にしたホームページは以下。
a.gfortranとlapackのインストール
b.LAPACK3.1 LAPACK95をコンパイルする
c.LAPACKの導入方法

2.bの解説で出てくるiforの部分はgfortranに置き換えて書き直した。.aファイル関係(lapack_LINUX.aとか)もlapack-3.4.1ファイルの中にある.aファイルの名前(liblapack.a,librefblas.a,libtmglib.a)に置き換えて書き直した。libディレクトリはないので,~/libに自分で作成した。
3.実際にLAPACKが使えているのかをテストした。テストファイルは,以下のよう。

program inv

use f95_lapack

implicit none
integer,parameter :: n=2
integer :: i,j
integer :: ipiv(1:n)
real(8) :: r(1:n,1:n)

write(*,'(A)') 'Input real matrix :'
do i=1,n
read(*,*) r(i,:)
end do

! LU分解後に逆行列を計算する
call LA_GETRF(r,ipiv)
call LA_GETRI(r,ipiv)
do i=1,n
write(*,*) (r(i,j), j=1,n)
end do

end program inv

コマンドは,gfortran test.f95 ~/lib/lapack95.a ~/lib/liblapack.a ~/lib/librefblas.aで実行した。gfortranの後に-moduleを入れないで実行する。実行結果は,以下のよう。
Input real matrix :
2 1
1 2
0.666666666666667 -0.333333333333333
-0.333333333333333 0.666666666666667

これで一応LAPACKは使えるようになった。
fortranのソースファイルとライブラリが同じ場所にあるときは,上の方法で実行できるけど,別の場所にある場合は,ライブラリの場所を指定する必要がある。指定の方法は,未だ良く分かってないから調べ中。

☆追記☆
ライブラリの指定の方法が上手くいかなかった原因は、usrとかlibディレクトリの存在を勘違いしていたからだと気付いた。libディレクトリが必要だからと思って、Users/***(user name)にlibディレクトリを作成していた。実際には作成する必要はなくて、/usrにlibディレクトリはある。Macintosh HDにあるUsersとusrは同じ階層にあるけど別もの。usrディレクトリは、Finderからでは表示されないので、Terminalからopen /usrと打ち込んでFinderに表示させる。usrディレクトリの中にlibディレクトリがあるから、そこに、libファイルとか、modファイルをコピーしてあげればよい。lapack95.aはlibファイルとして扱うために、liblapack95.aと名前を付け直す。これで、
gfortran test.f95 -I/usr/lib -llapack95 -llapack -lblas
とTerminalに入力すれば、test.f95がコンパイルされる。

参考にしたウェブページは以下。
Macの階層構造について:http://wakabamac.blog95.fc2.com/blog-entry-59.html
Lapackの使い方とかインストール方法とか:http://www.rcs.arch.t.u-tokyo.ac.jp/kusuhara/tips/linux/fortran.html#sec6