描画班班ゼミ資料

卒業論文中間発表
2004/11/10
上田研究室 描画班 B4
飛田伸一
資料の置き場
• 描画班のページ
(http://www.ueda.info.waseda.ac.jp/~wakat
suki/pukiwiki/pukiwiki.php)
発表の流れ
•
•
•
•
研究の目的
今までやったこと
研究内容
これからの課題
研究の目的
• 多体問題という問題がある。これはシミュレーション
において、物体の数が増えると、それに伴い計算量
が爆発的に増大するという問題である。HCCでもこ
の問題が発生する
• 現在、Grifonではビリヤードの問題を描画すること
が出来る。ここで、ビリヤードの玉の数を増やして
いった場合、計算量の爆発という問題が出てくる
• 計算量の増大による、処理時間の増加を抑える。即
ち、HCC処理系による待ち時間を少なくし、多体問
題のアニメーションを容易にするという事を目標とす
る
今までやったこと
•
•
•
•
•
処理系にタイマーを入れる
マニュアルの読み込み
性能評価法の提案
多体問題のサーベイ
(研究室に慣れる)
HCC処理系における多体問題
• 多体問題は問題依存の部分がある
– ビリヤードの球の数を増やした問題
– 天体の問題
• よってプログラムを各部分での工夫が有効だ
と思われる
ビリヤード型多体問題
• ビリヤードの球を増やしていく問題
• 衝突系なので、微小時間で見れば2球の問
題となる
• 2つの球の衝突を判定するためだけにforall
を使っている
プログラム
一部抜粋
Collisions = (){
O(n^2)
always forall Ball(A) do forall Ball(B) do
if (A < B) then
//not the same ball
if ((B.px - A.px)^2 + (B.py - A.py)^2 = 4*radius^2) then {
Collision,
if (A.px = B.px) then {
A.ChangeY, B.ChangeY,
A.vy = prev(B.vy),
B.vy = prev(A.vy)
},
if (A.px < B.px) then {
A.ChangeX, B.ChangeX,
A.ChangeY, B.ChangeY,
new c in new ix in {
c = (A.py - B.py)/(A.px - B.px),
ix = (prev(B.vx - A.vx) + c*prev(B.vy - A.vy))/(1+c^2),
B.vx = prev(B.vx) - ix,
B.vy = prev(B.vy) - c*ix,
A.vx + B.vx = prev(A.vx + B.vx), // X-momentum
A.vy + B.vy = prev(A.vy + B.vy) // Y-momentum
}
}
}
},
Ball(B1, 10, 10, 25, 25),
Ball(B2, 20, 11, -35, 55),
Ball(B3, 80, 51, -15, 49),
Edges(),
Collisions(),
Pockets()
天体型多体問題
• 太陽系など重力場の天体の問題
• 重力が全ての物体に影響を及ぼすことから
起こる
• forallは物体にかかる重力を知るために使っ
ている
プログラム
Planet = (initvx, initvy, initpx, initpy, m)[px, py, mass]{
px = initpx, py = initpy,
px' = initvx, py' = initvy,
sample(px),
sample(py),
always {
cont(px), cont(py),
mass = m,
px'' = sum(F.x, Force(F), F.Target = Self),
py'' = sum(F.y, Force(F), F.Target = Self)
}
},
always Force = (S, T)[Target, x, y]{
Target = T,
new tmp in {
tmp = g * S.mass /((S.px - T.px)^2 + (S.py -T.py)^2)^1.5,
x = tmp * (S.px - T.px),
y = tmp * (S.py - T.py)
}
},
always forall Planet(X) do forall Planet(Y) do
if (X != Y) then new F in Force(F, X, Y),
always g = 0.00011792,
Planet(Sun, 0, 0.00205455, 0, 0, 332948.34),
Planet(Mercury, 0, 8.1987, 0.4666, 0, 0.055271),
Planet(Venus, 0, 7.3365, 0.72794, 0, 0.81476),
Planet(Earth, 0, 6.179, 1.0167, 0, 1),
Planet(Mars, 0, 5.006367, 1.6657754, 0, 0.10745),
Planet(Jupiter, 0, -2.8928, -4.9505, 0, 317.94),
Planet(Saturn, 0, 1.9244, 10.0695, 0, 95.181),
Planet(Uranus, 0, 1.36838, 20.088, 0, 14.535),
Planet(Neptune, 0, 1.13635, 30.3155, 0, 17.135),
Planet(Pluto, 0, 0.77826, 49.33957, 0, 0.0021586)
O(n^2)
HCC処理系における多体問題の評
価(ビリヤード)
billiard多体問題RKQC
1
1
0
2
0.01
3
0.04
4
0.06
5
0.09
6
0.12
7
0.16
8
0.2
9
0.28
10
0.35
11
0.43
12
0.54
13
0.65
14
1.12
15
0.95
16
1.6
17
2.35
18
2.96
19
3.44
20
4.02
2
0.01
0.02
0.05
0.07
0.13
0.14
0.2
0.25
0.34
0.46
0.56
0.79
0.96
1.68
1.79
2.78
4.16
5.12
6.18
7.22
横軸: -rオプションで指定した時間
縦軸: 物体の数
値の単位は秒(CPUTime)
4
0.01
0.03
0.07
0.11
0.2
0.22
0.29
0.36
0.47
0.64
0.86
1.16
1.33
1.93
2.57
4.09
7.18
8.67
8.15
10.5
8
0.02
0.07
0.13
0.17
0.29
0.4
0.57
0.72
1.01
1.4
1.84
2.31
2.49
3.7
4.27
7.16
10.93
13.35
17.51
23.03
16
0.02
0.14
0.24
0.27
0.47
0.73
0.92
1.35
1.75
2.49
2.81
3.33
3.52
6.65
8.62
11.44
13.78
16.51
25.64
31.61
32
0.02
0.18
0.44
0.49
0.73
1.13
1.28
2.02
2.43
3.4
3.51
4.38
4.55
9.39
11.91
16.11
16.11
18.71
33.61
35.92
64
0.03
0.28
0.82
0.7
0.94
1.58
1.74
2.75
3.17
4.49
4.41
5.48
5.67
11.71
15.08
20.24
17.5
20.06
42.06
38.09
HCC処理系における多体問題の評
価(ビリヤード)
処理に掛かった時間(s)
Billiard(RKQC)
4.5
4
3.5
3
2.5
2
1.5
1
0.5
0
Billiard(RKQC)
0
5
10
15
ボールの数
-r 1(1UnitTime)の時のグラフ
20
25
HCC処理系における多体問題の評
価(天体)
planetの多体問題(RKQC)
1
2
1
0
0
2
0.02
0.02
3
2.59
5.14
4
5.94
11.79
5
11.56
23.05
6
19.87
39.18
7
31.7
8
52.73
9
287.9
10 1616.07
4
0
0.02
10.2
23.72
46.27
8
0
0.02
20.46
47.38
92.89
16
0
0.03
40.58
94.98
188.21
32
0
0.04
81.5
191.95
横軸: -rオプションで指定した時間
縦軸: 物体の数
値の単位は秒(CPUTime)
※実行に時間が掛かったため、ところどころ計測していない
64
0
0.06
163.19
393.54
HCC処理系における多体問題の評
価(天体)
処理に掛かった時間(s)
planet(RKQC)
1800
1600
1400
1200
1000
800
600
400
200
0
-200 0
planet(RKQC)
2
4
6
惑星の数
-r 1(1UnitTime)の時のグラフ
8
10
12
ビリヤード型多体問題(空間分割)
• 空間を分割して、一度に見ていく物体の数を
減らす方法
• うまく分ければ、計算量をO(N^2)からO(N
log N)に近づけることが出来る
空間分割
天体型多体問題(ツリー法)
• 天体型多体問題に有効
• 計算量をO(N^2)からO(N log N)に近づける
ことが出来る
ツリー法のアルゴリズム
平面内の適当な領域に粒子が分布しているとする
粒子は有限個なので、その全てを含む正方形を考えられる
1. まず、その正方形を4つに分ける
2. 正方形に粒子が2個以上入っていたら、さらに正方形を4つ
に分けるという方法で、まず空間を分割する。
3. 分割した空間に対応したツリー構造を考えると、根に全体の
正方形に対応する節点があり、その下に4つの小正方形、
…と続いていって、ツリーの葉には粒子1つ1つが来ることに
なる
4. 一つ一つの粒子への重力は、ツリーのある節点があらわす
正方形の粒子全体からのある粒子への力を計算すれば出
てくる
ツリー法のアルゴリズム
つまり
{
ある節点からある粒子(天体)への力=
その節点の重心からの力
(節点と粒子が「十分離れている」)
その節点の子節点からの力の合計
(それ以外)
となる。
「十分離れている」というものを判断するために
l/d < θ
というものを使う。Dは粒子と節点の重心の距離、lは節点に対応する正方形の
一辺の長さ、θは見込み角である。
見込み角は計算精度と計算量を制御するものである。
ツリー法
これからの課題
• HCCの環境整備及び興味あることの研究
– 性能評価法
– mathlib
– 刻み幅と収束の調整など(Euler法)
• 実装
– どのようにHCCで実装するか?
参考文献
•
牧野淳一郎 重力多体系の数値計算 2001
http://jun.artcompsci.org/~makino/papers/bussei-nbody/bussei-nbody.html
•
Bj"orn Carlson. Vineet Gupta. The hcc Programer’s Manual