ここでは、Windowsで動くFrontISTRの構築方法を紹介します。
Windowsの場合、開発環境を整えるところから始める必要があります。また、FrontISTRを構築するのに必要な各種ライブラリがバイナリで提供されていない事が多いため、これらライブラリもソースから構築する必要があります。
比較的面倒なため、FrontISTRを直ぐに使いたい方は FrontISTR研究会 から提供されている バイナリ版 または REVOCAP_PrePost をダウンロードしてください。
REVOCAP_PrePost は、FrontISTR等で使えるプリポスト用のソフトウェアでFrontISTRが同梱されています。
windows用の開発環境として、Git for windows SDKのMinGW-w64を用います。
https://github.com/git-for-windows/build-extra/releases
から git-sdk-installer-1.0.3.7z.exe
をダウンロードして、インストールしてください。
インストールの最後に
Generating catalog po/ru.msgmsgfmt --statistics --tcl po/ru.po -l ru -d po/307 ツフ|bZ[W.make[1]: *** [Makefile:76: po/ru.msg] エラー 1make: *** [Makefile:1656: all] エラー 2続行するには何かキーを押してください . . .
というエラーが出ますが、これは無視して構いません。
インストールが終了すると、デスクトップに「Git SDK 64-bit」というアイコンが現れます。
以前は、MSYS2を直接インストールする方法を書いていましたが、Git for windows SDKを使った方が簡単に環境整備が出来ることが分かりました。
次に、コンパイルに必要なパッケージをインストールします。
(MINGW64) pacman -S mingw-w64-x86_64-cmake mingw-w64-x86_64-qt5
cmake-gui
を使う場合、mingw-w64-x86_64-qt5
パッケージもインストールしてください。
Tips :
mingw-w64-x86_64-qt5
のインストールは必ずしも必要ありませんが、cmake
でライブラリが見つからないなどのトラブルがあるとき、cmake-gui
が役立ちます。
これでコンパイラなどがインストールされますので、念のため確認をして下さい。
(MINGW64) gcc -v(MINGW64) gfortran -v(MINGW64) cmake --version
作業に先立ち、ディレクトリを作成してください。 作業ディレクトリは$HOME/work
とし、ライブラリは$HOME/local
以下にインストールします。
(MINGW64) mkdir $HOME/work(MINGW64) mkdir -p $HOME/local/lib(MINGW64) mkdir $HOME/local/include
MPIにはMicrosoft MPIを使います。
Download Microsoft MPI v7.1 from Official Microsoft Download Center
から、SDKのmsmpisdk.msi
とランタイムのMSMpiSetup.exe
をダウンロードしインストールをしてください。
Microsoft MPIをMinGW-w64のgcc
やgfortran
でリンクするための作業をします。
「Git SDK 64-bit」を起動してください。
(MINGW64) cd $HOME/local/lib/(MINGW64) gendef /c/Windows/System32/msmpi.dll(MINGW64) dlltool -d msmpi.def -l libmsmpi.a -D /c/Windows/System32/msmpi.dll(MINGW64) lslibmsmpi.a msmpi.def
MinGW-w64環境でリンクできるMicrosoft MPIのライブラリが作成されました。
次にヘッダファイルをコピーします。
(MINGW64) cd $HOME/local/include(MINGW64) cp /c/Program\ Files\ \(x86\)/Microsoft\ SDKs/MPI/Include/*.h .(MINGW64) cp /c/Program\ Files\ \(x86\)/Microsoft\ SDKs/MPI/Include/x64/*.h .(MINGW64) lsmpi.h mpif.h mpifptr.h mpio.h mspms.h pmidbg.h
mpi.h
に変更を加えます。
(MINGW64) vi mpi.h#ifndef MPI_INCLUDED#define MPI_INCLUDEDのすぐ下に#include <stdint.h>を追加する。
更にmpif.h
に変更を加えます。
(MINGW64) vi mpif.h407行目PARAMETER (MPI_ADDRESS_KIND=INT_PTR_KIND())をPARAMETER (MPI_ADDRESS_KIND=8)へ変更する。
以上でMicrosoft MPIをMinGW-w64でリンクする準備が出来ました。
FrontISTRで有効にする機能は
です。
FrontISTRと必要なライブラリをダウンロードしてください。
ライブラリ名 | ダウンロード先 | 備考 |
---|---|---|
FrontISTR_V45.tar.gz | http://www.multi.k.u-tokyo.ac.jp/FrontISTR | 要ユーザ登録 |
REVOCAP_Refiner-1.1.04 | http://www.multi.k.u-tokyo.ac.jp/FrontISTR | 要ユーザ登録 |
OpenBLAS-0.2.19 | http://www.openblas.net | ソースをダウンロード |
metis-5.1.0 | http://glaros.dtc.umn.edu/gkhome/metis/metis/download | scotch-metisも利用可 |
scalapack-2.0.2 | http://www.netlib.org/scalapack/ | MUMPSで利用 |
MUMPS_5.0.2 | http://mumps.enseeiht.fr/ | 要ユーザ登録 |
trilinos-12.8.1 | https://trilinos.org/download/ | 要ユーザ登録 |
ダウンロードしたファイルは$HOME/work
に置いてください。
「MinGW-w64 Win64 Shell」上で構築していきます。
OpenBLASは、高速なLAPACK/BLASのフリーの実装です。OpenMPを有効にしたライブラリを構築します。
(MINGW64) cd $HOME/work(MINGW64) tar xvf OpenBLAS-0.2.19.tar.gz(MINGW64) cd OpenBLAS-0.2.19(MINGW64) make BINARY=64 NO_SHARED=1 USE_OPENMP=1(MINGW64) make PREFIX=$HOME/local install
make install
をすると、
cp: cannot stat 'libopenblas.dll': No such file or directorymake[1]: [Makefile.install:52: install] Error 1 (ignored)cp: cannot stat 'libopenblas.dll.a': No such file or directorymake[1]: [Makefile.install:53: install] Error 1 (ignored)
というエラーが表示されますが、今回はDLLを作成していないので無視してください。
OpenBLASにはLAPACKも含まれます。リンクするには -llapack
の代わりに-lopenblas
を指定してください。
グラフパーティショナのライブラリです。この他、Scotchに同梱されるmetis互換層も利用できます。
OpenMPを有効にしたライブラリを構築します。
(MINGW64) tar xvf metis-5.1.0.tar.gz(MINGW64) cd metis-5.1.0
コンパイルをする前に
をMinGW-w64用の修正をします。
(MINGW64) vi CMakeLists.txtset(GKLIB_PATH "GKlib" CACHE PATH "path to GKlib")と書かれている部分をset(GKLIB_PATH "${CMAKE_SOURCE_DIR}/GKlib" CACHE PATH "path to GKlib")に修正
(MINGW64) vi GKlib/gk_arch.h#include <sys/resource.h>を削除
/* Function prototypes */extern int gk_getopt(int __argc, char **__argv, char *__shortopts);extern int gk_getopt_long(int __argc, char **__argv, char *__shortopts,struct gk_option *__longopts, int *__longind);extern int gk_getopt_long_only (int __argc, char **__argv,char *__shortopts, struct gk_option *__longopts, int *__longind);を削除
ファイルを修正したらcmake
を実行してライブラリを構築します。
(MINGW64) cd build(MINGW64) cmake -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=$HOME/local \-DCMAKE_BUILD_TYPE="Release" -DOPENMP=ON ..(MINGW64) make(MINGW64) make install
scalapackは、この後説明をするMUMPSの構築に必要となります。
(MINGW64) cd $HOME/work(MINGW64) tar xvf scalapack-2.0.2.tgz(MINGW64) cd scalapack-2.0.2
サンプルのSLmake.inc.example
をSLmake.inc
としてコピーして書き換えます。
(MINGW64) cp SLmake.inc.example SLmake.inc(MINGW64) vi SLmake.inc## The fortran and C compilers, loaders, and their flags#FC = gfortran -fno-range-checkCC = gccNOOPT = -O0FCFLAGS = -O3 -I$(HOME)/local/includeCCFLAGS = -O3 -I$(HOME)/local/includeFCLOADER = $(FC)CCLOADER = $(CC)FCLOADFLAGS = $(FCFLAGS) -L$(HOME)/local/lib -lmsmpiCCLOADFLAGS = $(CCFLAGS) -L$(HOME)/local/lib -lmsmpi## BLAS, LAPACK (and possibly other) libraries needed for linking test programs#BLASLIB = -L$(HOME)/local/lib -lopenblasLAPACKLIB = -L$(HOME)/local/lib -lopenblasLIBS = $(LAPACKLIB) $(BLASLIB)
書き換えが済んだらライブラリを構築します。
(MINGW64) make
make
をするとエラーが出ますが、BLACS/TESTING
のエラーなので無視します。
(MINGW64) cp libscalapack.a $HOME/local/lib
MUMPSは直接法のソルバです。
(MINGW64) cd $HOME/work(MINGW64) tar xvf MUMPS_5.0.2.tar.gz(MINGW64) cd MUMPS_5.0.2
Make.inc
ディレクトリにある、Makefile.inc.generic
を元にMakefile.inc
を環境に合わせた内容へ書き換えます。
(MINGW64) cp Make.inc/Makefile.inc.generic Makefile.inc(MINGW64) vi Makefile.incLMETISDIR = $(HOME)/localIMETIS = -I$(LMETISDIR)/includeLMETIS = -L$(LMETISDIR)/lib -lmetisORDERINGSF = -Dmetis -DpordCC = gcc -fopenmpFC = gfortran -fopenmp -fno-range-checkFL = gfortran -fopenmpSCALAP = -L$(HOME)/local/lib -lscalapackINCPAR = -I$(HOME)/local/includeLIBPAR = $(SCALAP) -L$(HOME)/local/lib -lmsmpiLIBBLAS = -L$(HOME)/local/lib -lopenblasLIBOTHERS = -lpthread -fopenmpOPTF = -O -DMUMPS_OPENMPOPTC = -O -I. -DMUMPS_OPENMPOPTL = -O
ファイルの修正が済んだらライブラリを構築します。
(MINGW64) make
Trilinosには多くのライブラリ含まれていますが、FrontISTRに必要なのはML
とzoltan
だけです。
(MINGW64) cd $HOME/work(MINGW64) tar xvf trilinos-12.8.1-Source.tar.gz(MINGW64) cd trilinos-12.8.1-Source(MINGW64) mkdir build(MINGW64) cd build(MINGW64) cmake \-G "MSYS Makefiles" \-DCMAKE_INSTALL_PREFIX=$HOME/local \-DCMAKE_C_FLAGS="-DNO_TIMES" \-DCMAKE_CXX_FLAGS="-DNO_TIMES" \-DTrilinos_ENABLE_ML=ON \-DTrilinos_ENABLE_Zoltan=ON \-DTrilinos_ENABLE_OpenMP=ON \-DTrilinos_ENABLE_ALL_OPTIONAL_PACKAGES=OFF \-DTPL_BLAS_LIBRARIES=$HOME/local/lib/libopenblas.a \-DTPL_LAPACK_LIBRARIES=$HOME/local/lib/libopenblas.a \-DTPL_ENABLE_MPI=ON \-DML_ENABLE_MPI=ON \-DMPI_CXX_COMPILER=g++ \-DMPI_CXX_INCLUDE_PATH=$HOME/local/include \-DMPI_CXX_LIBRARIES=$HOME/local/lib/libmsmpi.a \-DMPI_C_COMPILER=gcc \-DMPI_C_INCLUDE_PATH=$HOME/local/include \-DMPI_C_LIBRARIES=$HOME/local/lib/libmsmpi.a \..(MINGW64) make(MINGW64) make install
REVOCAP_Refinerをコンパイルします。
(MINGW64) cd $HOME/work(MINGW64) tar xvf REVOCAP_Refiner-1.1.04.tar.gz(MINGW64) cd REVOCAP_Refiner-1.1.04(MINGW64) make
必要なライブラリの導入が済んだらFrontISTRを構築します。
(MINGW64) cd $HOME/work(MINGW64) tar xvf FrontISTR_V45.tar.gz(MINGW64) cd FrontISTR_V45
サンプルのMakefile.conf.org
をMakefile.conf
としてコピーして書き換えます。
(MINGW64) cp Makefile.conf.org Makefile.conf(MINGW64) vi Makefile.conf
以下の内容でMakefile.conf
を編集してください。
(MINGW64) vi Makefile.conf################################################### ## Setup Configulation File for FrontISTR ## #################################################### MPIMPIDIR = $(HOME)/localMPIBINDIR = "/c/Program\ Files/Microsoft\ MPI/Bin/"MPILIBDIR = $(MPIDIR)/libMPIINCDIR = $(MPIDIR)/includeMPILIBS = -lmsmpi# for install option onlyPREFIX = $(HOME)/FrontISTRBINDIR = $(PREFIX)/binLIBDIR = $(PREFIX)/libINCLUDEDIR = $(PREFIX)/include# MetisMETISDIR = $(HOME)/localMETISLIBDIR = $(METISDIR)/libMETISINCDIR = $(METISDIR)/includeHECMW_METIS_VER= 5# ParMetisPARMETISDIR = $(HOME)/ParMetis-3.1PARMETISLIBDIR = $(PARMETISDIR)PARMETISINCDIR = $(PARMETISDIR)/ParMETISLib# RefinerREFINERDIR = $(HOME)/work/REVOCAP_Refiner-1.1.04REFINERINCDIR = $(REFINERDIR)/RefinerREFINERLIBDIR = $(REFINERDIR)/lib/x86_64-linux# CouplerREVOCAPDIR = $(HOME)/REVOCAP_CouplerREVOCAPINCDIR = $(REVOCAPDIR)/librcapREVOCAPLIBDIR = $(REVOCAPDIR)/librcap# MUMPSMUMPSDIR = $(HOME)/work/MUMPS_5.0.2MUMPSINCDIR = $(MUMPSDIR)/includeMUMPSLIBDIR = $(MUMPSDIR)/libMUMPSLIBS = -ldmumps -lmumps_common -lpord -L$(HOME)/local/lib -lscalapack# MKL PARDISOMKLDIR = $(HOME)/MKLINCDIR = $(MKLDIR)/includeMKLLIBDIR = $(MKLDIR)/lib# MLMLDIR = $(HOME)/localMLINCDIR = $(MLDIR)/includeMLLIBDIR = $(MLDIR)/libMLLIBS = -lml -lzoltan -lws2_32# C compiler settingsCC = gcc -fopenmpCFLAGS = -D_WINDOWSLDFLAGS = -lstdc++ -lmOPTFLAGS = -O3# C++ compiler settingsCPP = g++ -fopenmpCPPFLAGS = -D_WINDOWSCPPLDFLAGS =CPPOPTFLAGS = -O3# Fortran compiler settingsF90 = gfortran -fopenmp -fno-range-checkF90FLAGS = -D_WINDOWSF90LDFLAGS = -lstdc++ -L$(HOME)/local/lib -lopenblasF90OPTFLAGS = -O2F90FPP = -cppF90LINKER = gfortran -fopenmpMAKE = makeAR = ar ruvMV = mv -fCP = cp -fRM = rm -fMKDIR = mkdir -p
- この手順で用いるMETISはVersion5.1.0です。
HECMW_METIS_VER = 5
を指定してください。- gfortranのプリプロセッサ指定は
-cpp
です。F90FPP = -cpp
を指定してください。REFINERLIBDIR
にx86_64-linux
と書かれていますが、間違いではありません?
さらにMakefile.am
を編集し構築する必要のない部分を除外します。
(MINGW64) vi Makefile.amPREFIX = @prefix@BINDIR = @bindir@LIBDIR = @libdir@INCLUDEDIR = @includedir@MAKE = @make@AR = @ar@CP = @cp@RM = @rm@MV = @mv@RANLIB = @ranlib@MKDIR = @mkdir@all:@cd hecmw1 && $(MAKE)@cd fistr1 && $(MAKE)# @cd hecmw2 && $(MAKE)# @cd fistr2 && $(MAKE)@cd fistr && $(MAKE)clean:@cd hecmw1 && $(MAKE) clean@cd fistr1 && $(MAKE) clean# @cd hecmw2 && $(MAKE) clean# @cd fistr2 && $(MAKE) clean@cd fistr && $(MAKE) cleandistclean:@cd hecmw1 && $(MAKE) distclean@cd fistr1 && $(MAKE) distclean# @cd hecmw2 && $(MAKE) distclean# @cd fistr2 && $(MAKE) distclean@cd fistr && $(MAKE) distclean- $(RM) ./bin/*install:if [ ! -d $(PREFIX) ]; then \$(MKDIR) $(PREFIX); \fiif [ ! -d $(BINDIR) ]; then \$(MKDIR) $(BINDIR); \fi@cd hecmw1 && $(MAKE) install@cd fistr1 && $(MAKE) install# @cd hecmw2 && $(MAKE) install# @cd fistr2 && $(MAKE) install@cd fistr && $(MAKE) install
hecmw2
およびfistr2
は構築しませんので、コメントアウトしてください。
編集が出来たらsetup.sh
を実行してください。
(MINGW64) ./setup.sh -p --with-tools --with-refiner --with-metis --with-mumps --with-lapack --with-ml
setup.sh
の実行が住んだらコンパイルしてバイナリを作成します。
(MINGW64) make(MINGW64) make install
構築したバイナリをインストールをすると、$(HOME)/FrontISTR/bin
以下に
(MINGW64) ls $HOME/FrontISTR/binfistr1.exe hecmw_part1.exe neu2fstr.exe rmerge.exehec2rcap.exe hecmw_vis1.exe rconv.exe
などのバイナリがコピーされます。
作成されたバイナリは、MSYS2やMinGWが無くても動作しますが、各種DLLをコピーしてPATH
を通しておく必要があります。
必要なDLLは
libwinpthread-1.dlllibgfortran-3.dlllibgcc_s_seh-1.dlllibgomp-1.dlllibstdc++-6.dlllibquadmath-0.dll
とmsmpi.dll
およびmpiexec.exe
になりますが、これらはインストーラでMSMpiSetup.exe
を実行した時点でPATH
が通っています。