public override void Next()
{
// 準備処理
this.prepare();
// 初期時間刻みを設定
double dt = this.MaxDt;
// 各粒子について
this.EachParticle((particle, i) =>
{
// 移動粒子なら
if(particle.Type == ParticleType.FreeMovable)
{
// 加速度を設定
particle.A.X = A * System.Math.Cos(this.Omega * T);
particle.A.Z = A * System.Math.Cos(1 / this.Omega * T);
}
});
// 各粒子について
this.EachParticle((particle, i) =>
{
// 移動粒子なら
if(particle.Type == ParticleType.FreeMovable)
{
// 大きさがゼロでなければ
if(!particle.U.IsZero)
{
// クーラン数から計算した時間刻みを設定
dt = System.Math.Min(dt, 0.2 * particle.D / particle.U.Length);
}
}
});
// 各粒子について
this.EachParticle((particle, i) =>
{
// 移動粒子なら
if(particle.Type == ParticleType.FreeMovable)
{
// 等加速度直線運動
particle.X += particle.U * dt + particle.A * dt * dt / 2;
particle.U += particle.A * dt;
}
});
// 時刻を進める
base.UpdateTime(dt);
}