力を実際に計算するまえの最後の準備として、各ノードについてそのなかの粒 子の重心と総質量を出したい。これは以下のようになる。
pt minus 1 pt
void bhnode::set_cm_quantities()
{
if (nparticle > 1){
int i;
pos = 0.0;
mass = 0.0;
for(i=0;i<8;i++){
if (child[i] != NULL){
child[i]->set_cm_quantities();
real mchild = child[i]->mass;
pos += mchild*child[i]->pos;
mass += mchild;
}
}
pos /= mass;
}
}
粒子の数が 1 であれば、既に粒子データがコピーされているので別になにも
しなくていい。1より大きければ、実際にある子ノード全部を見て、モーメン
ト、質量を出し、モーメントを質量で割れば重心がでる。
ここでも再帰を使っている。つまり、実際にchild[i]->mass 等を使う 前に、child[i] について質量、重心を計算させているのである。
再帰を使うことで、ちょっと考えると大変そうな処理が非常に簡単に実現されている。