void rk4(float *r, float *vr, float *J2, float *rp, float *cm, int N, float dt, float tend) { float kr[4], kv[4]; float r0, v0, r1; for (int i = 0; i<N; ++i) { float t = 0; while (t < tend) { r0 = r[i]; v0 = vr[i]; /* Step 1 */ r1 = r0; kr[0] = v0 ; kv[0] = compute_acc(r1, J2[i], rp, cm, N); /* Step 2 */ r1 = r0 + 0.5*dt*kr[0]; kr[1] = v0 + 0.5*dt*kv[0]; kv[1] = compute_acc(r1, J2[i], rp, cm, N); /* Step 3 */ r1 = r0 + 0.5*dt*kr[1]; kr[2] = v0 + 0.5*dt*kv[1]; kv[2] = compute_acc(r1, J2[i], rp, cm, N); /* Step 4 */ r1 = r0 + dt*kr[2]; kr[3] = v0 + dt*kv[2]; kv[3] = compute_acc(r1, J2[i], rp, cm, N); r[i] = r0 + dt*(kr[0] + 2.0*kr[1] + 2.0*kr[2] + kr[3])/6.0; vr[i] = v0 + dt*(kv[0] + 2.0*kv[1] + 2.0*kv[2] + kv[3])/6.0; t+=dt; } } }
static void trs_prepare_acc(struct tr_score *sc) { double acc = sc->origin->conf->acc; if (acc < 0) acc = 0; else if (acc > MAX_ACC) acc = MAX_ACC; sc->great = sc->origin->great; sc->good = sc->origin->good; sc->miss = sc->origin->miss; sc->acc = compute_acc(sc->great, sc->good, sc->miss); while (sc->acc > acc) { double try = compute_acc(sc->great-1, sc->good+1, sc->miss); if (try <= acc) { sc->great--; sc->good++; sc->acc = try; } else { sc->great--; sc->miss++; sc->acc = compute_acc(sc->great, sc->good, sc->miss); } }
static void trs_prepare_ggm(struct tr_score *sc) { int good = sc->origin->conf->good; int miss = sc->origin->conf->miss; if (good < 0) good = 0; if (miss < 0) miss = 0; // Remove exceeding good and miss while (good + miss > sc->origin->great) { if (good > 0) good--; else miss--; } sc->great = sc->origin->great - good - miss; sc->good = good; sc->miss = miss; sc->acc = compute_acc(sc->great, sc->good, sc->miss); }