Windowsでlapackは使える???
数値計算の世界で欠かせない存在であるFortranとBLAS、LAPACK。
これらはLinuxやMacOSなら結構簡単に導入ができます。
しかしながら、WindowsにおいてはCygwinやWSLを使った方法が主となっており、コマンドプロンプトなどでは使えない状況です。
そこで今回は、MinGWを用いてgfortranやgccを導入したマシンにおいて、lapackを使えるように設定します。
参考にしたサイト
LAPACK for Windows
こちらのサイトにすべて設定の方法が載っております。今回はこちらを参考にして実際の画面をもとに説明していきます。
Windowsへのインストール方法
-
lapack.tar.gzからファイルをダウンロードします.
-
CMAKEの .msi のインストーラーをダウンロードします.
-
CMAKEをインストールする. この際PATHを通しておくと楽./
-
管理者としてコマンドプロンプトを開き, ダウンロードしてきた lapack-3.~ のフォルダに移動します.
-
build, build_space という二つの新しいフォルダを作成します.
C:¥Users~> mkdir build build_space
-
cmake-guiを開きます. 次のコマンドを打ってください.
C:¥Users~> cmake-gui
-
Browse Source... というボタンを押して, lapack-3.~ のフォルダを選択する.
-
Browse Build... というボタンを押して, 先程作成した build_space をさがして選択してください.
-
Configure を押してください.
-
次のようなウインドウが出てくるので, MinGW Makefiles を選択して, Specify native compilers を選び, Next を押してください.
-
次のようなウインドウが出てくるので, 画像に書いてある通りにコンパイラの名前を入力して, Finish を押してください.
-
図のようにチェックを入れてください. CMAKE_INSTALL_PREFIX の Value を押して, 先程作成した build を探して選んでください.
-
再び Configure を押してください.
-
画面が白くなったら, Generate を押してください.
-
開いていたコマンドプロンプトで build_space に移動し, 次のコマンドを入力してください.
C:¥Users~> mingw32-make
-
終了したら, 同じ場所で次のようにコマンドを入力してください.
C:¥Users~> mingw32-make install
-
build に新しく lib, bin ができたら成功です.
-
MinGWの中(gfortranとかがあるところ)にある lib, bin に, 先程出来上がった build の中身をコピーしてください.
サンプルコード
最後にサンプルコードを用意いたしました。
逆行列を求めて行列積を行うプログラムです。
確認のためにコピペして試してみてください。
gfortran test_lapack.f90 -lm -lblas -llapack
program inverse
implicit none
integer, parameter :: N=2
double precision A(N,N), A_inv(N,N), C(N,N), work(N)
integer :: lda=N, ipiv(N), info, lwork=N
print *,"A="
call random_number(A) ! ランダムで2x2行列を生成
call print_matrix(A,N) !行列の表示のためのサブルーチン
print *,"A_inv"
A_inv = A !行列を保存するために, A_invにAを代入しておいた
call dgetrf(N, N, A_inv, lda, ipiv, info)
call dgetri(N, A_inv, lda, ipiv, work, lwork, info)
call print_matrix(A_inv,N)
print *,"C"
call dgemm('N', 'N', N, N, N, 1.d0, A, N, A_inv, N, 0.d0, C, N)
call print_matrix(C,N)
end program inverse
!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
!::: 行列表示のためのサブルーチン
!::: 引数はprint_matrix(_表示したい正方行列の配列_, _正方行列の行数_)
subroutine print_matrix(X,N)
integer i, j, N
double precision X(N,N)
do i=1,n
do j=1,n
write(*,fmt='(f15.8)',advance='no') X(i,j)
end do
write(*,*)
end do
print *, "==============================="
end subroutine