Fortran2003でFFTW Windows編

これまでサンプルを Fortran2003でFFTWinclude修正 と上げてきましたが、これはLinuxの話でした。ではWindowsでやってみましょう。

ソースコードは同じで大丈夫。system関数など使っていないので。

まずライブラリを入手します。
http://www.fftw.org/install/windows.html
zipで落としてきます。で、中に.f03と.dllがあるのを確認。
デスクトップに解凍しておくと、僕の環境ではパスは
C:\Users\sage\Desktop\fftw-3.3.3-dll64
となりました。この中に

  • fftw3.f03
  • libfftw3-3.dll
があるかと思います。このうち、libfftw3-3.dllのほうをソースコードにあるフォルダにコピーしましょう。

正直ビルドするだけならリンクのパスを指定するだけでコピーする必要がないのですが、実行時に必要になるとき、パスを通してないとdllを読み込んでくれません。またWindowsにはdllをレジストリに登録するコマンドがありますが、このfftwのdllはそれが使えません。ていうかWindowsのプログラムのフォルダ見てると結構dllをがめてるので、これくらいはいいでしょう。ただヘッダまでコピーする必要はないかと思います。ファイル名、自分のソースコードとニアミスしてたし。

次に、コンパイラを用意します。
Windows向けのgfortranバイナリを拾ってきます。gfortranが基本的なライブラリとか、ほかのプログラムを使う可能性があるんで、gfortranだけ特に取ってくるよりは、何かに入ってるものを使ったほうがいいでしょう。gfortranがついてくるパッケージとして、
  • Cygwin
  • MinGW
  • msys
  • strawberry perl
があります。それぞれのインストール方法はここでは割愛します。ていうかインストーラを落としてnextとかOkとかクリックしてればいいです。ここではC:\strawberryにインストールしたstrawberry perlに入っているgfortranを使ってみます。

あ、以下の作業はコマンドプロンプトでやりましょう。

最初に、作業フォルダの確認。ソースコードとdllがあるはず。
C:\hogehoge> dir
(中略)
2013/08/18  17:03    <DIR>          .
2013/08/18  17:03    <DIR>          ..
2013/08/18  20:40             1,190 fftw.f03
2013/08/18  19:04             4,893 func.f03
2012/11/25  08:28         2,662,451 libfftw3-3.dll

準備ができたので、まずビルドします。
 
C:\strawberry\c\bin\gfortran.exe -c func.f03 -IC:\Users\sage\Desktop\fftw-3.3.3-dll64
C:\strawberry\c\bin\gfortran.exe -c fftw.f03
C:\strawberry\c\bin\gfortran.exe -o fftw fftw.o func.o  -L. -lfftw3-3
インクルードはデスクトップに解凍したまま放置しているフォルダ。もしインクルードするファイルも作業フォルダにコピーしてきた場合、-I以下はいらないです。リンクはライブラリをコピーしてきたのでカレントディレクトリということで、-L.。

次に、inputファイルを作ります。seqとawkはさすがにperlにはなくて、msysに入っているものを使いました。
echo 1 > input.txt
echo 4096 >> input.txt
C:\MinGW\msys\1.0\bin\seq.exe 0 4095 | C:\MinGW\msys\1.0\bin\awk.exe '{printf("%f\n",cos($1/31.415926))}' >> input.txt

最後に実行します。
fftw.exe < input.txt > output.log
結果をWindows版のgnuplotなどで確かめてみましょう。

Windowsでも快適なFortran2003&フーリエ変換ライフを。

(追記)
苺perlのgfortranでは.dllでもいいのですが、MinGWなどでは.aのライブラリでなくてはいけません。ということで作り直すのですが、
http://d.hatena.ne.jp/arakik10/20100504/p1
によると
  
C:\MinGW\bin\dlltool.exe --dllname libfftw3-3.dll --input-def libfftw3-3.def --output-lib libfftw3-3.a
でできます。 libfftw3-3.defが必要ですが、fftwのライブラリ解凍したら一緒に入ってると思います。なくなっても、上のページに作り方が書いているので大丈夫かと。
libfftw3-3.aさえ作ってしまえば、あとは同じコマンドでビルドできます。
目次に戻る
blog comments powered by Disqus