この記事では,Peridigmの公式リポジトリに含まれる例題であるFragmenting cylinderを実行します.
Fragmenting cylinderは,円筒に疑似的に内圧を与え破壊解析を実行するものです.
モデル分割(総粒子数)を変更して実行しました.FEMでいうところのメッシュサイズを変更させた解析になります.
Peridigmのインストール方法
Peridigmのインストール方法や環境変数の設定は別記事に記載しているので,参照ください.また,Peridigmの実行には環境変数が設定されている必要があります.
Peridigmを実行する
実行ディレクトリの作成
Peridigm実行するディレクトリを作成し,そこに移動します.ここでは,実行ディレクトリをホームディレクトリのperidigm/examples
とします.
mkdir -p $HOME/peridigm/examples
Fragmenting cylinderを実行
例題をコピー
Fragmenting cylinderの例題を実行用のディレクトリにコピーします.
cd $HOME/peridigm/examples
cp -r /path/to/peridigm_src/examples/fragmenting_cylinder my_fragmenting_cylinder
cd my_fragmenting_cylinder
/path/to/peridigm_src
はPeridigmをソースファイルのパスであることを注意してください.
コピー直後のディレクトリ構成は下記のようになっています.
my_fragmenting_cylinder/
├── fragmenting_cylinder_generate_mesh.py
├── fragmenting_cylinder_nodeset.txt
├── fragmenting_cylinder.txt
└── fragmenting_cylinder.yaml
計算実行
並列計算を行うにあたり,計算前に領域分割を実施することが一般的です.しかしながら,mesh fileが.g
形式(メッシュデータ)でないため,decomp
による領域分割ができません.
Peridigmにおいて,decomp
による領域分割は必須ではなく,並列実行を行うとモデルが領域分割されていない場合,内部で自動的に領域分割します.(decomp
による領域分割の方が高性能です)
mpirun -np 32 Peridigm disk_impact.yaml
-- Peridigm
-- version 1.5.0 (Dev)
MPI initialized on 32 processors.
Time step (seconds):
Stable time step 2.66308e-07
User time step not provided
Safety factor 0.7
Time step 1.86416e-07
Total number of time steps 1341
Explicit time integration [===================100% Complete]
Memory Usage (Heap Alloc MB):
Min Max Ave
Zoltan Search Tree 6.70224 13.3142 7.21509
Post Execute 19.5521 21.5141 20.9907
Wallclock Time (seconds):
Min Max Ave
Total 57 57 57
Rebalance 0.00021 0.00036 0.00025
Output 2.3 2.4 2.4
Internal Force 28 51 31
Gather/Scatter 4.3 28 25
Apply Kinematic B.C. 0.0004 0.00072 0.00057
Apply Initial Conditions 0.0084 0.013 0.0089
Apply Body Forces 0.0023 0.0044 0.0026
計算時間はWallclock Time (seconds)に示されています.この場合,総計算時間は57(s)です.
計算後のフォルダの中身は以下のようになっています.
my_fragmenting_cylinder/
|-- fragmenting_cylinder.e.32.00
|-- fragmenting_cylinder.e.32.01
|-- fragmenting_cylinder.e.32.02
|-- fragmenting_cylinder.e.32.03
|-- fragmenting_cylinder.e.32.04
|-- fragmenting_cylinder.e.32.05
|-- fragmenting_cylinder.e.32.06
|-- fragmenting_cylinder.e.32.07
|-- fragmenting_cylinder.e.32.08
|-- fragmenting_cylinder.e.32.09
|-- fragmenting_cylinder.e.32.10
|-- fragmenting_cylinder.e.32.11
|-- fragmenting_cylinder.e.32.12
|-- fragmenting_cylinder.e.32.13
|-- fragmenting_cylinder.e.32.14
|-- fragmenting_cylinder.e.32.15
|-- fragmenting_cylinder.e.32.16
|-- fragmenting_cylinder.e.32.17
|-- fragmenting_cylinder.e.32.18
|-- fragmenting_cylinder.e.32.19
|-- fragmenting_cylinder.e.32.20
|-- fragmenting_cylinder.e.32.21
|-- fragmenting_cylinder.e.32.22
|-- fragmenting_cylinder.e.32.23
|-- fragmenting_cylinder.e.32.24
|-- fragmenting_cylinder.e.32.25
|-- fragmenting_cylinder.e.32.26
|-- fragmenting_cylinder.e.32.27
|-- fragmenting_cylinder.e.32.28
|-- fragmenting_cylinder.e.32.29
|-- fragmenting_cylinder.e.32.30
|-- fragmenting_cylinder.e.32.31
|-- fragmenting_cylinder.txt
|-- fragmenting_cylinder.yaml
|-- fragmenting_cylinder_generate_mesh.py
`-- fragmenting_cylinder_nodeset.txt
fragmenting_cylinder.e.*
というファイルは,各プロセッサで計算された結果です.結果を確認するためには,各プロセッサの結果を一つのファイルにまとめる必要があります.
下記のようにスクリプトを実行します.
MergeFiles.py fragmenting_cylinder.e.32 32
fragmenting_cylinder.e
とfragmenting_cylinder.e.32.log
が新たに作成されます.fragmenting_cylinder.e
は各プロセッサの結果をまとめたものであり,fragmenting_cylinder.e.32.log
はMerge.py
のログファイルです.
my_fragmenting_cylinder/
|-- fragmenting_cylinder.e
|-- fragmenting_cylinder.e.32.00
|-- fragmenting_cylinder.e.32.01
|-- fragmenting_cylinder.e.32.02
|-- fragmenting_cylinder.e.32.03
|-- fragmenting_cylinder.e.32.04
|-- fragmenting_cylinder.e.32.05
|-- fragmenting_cylinder.e.32.06
|-- fragmenting_cylinder.e.32.07
|-- fragmenting_cylinder.e.32.08
|-- fragmenting_cylinder.e.32.09
|-- fragmenting_cylinder.e.32.10
|-- fragmenting_cylinder.e.32.11
|-- fragmenting_cylinder.e.32.12
|-- fragmenting_cylinder.e.32.13
|-- fragmenting_cylinder.e.32.14
|-- fragmenting_cylinder.e.32.15
|-- fragmenting_cylinder.e.32.16
|-- fragmenting_cylinder.e.32.17
|-- fragmenting_cylinder.e.32.18
|-- fragmenting_cylinder.e.32.19
|-- fragmenting_cylinder.e.32.20
|-- fragmenting_cylinder.e.32.21
|-- fragmenting_cylinder.e.32.22
|-- fragmenting_cylinder.e.32.23
|-- fragmenting_cylinder.e.32.24
|-- fragmenting_cylinder.e.32.25
|-- fragmenting_cylinder.e.32.26
|-- fragmenting_cylinder.e.32.27
|-- fragmenting_cylinder.e.32.28
|-- fragmenting_cylinder.e.32.29
|-- fragmenting_cylinder.e.32.30
|-- fragmenting_cylinder.e.32.31
|-- fragmenting_cylinder.e.32.log
|-- fragmenting_cylinder.txt
|-- fragmenting_cylinder.yaml
|-- fragmenting_cylinder_generate_mesh.py
`-- fragmenting_cylinder_nodeset.txt
結果の可視化
計算結果の可視化にはParaViewを使用します.ParaViewのインストール方法は省きますが,Windowsの場合,公式サイトからダウンロードしてインストールするだけで使用可能です.
結果ファイルfragmenting_cylinder.e
をParaViewで読み込むと次のような結果が得られます.
モデル分割(総粒子数)を変更して解析を実行する
例題をコピー
Fragmenting cylinderの例題を実行用のディレクトリにコピーします.
cd $HOME/peridigm/examples
cp -r /path/to/peridigm_src/examples/fragmenting_cylinder my_fragmenting_cylinder_fine
cd my_fragmenting_cylinder_fine
/path/to/peridigm_src
はPeridigmをソースファイルのパスであることを注意してください.
モデルの分割数(粒子数)を変更
Fragmenting_cylinderのモデル生成用のPythonスクリプトが用意されています.このスクリプトを変更することで,モデルの分割数を変化させます.
fragmenting_cylinder_generate_mesh.py
というファイルを開き,num_points_radius = 5
からnum_points_radius = 12
に変更します.円筒の半径方向の分割数を5から12に変更するという意味です.
#! /usr/bin/env python
import math
import random
if __name__ == "__main__":
# Cylinder dimensions
cylinder_height = 0.100
cylinder_outer_radius = 0.025
cylinder_inner_radius = 0.020
# Number of cells through the wall thickness
- num_points_radius = 5
+ num_points_radius = 12
...
スクリプトを実行して,新たなモデルを作成します.
python fragmenting_cylinder_generate_mesh.py
Generating cylinder mesh:
number of points through wall thickness: 12
number of points around circumference: 339
number of points along cylinder length: 240
total number of points: 976320
Discretization written to fragmenting_cylinder.txt
Node set written to fragmenting_cylinder_nodeset.txt
総粒子数は,70,500から976,320と増加しています.
計算実行
下記コマンドで,計算を実行します.
mpirun -np 32 Peridigm disk_impact.yaml
-- Peridigm
-- version 1.5.0 (Dev)
MPI initialized on 32 processors.
Time step (seconds):
Stable time step 2.63795e-07
User time step not provided
Safety factor 0.7
Time step 1.84656e-07
Total number of time steps 1353
Explicit time integration [===================100% Complete]
Memory Usage (Heap Alloc MB):
Min Max Ave
Zoltan Search Tree 335.659 417.193 355.861
Post Execute 1967.17 2113.36 2076.71
Wallclock Time (seconds):
Min Max Ave
Total 9.3e+03 9.3e+03 9.3e+03
Rebalance 0.00027 0.00078 0.00054
Output 16 16 16
Internal Force 5.4e+03 7.7e+03 5.9e+03
Gather/Scatter 1.2e+03 3.5e+03 3e+03
Apply Kinematic B.C. 0.0012 0.0018 0.0015
Apply Initial Conditions 0.11 0.12 0.12
Apply Body Forces 0.086 0.15 0.13
実行時間は,9300秒(約2.5時間)でした.
計算結果の可視化
先ほどと同様にマージをした後,結果を確認します.
飛散した粒子が多いため結果が見づらいため,完全に破壊した粒子(吹き飛んでいる粒子)を非表示にしました.