Peridigmの例題を実行してみる(Fragmenting cylinder編)

この記事では,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.efragmenting_cylinder.e.32.logが新たに作成されます.fragmenting_cylinder.eは各プロセッサの結果をまとめたものであり,fragmenting_cylinder.e.32.logMerge.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時間)でした.

計算結果の可視化

先ほどと同様にマージをした後,結果を確認します.

飛散した粒子が多いため結果が見づらいため,完全に破壊した粒子(吹き飛んでいる粒子)を非表示にしました.

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