Dockerを使ってOneAPIとOpenMXのインストール

OpenMXという第一原理計算ソフトウェアがあります。Dockerの練習も兼ねてこのコードをインストールしてみました。Dockerで使うOSはUbuntu 20.04LTSです。Intel Macで動かしてみました。Dockerについては勉強中なので、間違っていることが多いかもしれませんが、とりあえずOpenMXは動きます。
コンパイラはIntelのOneAPIを使いました。OneAPIのインストール方法については
https://zenn.dev/hishinuma_t/articles/intel-oneapi_install
の記事を参考にさせていただきました。

~~注意点ですが、2コア以上で落ちます。これは、
https://qiita.com/cometscome_phys/items/7e6edc85f1e40cc33620
と同じ状況です。
何が問題なのかわかる方教えていただけると助かります。~~

~~[追記]~~

```fortran
program main
  implicit none
  include 'mpif.h'
  integer::PETOT,my_rank,ierr
  
  call MPI_INIT(ierr)
  write(*,*) "hello"
  call mpi_finalize()
end program
```
~~というコードを```mpiifort```でコンパイルしても2コアで落ちるので、下記はそもそもIntel MPIがちゃんと入っていないのかもしれません。~~

[さらに追記]
なんとかできる方法がわかりました。runをするところで、

```
docker run (中略) --shm-size=512m (後略)
```
みたいにする必要があるようです。あとで記事を整理します。

# Dockerfile
今回使ったDockerfileを
https://github.com/cometscome/OpenMX_Docker
に置きました。ご自由にお使いください。もちろん自己責任で使用してください。動作の保証はできません。

# 説明

Dockerについての説明は割愛します。
まず、ディレクトリを作ります

```
mkdir openmx
cd openmx
```
このディレクトリの中に、```makefile.patch```という名前のファイルを作り、

```
--- makefile	2019-12-02 14:12:58.000000000 +0900
+++ ../../../source/makefile	2021-10-17 16:44:25.000000000 +0900
@@ -5,10 +5,14 @@
 #                                                                 #
 ###################################################################
 
-MKLROOT = /opt/intel/mkl
-CC = mpicc -O3 -xHOST -ip -no-prec-div -qopenmp -I/opt/intel/mkl/include/fftw
-FC = mpif90 -O3 -xHOST -ip -no-prec-div -qopenmp 
-LIB= -L${MKLROOT}/lib/intel64 -lmkl_scalapack_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lmkl_blacs_openmpi_lp64 -lmpi_usempif08 -lmpi_usempi_ignore_tkr -lmpi_mpifh -liomp5 -lpthread -lm -ldl
+#MKLROOT = /opt/intel/mkl
+MKLROOT = /opt/intel/oneapi/mkl/latest
+CC = mpiicc -cc=icc -O3 -xHOST -ip -no-prec-div -qopenmp -lfftw3
+#CC = mpicc -O3 -xHOST -ip -no-prec-div -qopenmp -I/opt/intel/mkl/include/fftw
+FC = mpiifort -fc=ifort -O3 -xHOST -ip -no-prec-div -qopenmp -lfftw3
+#FC = mpif90 -O3 -xHOST -ip -no-prec-div -qopenmp 
+LIB = -L${MKLROOT}/lib/intel64 -lmkl_scalapack_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lmkl_blacs_intelmpi_lp64 -liomp5 -lpthread -lm -ldl -lifcore -lfftw3
+#LIB= -L${MKLROOT}/lib/intel64 -lmkl_scalapack_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lmkl_blacs_openmpi_lp64 -lmpi_usempif08 -lmpi_usempi_ignore_tkr -lmpi_mpifh -liomp5 -lpthread -lm -ldl 
 
 #
 # System B (Sekirei) at ISSP, Univ. of Tokyo
```
というものを作成して保存してください。

次に、```Dockerfile```というファイル名のファイルを作成して、



```Dockerfile
FROM --platform=linux/x86_64 ubuntu:latest

RUN apt-get update
RUN apt-get install -y sudo

RUN useradd --uid 1001 --create-home --shell /bin/bash -G sudo,root openmxperson
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER openmxperson

WORKDIR /home/openmxperson
ADD . /home/openmxperson

RUN sudo apt update -y; sudo apt install -y wget gnupg \
 && cd /tmp \
&& sudo wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
&& sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
&& sudo rm GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
&& echo "deb https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list \
&& sudo apt update -y \
&& sudo apt install intel-oneapi-compiler-fortran intel-oneapi-compiler-dpcpp-cpp-and-cpp-classic \
    intel-oneapi-mkl intel-oneapi-mpi intel-oneapi-mpi-devel -y \
&& echo "source /opt/intel/oneapi/setvars.sh" | cat >> ~/.bashrc  

RUN sudo apt install emacs gcc make patch -y \
    && sudo apt install libfftw3-3 libfftw3-dev libfftw3-doc -y \
    && sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib/x86_64-linux-gnu/libstdc++.so

RUN wget http://t-ozaki.issp.u-tokyo.ac.jp/openmx3.9.tar.gz \
    && wget http://www.openmx-square.org/bugfixed/20Feb11/patch3.9.2.tar.gz \
    && . /opt/intel/oneapi/setvars.sh \
    && tar -xvf openmx3.9.tar.gz \
    && cp ./patch3.9.2.tar.gz openmx3.9/source/ \
    && cd openmx3.9/source \
    && tar zxvf patch3.9.2.tar.gz \
    && mv kpoint.in ../work/ \
    && cp /home/openmxperson/makefile.patch . \
    && patch -u makefile < makefile.patch \
    && make all \
    && make install

ENV PATH=/home/openmxperson/openmx3.9/work/:$PATH

CMD ["bash"]
```

を書いてください。

これで、Dockerがインストールされていれば、

```
docker build --shm-size=2gb -t openmx . 
```
でOpenMXが入ったコンテナイメージができるはずです。IntelのOneAPIコンパイラを入れたりしているために結構時間がかかります。なお、```--shm-size=2gb```は重要で、これがないとrunした時に2並列以上で落ちます。
ここ
https://wiki.mpich.org/mpich/index.php/Frequently_Asked_Questions
に情報がありました。

これが終わったら、

```
docker run --shm-size=2gb --name oneopenmx -it openmxone /bin/bash
```
どのようにすれば実行できます。
Dockerについては他の記事を参照してください。

動作確認は

```
cd ../work
mpirun -np 1 openmx Methane.dat -nt 1 > met.std
cat met.std 
```
で並列数を変更するなどしてちゃんと計算が動いているかどうかを見ればわかると思います。