DALAB情報発信用ブログ:OpenCAE+GPGPU+Peridynamics編

DALABで行っている研究活動の中で、OpenCAEやGPGPUや破壊解析の取り組みについてまとめてゆきます。

Peridigmを用いたPeridynamicsによる破壊解析:実行環境の準備(3)

2012年12月29日 06時59分50秒 | OpenCAE活用
ついに最終段階で、Peridigmの構築に進みます。これまでの準備で作業の8割は終わっているのであと少しです。

以下の、公式サイトの導入手順の解説ウエブでは、ソースパッケージをsvnを利用してダウンロードするようになっています。そこで、ウエブにある開発者の方にsvnのアカウントをメールでお願いしたところ、オープンソースとしては公開しないので、直接にソースパッケージのtar-ball (Peridigm.tar.gz)を送付いただけました。この部分は、各自で取り組んでください。
https://software.sandia.gov/trac/peridigm/wiki/User/GettingStarted

■構築の準備

このPeridigmはバージョンの更新に備えて、専用ディレクトリ~/PeridigmWorkで構築を進めます。以下の手順で準備します。ここでは、構築用ディレクトリbuildを作り、その中で作業を進めます。
$ cd ~
$ mkdir PeridigmWork
$ cd PeridigmWork
$ mv ~/Download/Peridigm.tar.gz . (最後のドット . に注意)
$ tar xvfz Peridigm.tar.gz
$ mv userTarBall/Peridigm . (最後のドット . に注意)
$ rmdir userTarBall
$ cd Peridigm
$ mkdir build
$ cd build

構築環境設定ツールcmakeの実行スクリプトcmake-peridigm.shを、PeridigmWork/Peridigm/build内に以下の内容で作る。インストール先は/opt/peridigmとする。

===== cmake-peridigm.sh =====
rm -f CMakeCache.txt
cmake \
-D CMAKE_INSTALL_PREFIX:PATH=/opt/peridigm \
-D CMAKE_BUILD_TYPE:STRING=Debug \
-D TRILINOS_DIR:PATH=/opt/trilinos/lib/cmake/Trilinos \
-D CMAKE_CXX_COMPILER:PATH=/opt/mpich/bin/mpicxx \
-D BOOST_ROOT=/opt/boost/include \
/home/dexcs/PeridigmWork/Peridigm
=============================

■構築の実行

実際にcmake-trilinos.shを実行する。処理が続きます。
$ sh ./cmake-peridigm.sh
「-- Build files have been written to: /home/dexcs/PeridigmWork/Peridigm/build」と表示されたら完了です。Makefileなど多数の構築用ファイルが生成されています。

受け取ったソースパッケージのなかで1つだけ、ここで用いたコンパイル環境ではエラーが出る部分があるので修正しておきます。検索してみると良くある対応だそうです。(作者に知らせないと…)以下の手順で、Peridigm_ZoltanSearchTree.cppを修正します。要は、#include <stdio.h>をファイルの初めの部分に追加します。
$ cd ../src/io/
$ vi Peridigm_ZoltanSearchTree.cpp

コンパイルします。処理が暫く続くので、コメントの進展の割合(%)を見ながら100%になるまで暫く待ちます。エラー表示が無く100%まで到達し、「[100%] Built target utPeridigm_ElasticPlasticMaterial」と表示されたら完成です。
$ cd ../../build
$ make
インストールします。「-- Set runtime path of "/opt/peridigm/bin/Peridigm" to "/opt/boost/lib:/opt/netcdf/lib"」と表示されたら完成です。
$ make install
以下でインストールされていることが確認できます。
$ ls -l /opt/peridigm

ここでPeridigmの補助ツールが作業ディレクトリ~/PeridigmWork/Peridigmのscriptsファルダにあるので、これらもインストールディレクトリ/opt/peridigm/binにコピーしておきます。
$ cd ~/PeridigmWork/Peridigm/scripts
$ cp * /opt/peridigm/bin

■環境の設定

以上で構築作業が完了したので、次に動作環境を設定します。要は環境変数の設定です。ホームディレクトリの.bashrcの最後に以下を追記します。設定を有効にするために、sourceコマンドを実行しておきます。
$ cd ~
$ vi .bashrc
$ source .bashrc

===== .bashrc =====
# peridigm
export PATH=/opt/peridigm/bin:/opt/trilinos/bin:/opt/mpich/bin:$PATH
export LD_LIBRARY_PATH=/opt/boost/lib:/opt/netcdf/lib:/opt/mpich/lib:$LD_LIBRARY_PATH
===================

■動作の確認

やっとPeridigmが動作するようになったので、例題を用いて動作の確認を行います。以下の手順で実行します。なお例題は、Peridigmの構築ディレクトリ~/PeridigmWorkのPeridigm/examplesにあります。peridigmによる破壊解析は非常に計算時間が長くて、例題の中でも18時間ぐらいかかるものもありました。ここでは比較的短時間で結果の出るdisk_impactを試してみます。

$ cd ~/PeridigmWork/Peridigm/examples
$ cd disk_impact

色々なファイルがありますが、現時点で理解しておきたいのは、以下の2つです。
・disk_impact.xml: Peridigmによる破壊解析の入力ファイルです。xml形式で記述されています。
・disk_impact.g: 形状表示用のGenesis形式(.g)のファイルです。ParaViewで直接表示できます。

