オープンソース大規模並列FEM非線形構造解析プログラム FrontISTR v4.6のインストール (ubuntu 16.04 LTS)

## お知らせ

この記事は古いFrontISTRの構築方法について説明しています。
より、新しい方法を参照してください。

- [FrontISTR 5.0 のコンパイル方法](https://qiita.com/michioga/items/3ef75c1d8e41ab22d176)

---

ここでは、FrontISTRをUbuntu 16.04 LTSで手軽に構築する方法を紹介します。

## 注意

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

詳しいインストール方法は、FrontISTRのインストールガイドおよびマニュアルをご覧ください。

> [FrontISTRマニュアル(日本語版)](https://frontistr-commons.gitlab.io/FrontISTR_manual/v5.0b/ja/)
> [FrontISTR manual(English)](https://frontistr-commons.gitlab.io/FrontISTR_manual/v5.0b/en/)
> Windows版は [オープンソース大規模並列FEM非線形構造解析プログラム FrontISTR v4.6のインストール (Windows10 - MinGW-w64)](http://qiita.com/michioga/items/fae993892a808d488648)
> CentOS 7.3版は [オープンソース大規模並列FEM非線形構造解析プログラム FrontISTR v4.6のインストール (CentOS 7.3)](http://qiita.com/michioga/items/54220e6d62b06acba2d4)
> - Mac版は [オープンソース大規模並列FEM非線形構造解析プログラム FrontISTR v5.0αのインストール (macOS High Sierra 10.13.4)](https://qiita.com/nqomorita/items/b347ac8171e60d6b6e55)


を参照してください。

FrontISTRを構築するには、様々なライブラリが必要になりますが、バイナリパッケージを利用することで手間を省きます。

ここに書かれている方法は、Ubuntu 16.04 LTSに対応します。

ライブラリをソースから構築する場合は、[【参考】ライブラリを自力で構築する方法](#build-from-source)を参考にしてください。

## はじめに

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

## 準備

予めubuntu 16.04 LTSをインストールし、OSが動作可能な状態にしてください。

## ダウンロード

以下のソフトを入手してください。

ソフトウェア                 | 入手先
---------------------- | --------------------------------------------
FrontISTR_V46.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>

## 必要なライブラリの導入

### バイナリパッケージの導入

上記以外のソフトはバイナリパッケージから導入します。

~~~
$ sudo apt install build-essential gfortran
$ sudo apt install openmpi-bin libopenmpi-dev
$ sudo apt install libtrilinos-ml-dev
$ sudo apt install libtrilinos-aztecoo-dev libtrilinos-zoltan-dev
$ sudo apt install libopenblas-dev libmumps-dev libmetis-dev
~~~

### REVOCAP_Refinerの構築

REVOCAP_Refinerをコンパイルします。

~~~
$ tar xvf REVOCAP_Refiner-1.1.04.tar.gz
$ cd REVOCAP_Refiner-1.1.04
$ make
~~~

## FrontISTRの構築

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

FrontISTRで有効にする機能は

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

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

~~~
$ tar xvf FrontISTR_V46.tar.gz
$ cd FrontISTR_4.6
~~~

さらに`Makefile.am`を編集し構築する必要のない部分を除外します。

~~~
$ vi Makefile.am
PREFIX     = @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) clean

distclean:
        @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); \
        fi
        if [ ! -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`は構築しませんので、コメントアウトしてください。

### Makefile.confの編集

~~~
$ cp Makefile.conf.org Makefile.conf
$ vi Makefile.conf
~~~

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

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

# MPI
MPIDIR         = /usr/lib/openmpi
MPIBINDIR      = /usr/bin
MPILIBDIR      = $(MPIDIR)/lib
MPIINCDIR      = $(MPIDIR)/include
MPILIBS        = -lmpi -lmpi_mpifh

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

# Metis
METISDIR       = /usr/lib/x86_64-linux-gnu
METISLIBDIR    = $(METISDIR)
METISINCDIR    = /usr/include
HECMW_METIS_VER= 5

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

# Refiner
REFINERDIR     = $(HOME)/Software/REVOCAP_Refiner-1.1.04
REFINERINCDIR  = $(REFINERDIR)/Refiner
REFINERLIBDIR  = $(REFINERDIR)/lib/x86_64-linux

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

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

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

# ML
MLDIR          = /usr
MLINCDIR       = $(MLDIR)/include/trilinos
MLLIBDIR       = $(MLDIR)/lib/x86_64-linux-gnu
MLLIBS         = -ltrilinos_ml -ltrilinos_zoltan

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

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

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

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`を指定してください。

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

~~~
$ ./setup.sh -p --with-tools --with-refiner --with-metis --with-mumps --with-lapack --with-ml
~~~

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

~~~
$ make
$ make install
~~~

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

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

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

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

---

## 【参考】ライブラリを自力で構築する方法　<a name="build-from-source">

FrontISTRを構築するのに必要なライブラリは

- OpenMPI (MPI)
- OpenBLAS (LAPACK）
- Metis
- MUMPS
- Scalapack
- Trilinos ML

です。 Ubuntu-16.04上で構築する例を示します。

ただし、MPIの構築方法については省きます。OS付属のMPIを利用することをおすすめします。

### パッケージのインストール

ubuntuのパッケージは、以下の物をインストールしておくとトラブルが少ないと思います｡

~~~
$ sudo apt install build-essential gfortran libopenmpi-dev openmpi-bin
~~~

また、metisの構築に `cmake` が必要となりますので、インストールしておくと良いでしょう。

~~~
$ sudo apt install cmake cmake-curses-gui cmake-extras cmake-qt-gui extra-cmake-modules
~~~

FrontISTRを構築する準備が出来ましたので、必要なソフトウェアをダウンロードしてください｡

### ダウンロード

ライブラリ名          | ダウンロード先                                           | 備考
--------------- | ------------------------------------------------- | ------------------
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/>                  | 要ユーザ登録

### OpenBLASの構築

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

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

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

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

### METISの構築

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

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

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

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

### Scalapackの構築

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

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

~~~
$ tar xvf scalapack-2.0.2.tgz
$ cd scalapack-2.0.2
$ mkdir build
$ cd build
$ cmake -DCMAKE_INSTALL_PREFIX=$HOME/local \
        -DCMAKE_EXE_LINKER_FLAGS="-fopenmp" \
        -DBLAS_LIBRARIES=$HOME/local/lib/libopenblas.a \
        -DLAPACK_LIBRARIES=$HOME/local/lib/libopenblas.a \
        ..
$ make
$ make install
~~~

### MUMPSの構築

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

~~~
$ tar xvf MUMPS_5.1.2.tar.gz
$ cd MUMPS_5.1.2
~~~

`Make.inc`ディレクトリにある、`Makefile.inc.generic`を元に`Makefile.inc`を環境に合わせた内容へ書き換えます。

~~~
$ cp Make.inc/Makefile.inc.generic Makefile.inc
$ vi Makefile.inc
LMETISDIR = $(HOME)/local
IMETIS    = -I$(LMETISDIR)/include
LMETIS    = -L$(LMETISDIR)/lib -lmetis

ORDERINGSF  = -Dmetis -Dpord

CC      = mpicc -fopenmp
FC      = mpif90 -fopenmp
FL      = mpif90 -fopenmp

SCALAP  = -L$(HOME)/local/lib -lscalapack

INCPAR = -I/usr/lib/openmpi/include

LIBPAR  = $(SCALAP) -L/usr/lib/openmpi -lmpi -lmpi_mpifh

LIBBLAS = -L$(HOME)/local/lib -lopenblas

OPTF    = -O -DMUMPS_OPENMP
OPTC    = -O -I. -DMUMPS_OPENMP
OPTL    = -O
~~~

ファイルの修正が済んだらライブラリを構築します。

~~~
$ make
$ cp lib/*.a $HOME/local/lib
$ cp include/*.h $HOME/local/include
~~~

### Trilinos MLの構築

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

~~~
$ tar xvf trilinos-12.12.1-Source.tar.gz
$ cd trilinos-12.12.1-Source
$ mkdir build
$ cd build
$ cmake \
  -DCMAKE_INSTALL_PREFIX=$HOME/local \
  -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 \
  ..
$ make
$ make install
~~~

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

### FrontISTRのビルド設定

自前でライブラリをビルドした場合の`Makefile.conf`は以下のようになります。

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

# MPI
MPIDIR         = /usr/lib/openmpi
MPIBINDIR      = /usr/bin
MPILIBDIR      = $(MPIDIR)/lib
MPIINCDIR      = $(MPIDIR)/include
MPILIBS        = -lmpi -lmpi_cxx -lmpi_mpifh

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

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

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

# Refiner
REFINERDIR     = $(HOME)/Software/REVOCAP_Refiner-1.1.04
REFINERINCDIR  = $(REFINERDIR)/Refiner
REFINERLIBDIR  = $(REFINERDIR)/lib/x86_64-linux

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

# MUMPS
MUMPSDIR       = $(HOME)/local
MUMPSINCDIR    = $(MUMPSDIR)/include
MUMPSLIBDIR    = $(MUMPSDIR)/lib
MUMPSLIBS      = -ldmumps -lmumps_common -lpord -L$(HOME)/local/lib -lscalapack

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

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

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

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

# Fortran compiler settings
F90            = mpif90 -fopenmp
F90FLAGS       =
F90LDFLAGS     = -lstdc++ -L$(HOME)/local -lopenblas
F90OPTFLAGS    = -O2
F90FPP         = -cpp
F90LINKER      = mpif90 -fopenmp

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

ファイルを保存したら、`setup.sh`を起動します。

~~~
./setup.sh -p --with-tools --with-refiner --with-metis --with-mumps --with-lapack --with-ml
$ make
$ make install
~~~

でインストールが完了です。


## テスト

インストールされた FrontISTR (`fistr1`) を実行してみましょう。

~~~
$ export PATH=$HOME/FrontISTR/bin:$PATH
$ which fistr1
~/FrontISTR/bin/fistr1
$ cd $HOME/Software/FrontISTR_V46/tutorial
$ ls
01_elastic_hinge           07_viscoelastic_cylinder  13_dynamic_beam_nonlinear
02_elastic_hinge_parallel  08_creep_cylinder         14_dynamic_plate_contact
03_hyperelastic_cylinder   09_contact_hertz          15_eigen_spring
04_hyperelastic_spring     10_contact_2tubes         16_heat_block
05_plastic_cylinder        11_contact_2beam          17_freq_beam
06_plastic_can             12_dynamic_beam           18_cavity_flow
~~~

様々な例題が同梱されています。この中の `01_elastic_hinge` を実行してみましょう。

`01_elastic_hinge` ディレクトリに移動し、ディレクトリの中に格納されているファイルを見てみます。

~~~
$ cd 01_elastic_hinge
$ ls
hecmw_ctrl.dat   hinge.cnt   hinge.msh
~~~

この中には3つのファイルが格納されています。FrontISTRで解析する場合、この3つの入力ファイルが最低必要になります。

| ファイル名       | 名前          | 説明                                           |
|----------------|--------------|-----------------------------------------------|
| hecmw_ctrl.dat | 全体制御ファイル | 解析で使う入力ファイル名や、結果の出力ファイル名を指定します |
| hinge.cnt      | 解析制御データ  | 解析の種別や条件などを指定します                      |
| hinge.msh      | メッシュファイル | 解析対象のメッシュ情報や材料データを指定します           |

FrontISTR の実行名は `fistr1` です。引数は特にありません。3つのファイルが入ったディレクトリで起動してみてください。

~~~
$ fistr1
 Step control not defined! Using default step=1
 fstr_setup: OK
###  3x3 B-SSOR-CG(0)  1
       1    1.903375E+00
       2    1.974378E+00
       3    2.534627E+00
...
...
Start visualize PSF 1 at timestep 1

 ====================================
    TOTAL TIME (sec) :     61.42
           pre (sec) :      0.67
         solve (sec) :     60.75
 ====================================
 FrontISTR Completed !!
~~~

しばらくすると解析が終了し、結果ファイルなどが出力されます。

~~~
$ ls
0.log       FSTR.msg  hecmw_ctrl.dat  hinge.cnt  hinge.res.0.1
FSTR.dbg.0  FSTR.sta  hecmw_vis.ini   hinge.msh  hinge_vis_psf.0001.inp
~~~

ファイルの内容については、マニュアルを参照してください。