仮想Linux環境構築（材料シミュレーション向け）

# はじめに
第一原理電子状態計算など材料シミュレーションプログラムは、Linux環境で動作させることを前提に開発されている場合が多いようです。一方、シミュレーションを専門としない材料研究者は、（会社のパソコンで）Windowsを利用していることが多いです。大規模計算にはLinuxクラスタ計算機の利用をお勧めしますが、とっかかりにWindows計算機が利用できれば、材料シミュレーション人口の増加につながることが期待できます。その際Windowsネイティブ環境を利用するよりも、仮想Linux環境を用いる方が簡単ですし、将来の大規模計算に向けた準備になると思います。

仮想Linux環境を実現するためのソフトウェアは広く公開されていますが、環境構築は面倒です。過去にVirtualBoxを利用して、仮想マシンのディスクイメージを配布したことがありますが、OSやライブラリのバージョンアップに逐一対応するのが面倒でした。ここでは面倒な仮想マシンの配布をVagrantに担当してもらいます。VagrantとVirtualBoxは、WindowsとLinuxの間のSSH接続やファイル共有まで提供してくれるので、これら以外の追加ソフトウェアは不要です。

# 計算環境構築
Windowsで動作するLinux仮想マシンに、Fortranを含む開発環境と、材料シミュレーションで良く用いられるライブラリであるMPIとFFTW、計算結果のグラフ描画用にGnuplotをインストールします。
Windows 10 64bit版を利用し、ハードウェアの仮想化支援機能（Intel VT / AMD-V; BIOSで確認）が有効になっていることを前提とします。

