Peridigmの例題を実行してみる(Disk Impact編)

この記事では,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は並列計算をサポートしているため,シングルコアで計算するメリットはほとんどありません.次に記載するマルチコアで実行することを推奨します.

マルチコアで実行

マルチコアの場合,シングルコアで計算するよりも手順が多少複雑になります.大きな流れは以下の通りです.

マルチコアにおける計算手順
STEP
並列計算のための,領域分割
STEP
計算実行
STEP
計算結果を一つのファイルにマージする
STEP
計算結果の可視化

例題をコピー

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倍ほど高速化しています.

マルチコアでは,プロセス数(-np 32)にはスレッド数ではなくコア数を指定すべきです.コア数以上を指定した場合でも計算は実行できますが,計算速度はむしろ遅くなることが多いです.

計算結果を一つのファイルにマージする

計算後のディレクトリの中身を確認すると,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]というパラメータでは,下図のように領域分割の様子が確認できます.

適切な領域分割が行われているかを確認してください.

適切な領域分割とは,各プロセスごとのロードバランスが一様となっていることを示します.

ロードバランスの厳密な定義や計算は難しいので,「プロセスごとの粒子数が同じ」というのを目安にすると良いです.

よかったらシェアしてね!
目次