ホーム 道しるべ 憩いの広場 濃緑空間 濃緑研の日記

オイラ−法プログラム
ホーム ] 上へ ] [ オイラ−法プログラム ] オイラー法(3DNow!) ] RungeKutta法プログラム ] オイラー法FPUアセンブリ ]

 

以下に、プログラム(オイラー法)の一部を示す。  

G = 6.67e-11;
    M = 5.977e24;      //地球の質量(kg)
    GM = G*M;
    dt = 1;                 //1Sec間の移動を計算
    GMdt = -GM*dt;
    sat.P.X = 6.57e6;    //地球の半径+200km
    sat.P.Y = 0;
    sat.P.Z = 0;
    sat.V.X = 0;         //初速7.92km/s
    sat.V.Y = 6e3;
    sat.V.Z = 5.17e3;

    for(n=0;n<400000;n++)
    {
        for(i=0;i<600;i++)
        {
            R = sat.P.X*sat.P.X+sat.P.Y*sat.P.Y+sat.P.Z*sat.P.Z;
//        r = sqrt(R);
//        w = GMdt/(r*R);

//   sat.dmy1 = R*1e-9;

  w = GMdt/(sqrt(R)*R);
            sat.V.X += w*sat.P.X;
            sat.P.X += sat.V.X*dt;
            sat.V.Y += w*sat.P.Y;
            sat.P.Y += sat.V.Y*dt;
            sat.V.Z += w*sat.P.Z;
            sat.P.Z += sat.V.Z*dt;
        }
    }

平方根と除算の影響をみるために、wの計算をコメントアウトすると

Rはループ内で使われないことになり、コンパイラの最適化により不要な行と判断されてしまう。

そのため、ダミーでsat.dmy1への代入とループの外でsat.dmy1を表示させることで最適化による

省略を阻止する(しかし乗算と加算がそれぞれ1回加わる)