Created
February 21, 2026 13:38
-
-
Save jake-87/3f88290e42d59e876dda5e828ad91897 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <math.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #define pi 3.141592653589793 | |
| #define solar_mass (4 * pi * pi) | |
| #define days_per_year 365.24 | |
| struct planet { | |
| double x, y, z; | |
| double vx, vy, vz; | |
| double mass; | |
| }; | |
| static inline void advance(struct planet bodies[restrict 5], double dt) | |
| { | |
| int i, j; | |
| for (i = 0; i < 5; i++) { | |
| for (j = i + 1; j < 5; j++) { | |
| double dx = bodies[i].x - bodies[j].x; | |
| double dy = bodies[i].y - bodies[j].y; | |
| double dz = bodies[i].z - bodies[j].z; | |
| double dsq = dx * dx + dy * dy + dz * dz; | |
| double mag = dt / (dsq * sqrt(dsq)); | |
| bodies[i].vx -= dx * bodies[j].mass * mag; | |
| bodies[i].vy -= dy * bodies[j].mass * mag; | |
| bodies[i].vz -= dz * bodies[j].mass * mag; | |
| bodies[j].vx += dx * bodies[i].mass * mag; | |
| bodies[j].vy += dy * bodies[i].mass * mag; | |
| bodies[j].vz += dz * bodies[i].mass * mag; | |
| } | |
| } | |
| for (i = 0; i < 5; i++) { | |
| bodies[i].x += dt * bodies[i].vx; | |
| bodies[i].y += dt * bodies[i].vy; | |
| bodies[i].z += dt * bodies[i].vz; | |
| } | |
| } | |
| double energy(struct planet bodies[restrict 5]) | |
| { | |
| double e; | |
| int i, j; | |
| e = 0.0; | |
| for (i = 0; i < 5; i++) { | |
| struct planet * b = &(bodies[i]); | |
| e += 0.5 * b->mass * (b->vx * b->vx + b->vy * b->vy + b->vz * b->vz); | |
| for (j = i + 1; j < 5; j++) { | |
| double dx = b->x - bodies[j].x; | |
| double dy = b->y - bodies[j].y; | |
| double dz = b->z - bodies[j].z; | |
| double distance = sqrt(dx * dx + dy * dy + dz * dz); | |
| e -= (b->mass * bodies[j].mass) / distance; | |
| } | |
| } | |
| return e; | |
| } | |
| void offset_momentum(struct planet bodies[restrict 5]) | |
| { | |
| double px = 0.0, py = 0.0, pz = 0.0; | |
| int i; | |
| for (i = 0; i < 5; i++) { | |
| px += bodies[i].vx * bodies[i].mass; | |
| py += bodies[i].vy * bodies[i].mass; | |
| pz += bodies[i].vz * bodies[i].mass; | |
| } | |
| bodies[0].vx = - px / solar_mass; | |
| bodies[0].vy = - py / solar_mass; | |
| bodies[0].vz = - pz / solar_mass; | |
| } | |
| #define NBODIES 5 | |
| struct planet bodies[NBODIES] = { | |
| { 0, 0, 0, 0, 0, 0, solar_mass }, | |
| { | |
| 4.84143144246472090e+00, | |
| -1.16032004402742839e+00, | |
| -1.03622044471123109e-01, | |
| 1.66007664274403694e-03 * days_per_year, | |
| 7.69901118419740425e-03 * days_per_year, | |
| -6.90460016972063023e-05 * days_per_year, | |
| 9.54791938424326609e-04 * solar_mass | |
| }, | |
| { | |
| 8.34336671824457987e+00, | |
| 4.12479856412430479e+00, | |
| -4.03523417114321381e-01, | |
| -2.76742510726862411e-03 * days_per_year, | |
| 4.99852801234917238e-03 * days_per_year, | |
| 2.30417297573763929e-05 * days_per_year, | |
| 2.85885980666130812e-04 * solar_mass | |
| }, | |
| { | |
| 1.28943695621391310e+01, | |
| -1.51111514016986312e+01, | |
| -2.23307578892655734e-01, | |
| 2.96460137564761618e-03 * days_per_year, | |
| 2.37847173959480950e-03 * days_per_year, | |
| -2.96589568540237556e-05 * days_per_year, | |
| 4.36624404335156298e-05 * solar_mass | |
| }, | |
| { | |
| 1.53796971148509165e+01, | |
| -2.59193146099879641e+01, | |
| 1.79258772950371181e-01, | |
| 2.68067772490389322e-03 * days_per_year, | |
| 1.62824170038242295e-03 * days_per_year, | |
| -9.51592254519715870e-05 * days_per_year, | |
| 5.15138902046611451e-05 * solar_mass | |
| } | |
| }; | |
| int main(int argc, char ** argv) | |
| { | |
| int n = atoi(argv[1]); | |
| int i; | |
| offset_momentum(bodies); | |
| printf ("%.9f", energy(bodies)); | |
| for (i = 1; i <= n; i++) | |
| advance(bodies, 0.01); | |
| printf ("%.9f", energy(bodies)); | |
| return 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment