オープンソース大規模並列FEM非線形構造解析プログラム FrontISTR v5.0αのインストール (macOS High Sierra 10.13.4)

# FrontISTR v5.0αのインストール
## (macOS High Sierra 10.13.4)

ここでは、FrontISTR v5.0α を macOS High Sierra 10.13.4 でビルドする方法を紹介します。

## 注意

この文章は公式のものではありません。また、内容の正確性について保証するものではありません。また、筆者は一切の責任を負いません。

## はじめに

FrontISTRは[東京大学 奥田研究室](http://www.multi.k.u-tokyo.ac.jp/)で開発されている、本格的な構造解析プログラムです。[FrontISTR研究会](http://www.multi.k.u-tokyo.ac.jp/FrontISTR/)から、研究会の案内や資料、ソフトウェアが入手できます。
スパコンからWindowsパソコンまで動かすことが出来る点が特徴の一つです。

## 準備

予め macOS High Sierra 10.13.4 が動作可能な状態にしてください。

### Homebrewによるパッケージのインストール

本資料では、環境構築のために、macOS 用パッケージマネージャー　Homebrewを利用します。
はじめに、[https://brew.sh/index_ja](https://brew.sh/index_ja)からHomebrewのインストールを行ってください。
その後、以下のコマンドで、コンパイル環境をインストールします。

```
$ brew install gcc
$ brew install cmake
$ brew install open-mpi
```

## ライブラリのビルドとインストール

FrontISTRのビルドに必要なライブラリをビルドし、インストールします。
必要なライブラリは、

- OpenBLAS (LAPACK）
- Scalapack
- Metis 5
- MUMPS
- Trilinos ML
- REVOCAP_Refiner
- OpenMPI

です。この内、OpenMPIについては前の手順でインストールしました。

### ソースのダウンロード

| ソフトウェア名 | ダウンロード先 | 備考 |
|:--|:--|:--|
| OpenBLAS-0.2.20 | http://www.openblas.net | リファレンスのLAPACKよりも速い |
| 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.1.2 | http://mumps.enseeiht.fr/ | 要ユーザ登録、直接法ソルバ |
| trilinos-12.12.1 | https://trilinos.org/download/ | 要ユーザ登録、反復法前処理に利用 |
| REVOCAP_Refiner-1.1.04 | http://www.multi.k.u-tokyo.ac.jp/FrontISTR | 要ユーザ登録、FrontISTRリザーバの「最新版FrontISTRおよびREVOCAP_PrePost」よりダウンロード |

### ライブラリのビルド
作業をするディレクトリは `$HOME/Software`、ライブラリをインストールするディレクトリは `$HOME/.local` として説明をします。

```
$ cd $HOME
$ mkdir Software
$ mkdir .local
```

PATH 環境変数を確認してください。

```
$ echo $PATH
/usr/lib64/openmpi/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/home/user/.local/bin:/home/user/bin
```

また、`$HOME/.local/bin` へ`PATH`を通しておくと便利です。

~~~txt
% mkdir -p $HOME/.local/bin
% cd $HOME/.local/bin
% export PATH=`pwd`:$PATH
~~~

### OpenBLASの構築

OpenBLASは、高速なLAPACK/BLASのフリーの実装です。

OpenMPを有効にしたライブラリを構築します。

~~~txt
% tar xvf OpenBLAS-0.2.20.tar.gz
% cd OpenBLAS-0.2.20
% make BINARY=64 NO_SHARED=1 
% make PREFIX=$HOME/.local install
~~~

OpenBLASをLAPACKとして利用する場合、`-llapack`の代わりに`-lopenblas`と指定してください。

### METISの構築

グラフパーティショナのライブラリです。この他、Scotchに同梱されるmetis互換層も利用できます。

OpenMPを有効にしたライブラリを構築します。

METISの構築には`cmake`が必要ですので、予めインストールしておいてください。

~~~txt
% tar xvf metis-5.1.0.tar.gz
% cd metis-5.1.0
% make config prefix=$HOME/.local cc=gcc
% make
% make install
~~~

### Scalapackの構築

scalapackは、この後説明をするMUMPSの構築に必要となります。

また、scalapackの構築には、予めMPIがインストールされている必要があります。

~~~txt
% tar xvf scalapack-2.0.2.tgz
% cd scalapack-2.0.2
% mkdir build
% cd build
% cmake -DCMAKE_INSTALL_PREFIX=$HOME/.local \
   ..
% make
% make install
~~~

### MUMPSの構築

MUMPSは直接法のソルバです。

~~~txt
% tar xvf MUMPS_5.1.1.tar.gz
% cd MUMPS_5.1.1
% sed -e "s|mpiicc|mpicc|g" -e "s|mpiifort|mpif90|g" -e "s|-nofor_main| |g" -e "s|-qopenmp| |g" Make.inc/Makefile.INTEL.PAR > Makefile.inc
% make d 
% cp lib/*.a $HOME/.local/lib
% cp include/*.h $HOME/.local/include
~~~

### Trilinos MLの構築

Trilinosには多くのライブラリ含まれていますが、FrontISTRに必要なのは`ML`と`zoltan`だけです。

~~~txt
% tar xvf trilinos-12.10.1-Source.tar.gz
% cd trilinos-12.10.1-Source
% mkdir build
% cd build
% cmake \
	-DTrilinos_ENABLE_ALL_OPTIONAL_PACKAGES=OFF \
	-DTPL_ENABLE_MPI=ON \
	-DTrilinos_ENABLE_CXX11=OFF \
	-DTrilinos_ENABLE_Fortran:BOOL=OFF \
	-DTrilinos_ENABLE_OpenMP:BOOL=OFF \
	-DTrilinos_ENABLE_Zoltan=ON \
	-DTrilinos_ENABLE_ML=ON \
	-DTPL_ENABLE_ParMETIS=OFF \
	-DParMETIS_LIBRARY_DIRS=$HOME/.local/lib \
	-DParMETIS_INCLUDE_DIRS=$HOME/.local/include \
	-DTPL_BLAS_LIBRARIES:STRING="-lopenblas" \
	-DTPL_LAPACK_LIBRARIES:STRING="-lopenblas" \
	-DCMAKE_INSTALL_PREFIX=$HOME/.local \
	..
% make
% make install
~~~

<!--
### REVOCAP_Refinerの構築

REVOCAP_Refinerをコンパイルします。

~~~txt
% tar xvf REVOCAP_Refiner-1.1.04.tar.gz
% cd REVOCAP_Refiner-1.1.04
% make
~~~
-->

ここで示した手順では、ライブラリを`$HOME/.local`以下にインストールをしました。
macOS以外のOSでも基本的には同様に構築することができます。

## FrontISTRの構築

必要なライブラリの導入が済んだらFrontISTRを構築します。

FrontISTRで有効にする機能は

- hecmw_part1領域分割ツールなどのツール群生成
- REVOCAP_Refiner (メッシュの細分化機能)
- MPI (PCクラスタ等の並列実行環境）
- OpenMP (マルチコアCPUを利用)
- METIS (メッシュの領域分割のために必要)
- MUMPS (直接法ソルバー)
- LAPACK （CG法やGMRES法を用いた前処理適用後の条件数推定機能を利用）
- Trilinos-ML （代数マルチグリッド法に基づく前処理）

です。これらの機能を有効にしたバイナリを作成します。

~~~txt
% git clone https://github.com/FrontISTR/FrontISTR.git
~~~

### Makefile.confの編集

~~~txt
% cp Makefile.conf.org Makefile.conf
% vi Makefile.conf
~~~

以下の内容で`Makefile.conf`を編集してください。

~~~txt
##################################################
#                                                #
#     Setup Configulation File for FrontISTR     #
#                                                #
##################################################

# MPI
MPIDIR         =
MPIBINDIR      =
MPILIBDIR      =
MPIINCDIR      =
MPILIBS        =

# for install option only
PREFIX         = $(HOME)/FrontISTR
BINDIR         = $(PREFIX)/bin
LIBDIR         = $(PREFIX)/lib
INCLUDEDIR     = $(PREFIX)/include

# Metis
METISDIR       = $(HOME)/FrontISTR_tools
METISLIBDIR    = $(METISDIR)/lib
METISINCDIR    = $(METISDIR)/include
HECMW_METIS_VER= 5

# ParMetis
PARMETISDIR    = $(HOME)/ParMetis-3.1
PARMETISLIBDIR = $(PARMETISDIR)
PARMETISINCDIR = $(PARMETISDIR)/ParMETISLib

# Refiner
REFINERDIR     = $(HOME)/FrontISTR_tools
REFINERINCDIR  = $(REFINERDIR)/include
REFINERLIBDIR  = $(REFINERDIR)/lib

# Coupler
REVOCAPDIR     = $(HOME)/REVOCAP_Coupler
REVOCAPINCDIR  = $(REVOCAPDIR)/librcap
REVOCAPLIBDIR  = $(REVOCAPDIR)/librcap

# MUMPS
MUMPSDIR       = $(HOME)/FrontISTR_tools
MUMPSINCDIR    = $(MUMPSDIR)/include
MUMPSLIBDIR    = $(MUMPSDIR)/lib

# MKL PARDISO
MKLDIR         = $(HOME)/
MKLINCDIR      = $(MKLDIR)/include
MKLLIBDIR      = $(MKLDIR)/lib

# ML
MLDIR          = $(HOME)/FrontISTR_tools
MLINCDIR       = $(MLDIR)/include
MLLIBDIR       = $(MLDIR)/lib

# C compiler settings
CC             = mpicc
CFLAGS         =
LDFLAGS        = -lm
OPTFLAGS       = -O3

# C++ compiler settings
CPP            = mpic++
CPPFLAGS       =
CPPLDFLAGS     =
CPPOPTFLAGS    = -O3

# Fortran compiler settings
F90            = mpif90
F90FLAGS       =
F90LDFLAGS     =
F90OPTFLAGS    = -O2
F90FPP         = -cpp
F90LINKER      = mpif90

MAKE           = make
AR             = - ar ruv
MV             = mv -f
CP             = cp -f
RM             = rm -f
MKDIR          = mkdir -p
~~~

この手順で用いるMETISはVersion5.1.0です。`HECMW_METIS_VER = 5`を指定してください。

gfortranのプリプロセッサ指定は `-cpp`です。`F90FPP = -cpp`を指定してください。

また、特徴として、`ar`コマンドがGNU準拠のものではないので、エラーがある場合にMakefileが止まってしまいます。これを避けるために、`ar`コマンドの先頭にハイフンを挟む必要があります。

あわせて、OpenMPによるスレッド並列を実施したい場合には、`-fopenmp`オプションを当該部分に追記してください。この場合、領域分割プログラム（パーティショナ）などがスレッド並列による出力に対応され、計算時間の大きな短縮に繋がります。

```
# C compiler settings
CC             = mpicc
CFLAGS         = 
LDFLAGS        = -lm
OPTFLAGS       = -O3 -fopenmp

# C++ compiler settings
CPP            = mpic++
CPPFLAGS       = 
CPPLDFLAGS     =
CPPOPTFLAGS    = -O3 -fopenmp

# Fortran compiler settings
F90            = mpif90
F90FLAGS       = 
F90LDFLAGS     =
F90OPTFLAGS    = -O2 -fopenmp
F90FPP         = -cpp
F90LINKER      = mpif90
```

編集が出来たら`setup.sh`を実行してください。

~~~txt
% ./setup.sh -p --with-tools --with-metis --with-mumps --with-lapack --with-ml
~~~
<!-- --with-refiner -->

`setup.sh`の実行が済んだらコンパイルしてバイナリを作成します。

~~~txt
% make
% make install
~~~

構築したバイナリをインストールをすると、`$(HOME)/FrontISTR/bin`以下に

~~~txt
% ls $HOME/FrontISTR/bin
fistr1  hec2rcap  hecmw_part1  hecmw_vis1  neu2fstr  rconv  rmerge
~~~

などのバイナリがコピーされ実行できる状態になります。

通常はここまでの手順で十分です。

## 謝辞

本記事は、以下の記事を参考に、著者の許可を得て作成したものです。感謝いたします。

[オープンソース大規模並列FEM非線形構造解析プログラム FrontISTR v4.6のインストール (CentOS 7.3)](https://qiita.com/michioga/items/54220e6d62b06acba2d4)