Example #1
0
    // Evolve the dynamical system using a 4th order RK integrator
    private Vector3 Evolve(float h)
    {
        Vector3 xout = Vector3.zero;

        chaosEqn.Function(ref x, ref a_n);
        float h_frac = h / 2f;

        arg[0] = x[0] + h_frac * a_n[0];
        arg[1] = x[1] + h_frac * a_n[1];
        arg[2] = x[2] + h_frac * a_n[2];
        chaosEqn.Function(ref arg, ref b_n);
        arg[0] = x[0] + h_frac * b_n[0];
        arg[1] = x[1] + h_frac * b_n[1];
        arg[2] = x[2] + h_frac * b_n[2];
        chaosEqn.Function(ref arg, ref c_n);
        h_frac = h;
        arg[0] = x[0] + h_frac * c_n[0];
        arg[1] = x[1] + h_frac * c_n[1];
        arg[2] = x[2] + h_frac * c_n[2];
        chaosEqn.Function(ref arg, ref d_n);
        h_frac = h / 6f;
        xout.x = x[0] + h_frac * (a_n[0] + 2f * b_n[0] + 2f * c_n[0] + d_n[0]);
        xout.y = x[1] + h_frac * (a_n[1] + 2f * b_n[1] + 2f * c_n[1] + d_n[1]);
        xout.z = x[2] + h_frac * (a_n[2] + 2f * b_n[2] + 2f * c_n[2] + d_n[2]);
        x[0]   = xout.x;
        x[1]   = xout.y;
        x[2]   = xout.z;
        return(xout);
    }
Example #2
0
    // Evolve the dynamical system using a 4th order RK integrator
    private void Evolve(float h)
    {
        // do nothing if all inactive
        if (inactive == null)
        {
            return;                     // Particle system has not init-ed yet or is done
        }
        //  (did not work in Start() -> Unity bug? Init sequencing?)
        if (!playing)
        {
            chaosParticles.Play();
            playing = true;
        }

        for (int j = 0; j < particleCount; j++)
        {
            if (!inactive[j])
            {
                Vector3 xout = Vector3.zero;
                x_in[0] = x[j, 0];
                x_in[1] = x[j, 1];
                x_in[2] = x[j, 2];
                chaosEqn.Function(ref x_in, ref a_n);
                //Debug.Log("j=" + j + " x=" + x[j,0] + " arg0=" + arg[0] +  " a_n0=" + a_n[0]);
                float h_frac = h / 2f;
                arg[0] = x[j, 0] + h_frac * a_n[0];
                arg[1] = x[j, 1] + h_frac * a_n[1];
                arg[2] = x[j, 2] + h_frac * a_n[2];
                chaosEqn.Function(ref arg, ref b_n);
                arg[0] = x[j, 0] + h_frac * b_n[0];
                arg[1] = x[j, 1] + h_frac * b_n[1];
                arg[2] = x[j, 2] + h_frac * b_n[2];
                chaosEqn.Function(ref arg, ref c_n);
                h_frac = h;
                arg[0] = x[j, 0] + h_frac * c_n[0];
                arg[1] = x[j, 1] + h_frac * c_n[1];
                arg[2] = x[j, 2] + h_frac * c_n[2];
                chaosEqn.Function(ref arg, ref d_n);
                h_frac  = h / 6f;
                x[j, 0] = x[j, 0] + h_frac * (a_n[0] + 2f * b_n[0] + 2f * c_n[0] + d_n[0]);
                x[j, 1] = x[j, 1] + h_frac * (a_n[1] + 2f * b_n[1] + 2f * c_n[1] + d_n[1]);
                x[j, 2] = x[j, 2] + h_frac * (a_n[2] + 2f * b_n[2] + 2f * c_n[2] + d_n[2]);
                if (double.IsNaN(x[j, 0]) || double.IsNaN(x[j, 1]) || double.IsNaN(x[j, 2]))
                {
                    inactive[j] = true;
                }
            }
        }
    }