Fortran環境構築 (Windows)

Fortran環境構築 (Windows) #

1. コンパイラの導入 #

1.1. gfortranのインストール #

Windows上でfortranコンパイラを使用可能にするために、gfortranを導入します。

gfortran 導入方法 (Windows ver.)-信州大学, 古明地美陽

2. エディタの整理 (VScode) #

VSCodeのFortran向け拡張を整理,最新化する(2022年6月) -Qiita, @implicit_none

2.1. VScode 拡張機能 #

2.2. VScodeの拡張機能 Modern Fortran のインストール #

下記の拡張機能をインストールします。これらを利用することで、コードのハイライトとコードの自動整形ができるようにするための準備です。

  • VScodeの拡張機能C/C++ (publisher:“Microsoft”)

    • メインの拡張機能である Modern Fortran の要件として、上記の拡張機能が必要です。
  • VScodeの拡張機能 Modern Fortran (publisher:“fortran-lang.org”)

2.3. Fortran用 言語サーバ fortls のインストール #

pip install fortls

私の場合、インストール後に下記場所にexeが置かれました。

C:\Users\username\AppData\Local\Programs\Python\Python313\Scripts\fortls.exe

上記の実行ファイルのパスをModern Fortranの設定項目に設定します。

2.4. Fortran用 自動整形ツール fprettifyのインストール #

pip install fprettify

私の場合、インストール後に下記場所にexeが置かれました。

C:\Users\username\AppData\Local\Programs\Python\Python313\Scripts\fprettify.exe

上記の実行ファイルのパスをModern Fortranの設定項目に設定します。

2.5. settins.jsonに書くべき内容 #

VS codeの settins.json に下記の内容を書きます。

    "editor.formatOnSave": true,
    "fortran.linter.compiler": "gfortran",
    "fortran.linter.compilerPath": "C:/TDM-GCC-64/bin/gfortran.exe",
    "fortran.fortls.path": "C:/Users/username/AppData/Local/Programs/Python/Python313/Scripts/fortls.exe",
    "fortran.formatting.path": "C:/Users/username/AppData/Local/Programs/Python/Python313/Scripts",
    "fortran.formatting.formatter": "fprettify",
    "fortran.formatting.fprettifyArgs": ["--indent", "4", "--enable-decl", "--strip-comments", "--case", "1", "1", "1", "1"],

下記の通りパスを指定しています。

3. LAPACKのインストール #

英語では次の説明が参考になります。

LAPACK for Windows

日本語では下記が参考になります。

WindowsのMinGWでlapackを使う

ただし、日本語の上記説明だけではインストールができず、以下を変更する必要がありました。

  • 日本語説明の11.を変更 Specify native compilers にて、LAPACK for Windowsに従い下記のように変更しました。

    • Compilers
      • C ………. C:/TDM-GCC-64/bin/x86_64-w64-mingw32-gcc.exe
      • C++ …….. C:/TDM-GCC-64/bin/x86_64-w64-mingw32-g++.exe
      • Fortran …. C:/TDM-GCC-64/bin/x86_64-w64-mingw32-gfortran.exe
  • 日本語説明の12.を変更 LAPACK for Windowsに従い下記のように変更しました。

    • BUILD_SHARED_LIBSのオプションをON
    • CMAKE_GNUtoMSのオプションをON

ここまででLapackが使用できるようになりました。次はFFTWです。

4. FFTWのインストール #

Downloading FFTW, Windows Installation Notes -FFTW

4.1. WSL2のインストール #

  • Linux 用 Windows サブシステム 機能の有効化

管理者権限でPowerShellまたはコマンドプロンプトを起動

wsl --update
wsl --install

wslインストール作業中・作業後に再起動が要求されるかもしれませんが、記載はしておりません。

WSLの導入が完了すれば、アプリにUbuntuが追加されているはずです。次のようにUbuntuターミナルが存在するか確認してください。

Ubuntuを立ち上げ後、ユーザー名とパスワード等を案内に従って設定すればWSLの準備は完了です。

4.2. fftwの導入 #

4.2.1. fftwのダウンロード #

wget http://www.fftw.org/fftw-3.3.10.tar.gz
tar -xvzf fftw-3.3.10.tar.gz
cd fftw-3.3.10   # ← このディレクトリが「FFTWソースディレクトリ」です

4.2.2. MinGWクロスコンパイラ環境の事前準備 #

