FDPS講習会
サンプルコード編
細野 七月
京都大学, 理研 AICS

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

コード構成●ユーザーが書くべきもの
・#include <particle̲simulator.h>
・粒子クラスと必要なメンバ関数
・相互作用関数・時間積分ルーチン
・I/O (粒子クラスのI/Oと、FileHeaderクラス)

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

サンプルコード●今回のサンプルコードの内容
流体 (Smoothed Particle Hydrodynamics)
重力 (w/ and w/o Phantom-GRAPE (Tanikawa+, 2011; 2012))●本スライドでは、重力を計算するコードを取り上げて解説する。
・時間積分法はleap-frog法
・初期条件はその場生成(ファイル読み込みではない)・ファイル構成user-deﬁned.hpp
nbody.cpp

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

user-deﬁned.hpp

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

user-deﬁned.hpp
クラス

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

user-deﬁned.hpp

FileHeaderクラス

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

user-deﬁned.hpp

粒子クラス

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

user-deﬁned.hpp
粒子物理量2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

user-deﬁned.hpp

FDPSにデータを渡すためのメンバ関数

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

user-deﬁned.hpp

I/Oメンバ関数

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

相互作用
テンプレート関数(w/ Phantom-GRAPE)

user-deﬁned.hpp

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

user-deﬁned.hpp

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

user-deﬁned.hpp

相互作用
テンプレート関数(w/o Phantom-GRAPE)

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

user-deﬁned.hpp

相互作用
テンプレート関数(w/o Phantom-GRAPE)

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

user-deﬁned.hpp

相互作用
テンプレート関数(w/o Phantom-GRAPE)

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

相互作用template関数●本当は2つ(Super Particleからの寄与と通常Particleからの寄与)書く必要がある。
●今回はどちらも相互作用形としては同じなので、
templateを使って1つで済ます。

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

nbody.cpp

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

nbody.cpp

FDPSのinclude

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

nbody.cpp

leap-frog法による
時間積分

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

nbody.cpp
getNumberOfParticleLocal()
で粒子数が取得できる

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

nbody.cpp

粒子群クラスに[i]をつけるとi粒子のデータが取得できる

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

nbody.cpp
メイン関数開始

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

nbody.cpp
FDPS初期化

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

コマンドライン
引数の解析

nbody.cpp

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

nbody.cpp

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

粒子群クラスの生成・初期化

nbody.cpp

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

nbody.cpp

ドメイン情報の生成・初期化
領域分割

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

nbody.cpp
相互作用ツリークラスの生成・初期化2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

nbody.cpp

相互作用関数を用いた力の計算

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

nbody.cpp
時間積分2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

nbody.cpp

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

nbody.cpp

FDPS終了2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

nbody.cpp

352行！ FDPS講習会
2016/07/06//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

最後に●ユーザーが書かなければならないのは大体これくらい。
→重力の場合は352+148行で終わる。
●コード内に並列化を意識するようなところは無かった。
→コンパイルの方法を切り替えるだけで、OpenMPやMPIを切り替えられる。

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//

実習の流れ●詳しくはFDPS講習会の手引を御覧ください。
(http://www.jmlab.jp/?p=650)●実習用のFOCUSスパコンにログインし、サンプルコードを(1)並列化無し (2)OpenMP (3)OpenMP + MPIの3パターンについてコンパイル・実行【計算内容】重力cold collapse
流体 (Smoothed Particle Hydrodynamics法)
adiabatic sphere collapse
その後結果の解析

2016/07/06 FDPS講習会//==================================\\|||||| ::::::: ::::::. ::::::. .::::::. ||
|| ::
::
: ::
: ::
||
|| :::::: ::: ::::::' `:::::. |||| ::::::::' ::`......' ||||Framework for Developing||||
Particle Simulator||\\==================================//