diff --git a/src/jupiter.c b/src/jupiter.c new file mode 100644 index 0000000000000000000000000000000000000000..7cbe00aa5c19e9012139a9f4c1806224eac3d08e --- /dev/null +++ b/src/jupiter.c @@ -0,0 +1,166 @@ +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + +#define pi 3.141592653589793 +#define solar_mass 1 +#define G (4 * pi * pi) +#define days_per_year 365.24 +#define JD 5.2 +#define VJ0 2.75535903023 + + +typedef struct { + double x[3]; + double v[3]; + double a[3]; + double mass; +} Planet; + +//Unit scaling: Mass in solar mass, distance in AU, velocity in AU/year, and constant G in AU^3/solar mass*year^2 + +Planet Planets[] = { + { + {0,0,0}, + {0,0,0}, + {0,0,0}, + solar_mass + }, + { + {JD, 0, 0}, + {0, VJ0, 0}, + {0,0,0}, + 9.54791938424326609e-04 * solar_mass + }, + { + {-JD, 0, 0}, + {0, -VJ0, 0}, + {0, 0, 0}, + 2.85885980666130812e-04 * solar_mass + } +}; +static inline double distance( const double x1[3], const double x2[3]) { + const double x = x1[0] - x2[0]; + const double y = x1[1] - x2[1]; + const double z = x1[2] - x2[2]; + + return sqrt(x*x + y*y + z*z + 0.001); + +} + +void update(int steps){ + long run = 0; + const int noOfBodies = sizeof(Planets)/sizeof(Planet); + const double dt = 0.01; + + while (run < steps) { + for (int l = 0; l < noOfBodies; l++) { + Planets[l].v[0] += 0.5 * Planets[l].a[0]* dt; + Planets[l].v[1] += 0.5 * Planets[l].a[1]* dt; + Planets[l].v[2] += 0.5 * Planets[l].a[2]* dt; + } + for (int k = 0; k < noOfBodies; k++) { + Planets[k].x[0] += dt * Planets[k].v[0]; + Planets[k].x[1] += dt * Planets[k].v[1]; + Planets[k].x[2] += dt * Planets[k].v[2]; + Planets[k].a[0] = 0; + Planets[k].a[1] = 0; + Planets[k].a[2] = 0; + } + + for (int i = 0; i < noOfBodies; i++) { + for (int j = i+1; j < noOfBodies; j++) { + double dist = distance(Planets[i].x, Planets[j].x); + double a = G/pow(dist, 3); + + Planets[i].a[0] += a * Planets[j].mass * ( Planets[j].x[0] - Planets[i].x[0] ); + Planets[i].a[1] += a * Planets[j].mass * ( Planets[j].x[1] - Planets[i].x[1] ); + Planets[i].a[2] += a * Planets[j].mass * ( Planets[j].x[2] - Planets[i].x[2] ); + Planets[j].a[0] += a * Planets[i].mass * ( Planets[i].x[0] - Planets[j].x[0] ); + Planets[j].a[1] += a * Planets[i].mass * ( Planets[i].x[1] - Planets[j].x[1] ); + Planets[j].a[2] += a * Planets[i].mass * ( Planets[i].x[2] - Planets[j].x[2] ); + } + } + + for (int m = 0; m < noOfBodies; m++) { + Planets[m].v[0] += 0.5 * Planets[m].a[0]* dt; + Planets[m].v[1] += 0.5 * Planets[m].a[1]* dt; + Planets[m].v[2] += 0.5 * Planets[m].a[2]* dt; + } + + run++;} +} + +int main() { + FILE *starting = fopen("starting.txt", "w+"); + if (starting == NULL) { + printf("HELP\n COULDNT OPEN FILE\nSIGSEVV"); + } else { + printf("Output File opened\n"); + } + const int noOfBodies = sizeof(Planets)/sizeof(Planet); + double s =0; + double ds=0.001; + + for(s=1.5; s<=3; s+=ds){ + + Planets[2].x[0]=-s*JD; + Planets[2].x[1]=0; + Planets[2].x[2]=0; + Planets[2].v[0]=0; + Planets[2].v[1]=-sqrt(1/s)*VJ0; + Planets[2].v[2]=0; + for(int i=0; i<3;i++){ + for(int k=0; k<3; k++){ + Planets[k].a[i]=0; + } + } + for(int i=0; i<3; i++){ + Planets[0].x[i]=0; + Planets[0].v[i]=0; + } + Planets[1].x[0]=JD; + Planets[1].x[1]=0; + Planets[1].x[2]=0; + Planets[1].v[0]=0; + Planets[1].v[1]=VJ0; + Planets[1].v[2]=0; + update(10000); + double r10= sqrt(Planets[2].x[1]*Planets[2].x[1]+Planets[2].x[0]*Planets[2].x[0]); + update(10000); + double r1= sqrt(Planets[2].x[1]*Planets[2].x[1]+Planets[2].x[0]*Planets[2].x[0]); + + Planets[2].x[0]=(-s*JD)-0.01; + Planets[2].x[1]=0; + Planets[2].x[2]=0; + Planets[2].v[0]=0; + Planets[2].v[1]=-sqrt(G/((s*JD)-0.01)); + Planets[2].v[2]=0; + for(int i=0; i<3;i++){ + for(int k=0; k<3; k++){ + Planets[k].a[i]=0; + } + } + for(int i=0; i<3; i++){ + Planets[0].x[i]=0; + Planets[0].v[i]=0; + } + Planets[1].x[0]=JD; + Planets[1].x[1]=0; + Planets[1].x[2]=0; + Planets[1].v[0]=0; + Planets[1].v[1]=VJ0; + Planets[1].v[2]=0; + update(10000); + double r20= sqrt(Planets[2].x[1]*Planets[2].x[1]+Planets[2].x[0]*Planets[2].x[0]); + update(10000); + double r2=sqrt(Planets[2].x[1]*Planets[2].x[1]+Planets[2].x[0]*Planets[2].x[0]); + double d0=fabs(r10-r20); + double d=fabs(r2-r1); + double l= log(d/d0); + fprintf(starting, "%lf %lf\n", r10, l); + + } + fclose(starting); +} +