## VirtualBoxとVagrantのインストール
公式サイトからWindows 64bit版インストーラーをダウンロードします。Windowsのアプリケーションソフトウェアですので、インストーラーの指示に従って、普通にインストールして下さい。
[VirtualBox](https://www.virtualbox.org/)
[Vagrant](https://www.vagrantup.com/)
インストール後、コマンドプロンプトを起動して、Vagrantが利用可能であることを確かめます。

```shell-session
>vagrant --version
Vagrant 2.2.6
```

ファイル共有（等）のためにプラグインをインストールします。

```shell-session
>vagrant plugin install vagrant-vbguest
```
## Boxの入手
Vagrantが利用するOSのテンプレートはBoxとして配布されています。バージョンアップ後間もない最新版OSを使用するとトラブルに遭遇する可能性が高まることを承知の上で、CentOSの最新版を利用します。

```shell-session
>vagrant box add centos/8
```

VirtualBox用を選択します。
材料シミュレーションでは最新版OSを利用する利点は少ないので、CentOS7を使用するのも賢い選択です。

## 仮想マシン作成とライブラリ類インストール
コマンドプロンプトから操作します。仮想マシンごとに、ディレクトリ（フォルダ）を作ります。

```shell-session
>mkdir PHASE-SYSTEM
>cd PHASE-SYSTEM
>vagrant init centos/8
```

Vagrantfileが作成されますが、そのままでは特別な設定はしてくれません。仮想マシン作成時にライブラリや追加プログラムをインストールするように、このファイルを修正します。

```sh:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/8"
# config.vm.synced_folder ".", "/vagrant", type: "virtualbox"

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = "2"
  end

  # SHELL
  config.vm.provision "shell", inline: <<-SHELL
#   yum groupinstall -y base-x  # "X Window System" for CentOS7
#   yum groupinstall -y GNOME  # "GNOME Desktop" for CentOS7
    yum install -y gcc-gfortran gcc-c++
    yum install -y openmpi-devel  # "openmpi3-devel" for CentOS7
    yum install -y fftw-static
    yum install -y gnuplot
#   yum install -y epel-release
#   yum install -y --enablerepo=epel grace
    echo 'PATH=$PATH:/usr/lib64/openmpi/bin' >> .bashrc  # "/usr/lib64/openmpi3/bin" for CentOS7
  SHELL
end
```

メモリ量`vb.memory`（メガバイト単位）とCPU数`vb.cpus`は、ご利用の計算機に合わせて変更してください。
OpenMPIが/usr/lib64/openmpi/に、FFTWが/usr/lib64にインストールされます。また、OpenMPI関係のコマンドにパスが通らないので、パスに追加する記述を.bashrcに加えています。
先にインストールしたプラグインを利用して、Windowsのディレクトリ（ここではPHASE-SYSTEM）と、Linux仮想マシンの/vagrantディレクトリを共有します。

X Window Systemを利用する場合は、`base-x`行のコメントを外します（先頭の#を削除）。`base-x`の代わりに`GNOME`を指定すると、たくさんのソフトウェアが追加されます。X Serverは別に用意してください。

`grace` `epel-release`については後述のABINITの項を参照してください。

仮想マシンの準備ができました。以上の操作は、次回以降必要ありません。

このように作成した仮想マシンのディスクサイズは10GBに設定されています。大規模電子状態計算を実行するには、容量が不足気味です。そこで計算データを`/vagrant`ディレクトリに格納することを提案します。このディレクトリの実体は直接Windowsのファイルシステムにあるので、仮想ディスクの容量制限を受けずに利用できます。ただしWindowsファイルシステムですので、ファイル名の大文字小文字の区別ができないなどの理由で問題が生じることがあります。例えば下記手順でのコンパイルに失敗することがあります。計算データの格納に限定すると、問題が生じにくいと思います。

### ファイル共有設定について

Box `centos/8`(v1905.1)は入手直後の状態ではファイル共有に失敗しました。初回起動時は上記のように`Vagrantfile`の`config.vm.synced_folder`行をコメントアウトして、ファイル共有しないでください。
起動後にソフトウェアを追加すると、ファイル共有の準備が整います。

```shell-session
$ sudo yum install -y elfutils-libelf-devel
```

`Vagrantfile`の`config.vm.synced_folder`行を有効にしてから再起動してください。


## 利用方法
仮想マシンを起動します。

```shell-session
>vagrant up
```

仮想マシンを状態を確認します。

```shell-session
>vagrant status
```

仮想マシンにログインします。コマンドプロンプトに戻るためには、`exit`コマンドを実行して下さい。

```shell-session
>vagrant ssh
```

他のソフトウェアを使って仮想マシンにログインする際に必要な情報を表示します。ホスト名`127.0.0.1`、ポート番号（最初に起動した仮想マシンでは`2222`、二つ目以降は別の数字）、ユーザー名`vagrant`の他に、秘密鍵ファイル`private_key`へのパスを読み取ります。パスワードは使いません。

```shell-session
>vagrant ssh-config
```

仮想マシンを停止させます。

```shell-session
>vagrant halt
```

仮想マシンを再起動します。

```shell-session
>vagrant reload
```

仮想マシンを削除します。`Vagrantfile`は削除されませんので、`vagrant up`コマンドで仮想マシンが再作成されます。

```shell-session
>vagrant destroy
```

# アプリケーションソフトウェア導入
## [PHASE/0](https://azuma.nims.go.jp/cms1/)
平面波基底を採用した密度汎関数法による第一原理擬ポテンシャルバンド計算ソフトウェアです。
PHASE/0の最新版はパッチ（差分）形式で提供される場合があります。現在最新版2019.01.01は、2019.01（phase0_2019.01.tar.gz）に対するパッチ（phase0_2019.01.01.patch）が提供されています。
パッチ適用には`patch`コマンドを使います。同コマンドがない場合は、追加インストールしてください。

```shell-session
$ sudo yum install -y patch
```

WindowsのPHASE-SYSTEMディレクトリに、PHASE/0配布物（上記二つのファイル）を配置してから、仮想マシンを起動します。

```shell-session
>vagrant ssh
$ tar zxf /vagrant/phase0_2019.01.tar.gz
$ patch -p 0 < /vagrant/phase0_2019.01.01.patch
$ cd phase0_2019.01
$ ./install.sh
```

選択肢は`GNU Linux (EM64T/AMD64)` `GNU Compiler collection (gfortran)` `MPI parallel` `Open MPI` `Netlib BLAS/LAPACK` `FFTW3 library`を選びます。FFTWライブラリのインストール場所は、`/usr/lib64`です。
コンパイルが終わったら、テスト計算を実行しましょう。

```shell-session
$ cd samples/Si8
$ mpiexec -n 2 ../../bin/phase ne=1 nk=2
```

## [Elk](http://elk.sourceforge.net)
第一原理全電子計算ソフトウェアです（FP-LAPW法）。
### [libxc](http://www.tddft.org/programs/libxc/)
Elk等の第一原理計算ソフトウェアと組み合わせて、様々な交換相関エネルギー汎関数を使うためのライブラリです。

```shell-session
$ tar zxf /vagrant/libxc-4.3.4.tar.gz
$ cd libxc-4.3.4
$ ./configure
$ make
```

Elkのコンパイルに必要なファイルは、src/.libsの下にある`libxc.a`と`libxcf90.a`です。

### Elk

```shell-session
$ tar zxf /vagrant/elk-6.3.2.tgz
$ cd elk-6.3.2
$ ./setup
```

コンパイラを選択するように促されるので2番の`GNU Fortran (gfortran) with OpenMP`を選びます。
続けて`make.inc`を編集します。
MPI並列に対応させます。

```
#SRC_MPI = mpi_stub.f90
F90 = mpif90
F77 = mpif90
SRC_MPI =
```

libxcにも対応させます。

```
#SRC_libxc = libxcifc_stub.f90
LIB_libxc = libxcf90.a libxc.a
SRC_libxc = libxc_funcs.f90 libxc.f90 libxcifc.f90
```

libxcをコンパイルして作成した`libxc.a`と`libxcf90.a`を、`src`にコピーしてから`make`を実行します。

```shell-session
$ cp ../libxc-4.3.4/src/.libs/libxc.a src/
$ cp ../libxc-4.3.4/src/.libs/libxcf90.a src/
$ make
```

テスト計算を実行します。

```shell-session
$ cd examples/basic/Si
$ export OMP_NUM_THREADS=1
$ mpiexec -n 2 ../../../src/elk > Log
```

## [ABINIT](https://www.abinit.org/)
PHASE/0と同種の、平面波基底を採用した密度汎関数法による第一原理擬ポテンシャルバンド計算ソフトウェアです。

ABINITは計算結果可視化用に[Grace](http://plasma-gate.weizmann.ac.il/Grace/)のファイルを出力します。Graceのインストールは後述します。

Elkと同様にlibxcに対応していますが、個別にコンパイルしたlibxcではなく、特別なバージョンを利用します。configure時にソースコードをダウンロードしますので、ネットワーク接続が必要です。

```shell-session
$ tar zxf /vagrant/abinit-8.10.3.tar.gz
$ cd abinit-8.10.3
$ ./configure FC=mpif90 CC=mpicc --enable-mpi --with-dft-flavor=libxc
$ make
```

`tests/tutorial/Input/tbase3_5`がシリコンのバンド構造図の例題です。

```shell-session
$ cd tests/tutorial/Input
$ mkdir work
$ cd work
$ sed -e "s/_1/_5/" ../tbase3_x.files > file_names.data
$ mpiexec -n 2 ../../../../src/98_main/abinit < file_names.data > Log
$ gracebat tbase3_xo_DS2_EBANDS.agr -printfile band.eps
```

`band.eps`がバンド構造図です。`GNOME Desktop`をインストールしていれば、`evince`コマンドで表示できます。

```shell-session
$ evince band.eps
```

### Graceを用意：拡張パッケージ利用

（執筆時点ではCentOS8非対応）
Graceは拡張パッケージEPELのリポジトリからインストールするのが簡単です。
仮想マシン作成時でなく、追加インストールする場合はsudoコマンドを使います。

```shell-session
$ sudo yum install -y epel-release
$ sudo yum install -y --enablerepo=epel grace
```

### Graceを用意：ソースコードから

新しいバージョンのOSでは、拡張パッケージの準備ができていない場合があります。その場合は、ソースコードからインストールします。

```shell-session
$ sudo yum install -y motif-devel
$ tar zxf grace-5.1.25.tar.gz
$ cd grace-5.1.25
$ ./configure
$ sudo make install
```

`/usr/local/grace/`以下にインストールされます。環境変数PATHを設定するか、コマンド実行の際にフルパスで指定してください。

```shell-session
$ /usr/local/grace/bin/gracebat tbase3_xo_DS2_EBANDS.agr -printfile band.eps
```