この記事では,Peridigmの公式リポジトリに含まれる例題であるDisk Impactを実行します.
Disk Impactは円板に球を高速投射し,円板の破壊解析を実行するものです.
公式リポジトリには,実際の例題の実行方法が記載されていません.また,ユーザーガイドは古いためXML形式のジョブファイルが説明されていますが,最新バージョンではYAML形式のジョブファイルとなっています.
実行には,シングルコアとマルチコアの並列計算,両者の実行方法とその結果を示します.
Peridigmのインストール方法
Peridigmのインストール方法や環境変数の設定は別記事に記載しているので,参照ください.また,Peridigmの実行には環境変数が設定されている必要があります.
>> Peridynamic Theory and Its Applications
Peridigmを実行する
Peridigmの実行は,rootではなく一般ユーザで行うことを推奨します.rootで実行するとMPIに起因するエラーが発生することがあります.
実行ディレクトリの作成
Peridigm実行するディレクトリを作成し,そこに移動します.ここでは,実行ディレクトリをホームディレクトリのperidigm/examples
とします.
mkdir -p $HOME/peridigm/examples
シングルコアで実行
例題をコピー
Disk Impactの例題を実行用のディレクトリにコピーします.
cd $HOME/peridigm/examples
cp -r /path/to/peridigm_src/examples/disk_impact my_disk_impact_single
cd my_disk_impact_single
/path/to/peridigm_src
はPeridigmをソースファイルのパスであることを注意してください.
計算実行
Peridigm disk_impact.yaml
-- Peridigm
-- version 1.5.0 (Dev)
** Warning: the selected contact search radius, 0.01, is large
** relative to the maximum element diameter (0.000735518).
** This may lead to the memory capacity being exceeded.
Time step (seconds):
Stable time step 1.59402e-07
User time step not provided
Safety factor 0.7
Time step 1.11581e-07
Total number of time steps 7169
Explicit time integration [===================100% Complete]
Memory Usage (Heap Alloc MB):
Contact Initialized 62.2516
Post Execute 213.816
Zoltan Search Tree 378.107
Wallclock Time (seconds):
Total 1.5e+03
Rebalance 4.3e+02
Output 3.1
Internal Force 1.1e+03
Initialize Contact Maps 0.0073
Gather/Scatter 6.5
Apply Kinematic B.C. 0.0034
Apply Initial Conditions 0.0011
Apply Body Forces 0.078
計算時間はWallclock Time (seconds)に示されています.この場合,総計算時間は1500 (s)なので25分程度かかっていることがわかります.
計算結果はdisk_impact.e
というファイルです.
結果の可視化
計算結果の可視化にはParaViewを使用します.ParaViewのインストール方法は省きますが,Windowsの場合,公式サイトからダウンロードしてインストールするだけで使用可能です.
結果ファイルdisk_impact.e
をParaViewで読み込むと次のような結果が得られます.
Peridigmは並列計算をサポートしているため,シングルコアで計算するメリットはほとんどありません.次に記載するマルチコアで実行することを推奨します.
マルチコアで実行
マルチコアの場合,シングルコアで計算するよりも手順が多少複雑になります.大きな流れは以下の通りです.
例題をコピー
Disk Impactの例題を実行用のディレクトリにコピーします.
cd $HOME/peridigm/examples
cp -r /path/to/peridigm_src/examples/disk_impact my_disk_impact_parallel
cd my_disk_impact_parallel
/path/to/peridigm_src
はPeridigmをソースファイルのパスであることを注意してください.
並列計算のための領域分割
32コアで並列計算するため,メッシュファイルdisk_impact.g
に対して下記コマンドで領域分割します.
decomp -p 32 disk_impact.g
...
Load restart parameters time: 0.00014049000000000006 (sec.)
Load exoII mesh info to each proc.
Time to read element block IDs: 0.0001
Time to read node set IDs: 0.0000
Time to extract element block information: 0.0007
Time to read nodal coordinates: 0.0012
Time to read element blocks: 0.0025
Time to read node sets: 0.0004
0.........10.........20.........3031
Load mesh time: 0.068202023 (sec.)
Write of parallel exodus complete
The average run time was: 0.129080s
...nem_spread successful execution
DECOMP Successful Execution
計算実行
下記コマンドで,32並列で実行する.
mpirun -np 32 Peridigm disk_impact.yaml
-- Peridigm
-- version 1.5.0 (Dev)
MPI initialized on 32 processors.
** Warning: the selected contact search radius, 0.01, is large
** relative to the maximum element diameter (0.000735518).
** This may lead to the memory capacity being exceeded.
Time step (seconds):
Stable time step 1.59402e-07
User time step not provided
Safety factor 0.7
Time step 1.11581e-07
Total number of time steps 7169
Explicit time integration [===================100% Complete]
Memory Usage (Heap Alloc MB):
Min Max Ave
Zoltan Search Tree 22.5267 43.2255 32.8724
Post Execute 12.403 23.3707 15.2606
Contact Initialized 6.74886 11.2169 7.55176
Wallclock Time (seconds):
Min Max Ave
Total 2.2e+02 2.2e+02 2.2e+02
Rebalance 64 64 64
Output 24 25 24
Internal Force 24 87 35
Initialize Contact Maps 0.0005 0.0014 0.00067
Gather/Scatter 63 1.2e+02 1.1e+02
Apply Kinematic B.C. 0.0019 0.0033 0.0025
Apply Initial Conditions 2e-05 0.00032 6.5e-05
Apply Body Forces 0.0051 0.0079 0.0059
計算時間は220秒であり,シングルコアで計算した場合の1500秒と比較して,約6.8倍ほど高速化しています.
計算結果を一つのファイルにマージする
計算後のディレクトリの中身を確認すると,disk_impact.e.32.*
というファイルが出力されています.これらは,各プロセスで分割された計算結果です.このままでは,直接結果を確認することができないため,分割されたファイルを一つのファイルにする必要があります.
ls
disk_impact.blot disk_impact.e.32.08 disk_impact.e.32.17 disk_impact.e.32.26 disk_impact.g.32.02 disk_impact.g.32.11 disk_impact.g.32.20 disk_impact.g.32.29 disk_impact.yaml
disk_impact.e.32.00 disk_impact.e.32.09 disk_impact.e.32.18 disk_impact.e.32.27 disk_impact.g.32.03 disk_impact.g.32.12 disk_impact.g.32.21 disk_impact.g.32.30
disk_impact.e.32.01 disk_impact.e.32.10 disk_impact.e.32.19 disk_impact.e.32.28 disk_impact.g.32.04 disk_impact.g.32.13 disk_impact.g.32.22 disk_impact.g.32.31
disk_impact.e.32.02 disk_impact.e.32.11 disk_impact.e.32.20 disk_impact.e.32.29 disk_impact.g.32.05 disk_impact.g.32.14 disk_impact.g.32.23 disk_impact.g.nem
disk_impact.e.32.03 disk_impact.e.32.12 disk_impact.e.32.21 disk_impact.e.32.30 disk_impact.g.32.06 disk_impact.g.32.15 disk_impact.g.32.24 disk_impact.g.pex
disk_impact.e.32.04 disk_impact.e.32.13 disk_impact.e.32.22 disk_impact.e.32.31 disk_impact.g.32.07 disk_impact.g.32.16 disk_impact.g.32.25 disk_impact.h
disk_impact.e.32.05 disk_impact.e.32.14 disk_impact.e.32.23 disk_impact.g disk_impact.g.32.08 disk_impact.g.32.17 disk_impact.g.32.26 disk_impact.jou
disk_impact.e.32.06 disk_impact.e.32.15 disk_impact.e.32.24 disk_impact.g.32.00 disk_impact.g.32.09 disk_impact.g.32.18 disk_impact.g.32.27 disk_impact.plotgen
disk_impact.e.32.07 disk_impact.e.32.16 disk_impact.e.32.25 disk_impact.g.32.01 disk_impact.g.32.10 disk_impact.g.32.19 disk_impact.g.32.28 disk_impact.p
下記コマンドで,分割されたファイルを一つのファイルにマージします.
MergeFiles.py disk_impact.e.32 32
disk_impact.e
が作成されます.
計算結果の可視化
シングルコアの場合と同様にdisk_impact.e
をParaViewで読み込みます.
シングルコアと同様の結果が得られます.
[Proc_Num]というパラメータでは,下図のように領域分割の様子が確認できます.
適切な領域分割が行われているかを確認してください.
適切な領域分割とは,各プロセスごとのロードバランスが一様となっていることを示します.
ロードバランスの厳密な定義や計算は難しいので,「プロセスごとの粒子数が同じ」というのを目安にすると良いです.