単一コアでの実行を、以下のように試してみます。
$ Peridigm disk_impact.xml
正常に実行されると、計算の進展が以下のようなメッセージで表示されます。解析の進展が100%になるまで待ちます。
Explicit time integration [============64% Complete========]
最後にWallclock Timeとして秒表示の計算時間が表示されます。この環境では、1.8e+02なので約3分で終わりました。

解析結果は、disk_impact.eとしてExodus形式(.e)のファイルとして出力されます。結構大きくて7MBほどになりました。これをParaViewで確認します。ここで用いるParaViewは、OpenFOAM用に事前にインストールしておいたものを用いています。
$ paraview disk_impact.e

ParaViewが表示されたら、Applyを押して表示します。白い粒子の表現で、円盤と球体が表示されます。右上のアニメーション操作で、実行させると円盤に球体が衝突して跳ね返る様子が見られます。これでPeridigmの解析が成功していることが確認できます。なお仮想マシン上でのParaViewの実行のためか、OpenGLの警告が出る場合がありますが止むを得ません。

■並列処理の確認

それでは並列処理の確認を行います。まずシステムモニタを表示して、cpuのコアの動作状態が分かるようにします。この環境では、CPUが4コア利用できるのですが、これ例題では形状が2つに領域分割されているようで、disk_impact.g.2.0/1の2つが確認できます。そこで2並列で実行してみます。以下の用に行います。同じように計算の進展を示す表示が進みます。解析の進展が100%になるまで待ちます。
$ mpirun -np 2 Peridigm disk_impact.xml

最後にWallclock Timeとして秒表示の計算時間が表示されます。ここでは並列処理の複数のノードでの情報が最小・最大・平均として表示されています。今回はこの環境では、1.1e+02なので約2分弱で終わりました。並列処理の効率としては2並列で、1.6倍の高速化を実現しています。相等に並列効率が良いと思います。今後が期待できます。

なお並列処理の場合、解析結果は1つのExodus形式ファイルではなく、計算ステップ毎にファイル名にdisk_impactに、ステップ数**に対応して-s**がついて、最後に並列処理のノード番号が末尾についた多数の結果ファイル群となっています。これらを統合する必要があるので、Peridigmの補助スクリプトMergeFile.pyを以下の用に利用します。ファイルのベース名がdisk_impact-sで並列処理数2とします。
$ MergeFiles.py disk_impact-s 2

なぜか「Error when merging files! Check .log file for error details.」と表示されるので、ログファイルdisk_impact-s.logを見るのですが、それらしいエラーも無く、統合した解析結果ファイルdisk_impact-s.eは出来ていますので良とします。同じようにparaviewで可視化が可能です。
$ paraview disk_impact-s.e

■可視化の確認

動作確認の最後として、破壊する状態を見る例題としてdisk_failureを実行します。上記と同様に形状データdisk_failure.g.2.0/1と2つに分割されているので、2並列で行います。まれにMPIの起動に失敗することがあるようです。この時は再度実行してください。
$ cd ~/PeridigmWork/Peridigm/examples
$ cd disk_faiuure
$ mpirun -np 2 Peridigm disk_failure.xml

今回も2コア動作になっています。メモリの使用量は2.0GB弱程度です。計算時間は相等に長いので他の仕事をしてましょう。忘れたころに計算の進展のメッセージが表示されます。最後に100% Completeとなって解析が終了します。今回は1.4e+04秒ですので、約4時間もかかりました。結果をParaViewで確認します。今回も並列処理したので、結果ファイルを統合してから可視化します。
$ MergeFiles.py disk_failure-s 2
$ paraview disk_failure-s.e

解析結果の全ての項目を表示するために、Object InspectorのVariablesをチェックして全てを選択しておきます。これでApplyを押すと、先ほどと同じ白い点で解析結果我表示されます。
・左上のSolid ColorのメニューをDamegeに変更すると表示が青くなります。これは損傷度合いを表しており、青が損傷度0%で赤が100%になっています。これでアニメーションを実行すると損傷の様子が欲分かります。
・粒子の大きさを変更するには、Object InspectorのDisplayタブより、Point sizeを変更すると粒子が矩形で大きく表示されます。大きくすると粒子がつながって連続体の用に表示することができます。
・ファイル選択で、disk_faiulre.gを選択すると、形状をメッシュ表示で正確に確認することができます。図形状で右クリックして、Representationで色々な表現方法を選択できます。

このdisk_failureの例題を、単一コアで解析してみました。計算時間は2.3e+04なので約6.4時間となり、2コアの並列処理は1.6倍の効率化を達成したことになります。先ほどの検証と同様の結果になっています。

実は、MBP15Rでは内蔵のSSDが256MBしかないため、USB3の外付けHDDに仮想マシンを構築しています。この部分がボトルネックになっているのかも?これからは、ハードウエアに直接にUbuntuをインストールして解析環境を構築するか、MacOSXのネイティブで動作する環境構築を目指したいと思います。

以上でPeridigmの解析環境の構築は完成です。続きでは入力ファイルを分析して実践的な解析の実現や、並列処理の計算効率の検証などを進めてゆきます。