FrontISTR v5.0 を ubuntu 18.04 LTS(等)でcmakeを使って動かす手順 


細かいことは抜きにして、最も手っ取り早く、かつなるべく高機能に動かすことを前提に作成しています。

Ubuntu 16.04 LTS & v4.6でしたら以下の記事も参考になります。
[オープンソース大規模並列FEM非線形構造解析プログラム FrontISTR v4.6のインストール (ubuntu 16.04 LTS)](https://qiita.com/michioga/items/b9bc6d5c04318b107714)

何のために本記事があるかといえば、cmakeを使う例が触れられていないこと、同様インストールパッケージでcmakeすると問題が起きるためです。
Ubuntuと限定していますが、他のOSでも共通する内容はたくさんあり、ほとんどそのまま持っていけるはずです。

また、[CentOSの記事](https://qiita.com/sakurano/items/207ecb1bb6100279ee82)とは異なり、どちらかといえば、ユーザ所有のデスクトップPCに入れることを主眼としています。



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

### ビルド環境及び並列計算の構築
```
sudo apt install build-essential cmake gfortran git curl ruby libopenmpi-dev 
```
※ rubyはテストのためなので、なくても動きます。
※ openmpiについてはなくても、逐次計算版として動かせます。


### オプショナルのライブラリ
```
sudo apt install libmetis5 libopenblas-dev libmumps-dev libmetis-dev 
sudo apt install trilinos-all-dev libptscotch-dev
```
※ FrontISTRのcmakeのTrilinosのサーチで問題がおきるため、trilinosの全パッケージとScotchを入れています。
※ 本来はtrilinosのうち、MLとzoltanしか使いません。



## FrontISTRをコンパイルとインストール
### ユーザローカルバイナリとしてインストール
通常、共用計算機を前提とする科学技術計算のプログラムは、ユーザフォルダ内で完結させることが推奨されるので、スーパーユーザ権限を使うことはやらないことが多いです。
ということで、RHEL系でもDebian系でも共通して使えるよう（つまり余計なことをしなくてもパスが通っているように）、~/.local/binにインストールしてみましょう。
(※ 「~/」 はユーザのホームディレクトリを表しています。)

```
git clone https://github.com/FrontISTR/FrontISTR
cd FrontISTR/; mkdir build; cd build
cmake -DCMAKE_INSTALL_PREFIX=~/.local ../
make -j 16
make install 
source ~/.profile
```
※ はじめて~/.local/フォルダができた場合、最後のsource文を実行することで、PATHが通ります。
※ 仕様として、ログイン時に、~/.local/binがあるときだけパスが通るためです。

※ [MPIとスレッド並列が同時に有効になるときは、注意点を確認して下さい。](https://qiita.com/sakurano/items/207ecb1bb6100279ee82#mpi%E3%81%A8openmp%E5%90%8C%E6%99%82%E6%9C%89%E5%8A%B9%E6%99%82%E3%81%AE%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85)

### システム共通バイナリとしてインストール
/usr/local/binにバイナリを配置する場合。自分のローカルならこういう使い方もあります。

```
git clone https://github.com/FrontISTR/FrontISTR
cd FrontISTR/; mkdir build; cd build
cmake ../
make -j 16
sudo make install 
```
※ [MPIとスレッド並列が同時に有効になるときは、注意点を確認して下さい。](https://qiita.com/sakurano/items/207ecb1bb6100279ee82#mpi%E3%81%A8openmp%E5%90%8C%E6%99%82%E6%9C%89%E5%8A%B9%E6%99%82%E3%81%AE%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85)


## REVOCAP_Refinerが欲しい時
~/.local/lib、~/.local/includeに入れてしまいます。
こちらを実行したあとに、「インストール」を再度実行することで、Refinerがリンクされます。

```
BUILD_ROOT=`pwd`
LIB_ROOT=${HOME}/.local
MAKE_PAR=16

git clone https://github.com/FrontISTR/REVOCAP_Refiner
cd REVOCAP_Refiner
make -j${MAKE_PAR}
cp lib/x86_64-linux/libRcapRefiner.a ${LIB_ROOT}/lib
cp Refiner/rcapRefiner.h ${LIB_ROOT}/include
```

# (参考)パッケージを使わずに、オプショナルライブラリを用意して入れる方法

必要なライブラリを、ユーザのローカルに入れておくということは、一般に(少なくとも計算科学分野では)よく行われます。
そこで、必要なライブラリを自力で手っ取り早くコンパイルする参考になるスクリプト例を記載します。

MPIだけを、環境側で用意しておけば他のライブラリは自力でコンパイルして用意することができます。
※MPIは、特に複数ノードシステムの場合、ハードウェアや構成を考慮する必要もあり、一般にこうすれば良いというと書けません。

なお、MUMPSはCeCILLライセンスを公称しているので、再配布が許されるはずです。再配布された場合と同様(登録をしなくても入手できる)という考えのもと、公式への直リンクを貼っています。
[MUMPS公式サイト](http://mumps.enseeiht.fr/)では、登録を求めておりますので、登録をしていただければ幸いです。


```
BUILD_ROOT=`pwd`
LIB_ROOT=${HOME}/.local
MAKE_PAR=16
# END modify.

mkdir -p ${LIB_ROOT}/bin ${LIB_ROOT}/lib ${LIB_ROOT}/include
export PATH=${LIB_ROOT}/bin:$PATH


########################################
# OpenBLAS
########################################
git clone -b v0.2.20 https://github.com/xianyi/OpenBLAS.git
cd OpenBLAS
make -j${MAKE_PAR} DYNAMIC_ARCH=1 USE_OPENMP=1 BINARY=64 NO_SHARED=1
make PREFIX=${LIB_ROOT} install
cd ${BUILD_ROOT}

########################################
# metis-5.1.0
########################################
curl -L -O http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/metis-5.1.0.tar.gz
tar xvf metis-5.1.0.tar.gz
cd metis-5.1.0
make config prefix=${LIB_ROOT} cc=gcc
make -j${MAKE_PAR}
make install
cd ${BUILD_ROOT}

########################################
# scalapack-2.0.2
########################################
curl -L -O http://www.netlib.org/scalapack/scalapack-2.0.2.tgz
tar xvf scalapack-2.0.2.tgz
cd scalapack-2.0.2
mkdir build
cd build
cmake \
  -DCMAKE_INSTALL_PREFIX=${LIB_ROOT} \
  -DCMAKE_EXE_LINKER_FLAGS="-fopenmp" \
  -DBLAS_LIBRARIES=$LIB_ROOT/lib/libopenblas.a \
  -DLAPACK_LIBRARIES=$LIB_ROOT/lib/libopenblas.a \
  ..
make -j${MAKE_PAR}
make install
cd ${BUILD_ROOT}

########################################
# MUMPS-5.1.2
########################################
curl -L -O http://mumps.enseeiht.fr/MUMPS_5.1.2.tar.gz
tar xvf MUMPS_5.1.2.tar.gz
cd MUMPS_5.1.2
cp Make.inc/Makefile.inc.generic Makefile.inc
sed -i \
  -e "s|^#LMETISDIR = .*$|LMETISDIR = ${LIB_ROOT}|" \
  -e "s|^#IMETIS    = .*$|IMETIS = -I\$(LMETISDIR)/include|" \
  -e "s|^#LMETIS    = -L\$(LMETISDIR) -lmetis$|LMETIS = -L\$(LMETISDIR)/lib -lmetis|" \
  -e "s|^ORDERINGSF  = -Dpord$|ORDERINGSF = -Dpord -Dmetis|" \
  -e "s|^CC      = cc|CC      = mpicc|"  \
  -e "s|^FC      = f90|FC      = mpif90|"  \
  -e "s|^FL      = f90|FL      = mpif90|" \
  -e "s|^LAPACK = -llapack|LAPACK = -L${LIB_ROOT}/lib -lopenblas|" \
  -e "s|^SCALAP  = -lscalapack -lblacs|SCALAP  = -L${LIB_ROOT}/lib -lscalapack|" \
  -e "s|^LIBBLAS = -lblas|LIBBLAS = -L${LIB_ROOT}/lib -lopenblas|" \
  -e "s|^OPTF    = -O|OPTF    = -O -fopenmp|" \
  -e "s|^OPTC    = -O -I\.|OPTC    = -O -I. -fopenmp|" \
  -e "s|^OPTL    = -O|OPTL    = -O -fopenmp|" Makefile.inc
make alllib -j${MAKE_PAR}
cp include/*.h ${LIB_ROOT}/include
cp lib/*.a ${LIB_ROOT}/lib
cd ${BUILD_ROOT}

########################################
# Trilinos 12.12.1
########################################
git clone -b trilinos-release-12-12-1 https://github.com/trilinos/Trilinos.git
cd Trilinos

mkdir build
cd build
cmake \
  -DCMAKE_INSTALL_PREFIX=${LIB_ROOT} \
  -DCMAKE_C_COMPILER=mpicc \
  -DCMAKE_CXX_COMPILER=mpicxx \
  -DCMAKE_Fortran_COMPILER=mpif90 \
  -DTPL_ENABLE_LAPACK=ON \
  -DTPL_ENABLE_SCALAPACK=ON \
  -DTPL_ENABLE_METIS=ON \
  -DTPL_ENABLE_MUMPS=ON \
  -DTPL_ENABLE_MPI=ON \
  -DTrilinos_ENABLE_ML=ON \
  -DTrilinos_ENABLE_Zoltan=ON \
  -DTrilinos_ENABLE_OpenMP=ON \
  -DTrilinos_ENABLE_Amesos=OFF \
  -DTrilinos_ENABLE_ALL_OPTIONAL_PACKAGES=OFF \
  -DMETIS_LIBRARY_DIRS=$LIB_ROOT/lib \
  -DMUMPS_LIBRARY_DIRS=$LIB_ROOT/lib \
  -DBLAS_LIBRARY_DIRS=$LIB_ROOT/lib \
  -DLAPACK_LIBRARY_DIRS=$LIB_ROOT/lib \
  -DSCALAPACK_LIBRARY_DIRS=$LIB_ROOT/lib \
  -DBLAS_LIBRARY_NAMES="openblas" \
  -DLAPACK_LIBRARY_NAMES="openblas" \
  ..
make -j${MAKE_PAR}
make install
cd ${BUILD_ROOT}

########################################
# REVOCAP_Refiner
########################################
#git clone https://gitlab.com/FrontISTR-Commons/REVOCAP_Mesh.git
git clone https://github.com/FrontISTR/REVOCAP_Mesh.git
cd REVOCAP_Mesh
make -j${MAKE_PAR}
find lib -type f -name "libRcapRefiner*" -exec cp {} ${LIB_ROOT}/lib/ \;
find . -type f -name "rcapRefiner.h" -exec cp {} ${LIB_ROOT}/include/ \;
cd ${BUILD_ROOT}

########################################
# FrontISTR
########################################
#git clone https://gitlab.com/FrontISTR-Commons/FrontISTR.git
git clone https://github.com/FrontISTR/FrontISTR.git
cd FrontISTR
mkdir build; cd build
cmake \
  -DCMAKE_INSTALL_PREFIX=${LIB_ROOT} \
  -DBLAS_LIBRARIES=${LIB_ROOT}/lib/libopenblas.a \
  -DLAPACK_LIBRARIES=${LIB_ROOT}/lib/libopenblas.a \
  ..
make -j${MAKE_PAR}
make install

```