next up previous
Next: 2 力の計算 Up: 計算天文学 II 第11回 データ構造とアルゴリズム(2) Previous: 計算天文学 II 第11回 データ構造とアルゴリズム(2)

1 ノードの物理データ

力を実際に計算するまえの最後の準備として、各ノードについてそのなかの粒 子の重心と総質量を出したい。これは以下のようになる。

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();
                double mchild = child[i]->mass;
                pos += mchild*child[i]->pos;
                mass += mchild;
            }
        }
        pos /= mass;
    }
}
粒子の数が 1 であれば、既に粒子データがコピーされているので別になにも しなくていい。1より大きければ、実際にある子ノード全部を見て、モーメン ト、質量を出し、モーメントを質量で割れば重心がでる。

ここでも再帰を使っている。つまり、実際にchild[i]->mass 等を使う 前に、child[i] について質量、重心を計算させているのである。

再帰を使うことで、ちょっと考えると大変そうな処理が非常に簡単に実現されている。



Jun Makino
平成19年1月14日