Ubuntu上 (WSL上) でMinGWクロスコンパイル用のツールチェインとビルドに必要なツールをインストールします。 少なくとも以下をインストールしてください(root権限が必要です)

sudo apt update
sudo apt install mingw-w64 gfortran-mingw-w64 build-essential

上記2行目において、次のツールをインストールしています。

ツール 説明
build-essential GCCやMakeなど標準的なビルドツール
mingw-w64 Windows向けクロスコンパイラ(x86_64-w64-mingw32およびi686-w64-mingw32のコンパイラ一式)
gfortran-mingw-w64 MinGW版GFortran(Fortranコンパイラ)。※mingw-w64に含まれる場合もあります。

4.3. ビルド #

4.3.1. 倍精度ライブラリ #

# 1) クリーン
make distclean

# 2) コンフィグ(double precision有効化)
./configure --host=x86_64-w64-mingw32 \
            --disable-alloca \
            --with-our-malloc16 \
            --with-windows-f77-mangling \
            --disable-shared \
            --enable-static \
            --prefix=/mnt/c/fftw

# 3) ビルド
make -j$(nproc)

# 4) インストール(ヘッダは既にあるのでライブラリだけ手動コピー)
make install
mkdir -p /mnt/c/fftw/lib
cp .libs/libfftw3.a /mnt/c/fftw/lib/

4.3.2. 単精度ライブラリ #

# 1) クリーン
make distclean

# 2) コンフィグ(float有効化)
./configure --host=x86_64-w64-mingw32 \
            --disable-alloca \
            --with-our-malloc16 \
            --with-windows-f77-mangling \
            --disable-shared \
            --enable-static \
            --enable-float \
            --prefix=/mnt/c/fftw

# 3) ビルド
make -j$(nproc)

# 4) インストール
mkdir -p /mnt/c/fftw/lib
cp .libs/libfftw3f.a /mnt/c/fftw/lib/

4.3.3. 4倍精度ライブラリ #

make distclean

# 2) コンフィグ(4倍精度有効化)
./configure --host=x86_64-w64-mingw32 \
            --disable-alloca \
            --with-our-malloc16 \
            --with-windows-f77-mangling \
            --disable-shared --enable-static \
            --enable-quad-precision \
            --prefix=/mnt/c/fftw

# 3) ビルド
make -j$(nproc)

# 4) インストール
mkdir -p /mnt/c/fftw/lib
cp .libs/libfftw3q.a /mnt/c/fftw/lib/

4.4. 動作確認用 #

program test_fftw
  implicit none
  ! Fortran77形式のラッパーを読み込む
  include 'fftw3.f'

  integer, parameter :: N = 8
  integer*8         :: plan_fwd, plan_bwd
  complex*16        :: in(N), out(N)
  integer           :: i

  !--- 入力データの初期化 ---
  do i = 1, N
     in(i) = cmplx(dble(i), 0.0d0)   ! 例えば実部に 1,2,…,N を設定
  end do

  !--- プラン(計画)の作成 ---
  ! FFTW_FORWARD = -1, FFTW_BACKWARD = +1, FFTW_ESTIMATE = 64
  call dfftw_plan_dft_1d(plan_fwd, N, in,  out, FFTW_FORWARD,  FFTW_ESTIMATE)
  call dfftw_plan_dft_1d(plan_bwd, N, out, in,  FFTW_BACKWARD, FFTW_ESTIMATE)

  !--- FFT の実行 ---
  call dfftw_execute_dft(plan_fwd, in, out)
  print *, '=== FFT result ==='
  do i = 1, N
     print '(I2,2X,2F12.5)', i, real(out(i)), aimag(out(i))
  end do

  !--- IFFT の実行(逆変換後に正規化)---
  call dfftw_execute_dft(plan_bwd, out, in)
  do i = 1, N
     in(i) = in(i) / dble(N)
  end do
  print *, '=== IFFT result (normalized) ==='
  do i = 1, N
     print '(I2,2X,2F12.5)', i, real(in(i)), aimag(in(i))
  end do

  !--- プランの破棄 ---
  call dfftw_destroy_plan(plan_fwd)
  call dfftw_destroy_plan(plan_bwd)
end program test_fftw

下記のコマンドをpowershell上で実行すればよいです。

gfortran .\test_fft_fortran.f90 -I"C:\fftw\include" -L"C:\fftw\lib" -lfftw3 -o test_fftw.exe
.\test_fftw.exe