LoginSignup
5
3

More than 3 years have passed since last update.

WindowsのMinGWでlapackを使う

Last updated at Posted at 2019-07-31

Windowsでlapackは使える???

数値計算の世界で欠かせない存在であるFortranとBLAS、lapack。
これらはLinuxやMacOSなら結構簡単に導入ができます。
しかしながら、WindowsにおいてはCygwinやWSLを使った方法が主となっており、コマンドプロンプトなどでは使えない状況です。

そこで今回は、MinGWを用いてgfortranやgccを導入したマシンにおいて、lapackを使えるように設定します。

参考にしたサイト

LAPACK for Windows
こちらのサイトにすべて設定の方法が載っております。今回はこちらを参考にして実際の画面をもとに説明していきます。

Windowsへのインストール方法

  1. lapack.tar.gzからファイルをダウンロードします.

  2. CMAKE.msi のインストーラーをダウンロードします.

  3. CMAKEをインストールする. この際PATHを通しておくと楽./

  4. 管理者としてコマンドプロンプトを開き, ダウンロードしてきた lapack-3.~ のフォルダに移動します.

  5. build, build_space という二つの新しいフォルダを作成します.
    C:¥Users~> mkdir build build_space

  6. cmake-guiを開きます. 次のコマンドを打ってください.
    C:¥Users~> cmake-gui

  7. Browse Source... というボタンを押して, lapack-3.~ のフォルダを選択する.

  8. Browse Build... というボタンを押して, 先程作成した build_space をさがして選択してください.

  9. Configure を押してください.

  10. 次のようなウインドウが出てくるので, MinGW Makefiles を選択して, Specify native compilers を選び, Next を押してください.
    image1.png

  11. 次のようなウインドウが出てくるので, 画像に書いてある通りにコンパイラの名前を入力して, Finish を押してください.
    image2.png

  12. もう一度 Configure を押してください. すると次のような赤いウインドウが出てくると思います.
    image3.png

  13. 図のようにチェックを入れてください. CMAKE_INSTALL_PREFIX の Value を押して, 先程作成した build を探して選んでください.

  14. 再び Configure を押してください.

  15. 画面が白くなったら, Generate を押してください.

  16. 開いていたコマンドプロンプトで build_space に移動し, 次のコマンドを入力してください.
    C:¥Users~> mingw32-make

  17. 終了したら, 同じ場所で次のようにコマンドを入力してください.
    C:¥Users~> mingw32-make install

  18. build に新しく lib, bin ができたら成功です.

  19. MinGWの中(gfortranとかがあるところ)にある lib, bin に, 先程出来上がった build の中身をコピーしてください.

サンプルコード

最後にサンプルコードを用意いたしました。
逆行列を求めて行列積を行うプログラムです。
確認のためにコピペして試してみてください。

  gfortran test_lapack.f90 -lm -lblas -llapack
test_lapack.f90
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

5
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3