力を実際に計算するまえの最後の準備として、各ノードについてそのなかの粒 子の重心と総質量を出したい。これは以下のようになる。
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] について質量、重心を計算させているのである。
再帰を使うことで、ちょっと考えると大変そうな処理が非常に簡単に実現されている。