週末はいつも晴れ

社会人3年目の日記です。プログラミングとか旅行とかラーメン。

OpenMC

日本語の情報が無いのでメモ。

The OpenMC Monte Carlo Code — OpenMC Documentation

OpenMCとは

OpenMCは粒子のモンテカルロ輸送計算コードで、臨界計算に重きを置いています。
2次曲面を含む3次元モデルのジオメトリーでシミュレーションできます。
OpenMCでは連続エネルギーと多群計算の両方をサポートしています。
連続エネルギーの粒子の相互作用データはHDF5フォーマットに基づいています。
HDF5フォーマットはMCNPやSerpentといったモンテカルロコードで使用されているACEフォーマットから生成することも可能です。

HDF5フォーマットとは
HDF5フォーマットに関するメモ書き - たまに書きます。

ACEフォーマットとか、わざわざ独自仕様にするのは本当にやめて欲しいですよね
ENDF/B形式も然りです。そろそろ現代的なものに見直そうと思わないのでしょうか?

OpenMC本体のインストール

linuxはapt-getでバイナリを落としてくることもできます。
macはソースからインストールするしかありません。
windowsは知りません。

以下はソースコードからインストールする方法

git clone https://github.com/mit-crpg/openmc.git
cd openmc
mkdir build
cd build
cmake .. # オプション指定できます
make
make install

以下はcmakeオプションのおすすめです。

cmake -DCMAKE_INSTALL_PREFIX=$HOME/.local\
      -DCMAKE_CXX_COMPILER=/usr/local/bin/g++-7\
      -Openmp=on\
      -Optimize=on ..

macxcodeで入るclangにopenmpを通すのは面倒だし、
brewでインストールしたgccを使っています。hdf5もbrewでインストールしました。
以下では上記のcmakeオプションを使用したと仮定して進めます。

インストールが完了するとCMAKE_INSTALL_PREFIXで指定したディレクトリは以下のようになります。

$ tree .local/ -L 2
.local/
├── bin
│   ├── openmc
│   ├── openmc-ace-to-hdf5
│   ├── openmc-convert-mcnp70-data
│   ├── openmc-convert-mcnp71-data
│   ├── openmc-get-jeff-data
│   ├── openmc-get-multipole-data
│   ├── openmc-get-nndc-data
│   ├── openmc-plot-mesh-tally
│   ├── openmc-track-to-vtk
│   ├── openmc-update-inputs
│   ├── openmc-update-mgxs
│   ├── openmc-validate-xml
│   └── openmc-voxel-to-silovtk
├── include
│   └── python3.5m
├── lib
│   ├── libopenmc.dylib
│   └── python3.5
└── share
    ├── doc
    ├── man
    └── openmc

9 directories, 14 files

思いっきりPythonを使うみたいですね。素晴らしい。
日本の開発はここら辺がすっごく遅いです。
私の場合は環境のPythonが使われるように設定されたようです。

断面積のダウンロード

binフォルダにあるopenmc-get-nndc-dataを使うと
ENDF/B-VII.1の断面積をNNDCからダウロードできます。

$ cd ~/.local
$ mkdir data
$ cd data
$ ~/.local/bin/openmc-get-nndc-data
Downloading ENDF-B-VII.1-neutron-293.6K.tar.gz... ^P^P^P^A^Eb 501910959  [100.00%]
Downloading ENDF-B-VII.1-tsl.tar.gz...   17925081  [100.00%]
Verifying MD5 checksums...
Extracting ENDF-B-VII.1-neutron-293.6K.tar.gz...
Extracting ENDF-B-VII.1-tsl.tar.gz...
Fixing ZAIDs for S(a,b) tables
Delete *.tar.gz files? ([y]/n) y
Converting 89225.71c (ACE) to Ac225 (HDF5)
Converting 89226.71c (ACE) to Ac226 (HDF5)
Converting 89227.71c (ACE) to Ac227 (HDF5)
〜省略〜
Converting paraD.71t (ACE) to c_para_D (HDF5)
Converting paraH.71t (ACE) to c_para_H (HDF5)
Converting sCH4.71t (ACE) to c_H_in_CH4_solid (HDF5)
Converting UUO2.71t (ACE) to c_U_in_UO2 (HDF5)
Converting ZrZrH.71t (ACE) to c_Zr_in_ZrH (HDF5)

ACEファイルがダウンロードされて、自動的にHDF5フォーマットに書き換えているようです。
私の環境ではGe76, Eu152, Mo100の変換時に怒られました。

次に断面積リストのxmlファイルcross_sections.xml環境変数に登録します。

echo "OPENMC_CROSS_SECTIONS=$HOME/.local/data/nndc_hdf5/cross_sections.xml" >> .bashrc

以上でインストールは完了です。
あとは以下のipython notebookを追えば、入門できます。
やっぱりI/O周りが素晴らしいですね
Modeling a Pin-Cell — OpenMC Documentation

MCNPのI/Oはゴミ過ぎで進歩しない。
SCALEは多少マシになったようですが、これからはPython APIが無いと若者はついて行かないです。
MCNPもAPIは無理だけど、wrapperを誰か書いてくれないものでしょうか。
あのインプットファイルとかジオメトリ可視化機能はありえない笑
ユーザーの切なる願いです。

dockerで使う方法

新らしい技術は積極的に取り入れましょう。
我々の業界は時代遅れすぎます。
「docker 使い方」とか「docker 仕組み」でググってください。

ergsさんが一番良さそうなのでお借りします。

docker pull ergs/ergs-openmc

すぐに使えるようなります。