struct reb_particle reb_get_jacobi_com(struct reb_particle* p){ int p_index = reb_get_particle_index(p); struct reb_simulation* r = p->sim; struct reb_particle com = r->particles[0]; for(int i=1; i<p_index; i++){ com = reb_get_com_of_pair(com, r->particles[i]); } return com; }
int reb_remove_by_hash(struct reb_simulation* const r, uint32_t hash, int keepSorted){ struct reb_particle* p = reb_get_particle_by_hash(r, hash); if(p == NULL){ reb_error(r,"Particle to be removed not found in simulation. Did not remove particle."); return 0; } else{ int index = reb_get_particle_index(p); return reb_remove(r, index, keepSorted); } }
int main(int argc, char* argv[]) { int np = 20; omp_set_num_threads(np); FILE *fp2; char hash_name[] = "hash.csv"; fp2 = fopen(hash_name, "w+"); fprintf(fp2, "Hash, Mass, Radius\n"); char filename[512] = "veras_no_frag.bin"; // Trying to restart from the Simulation Archive. struct reb_simulation* r = reb_create_simulation_from_simulationarchive(filename); printf("Loaded Simulation Successfully\n"); printf("Time is: %.16f\n", r->t); printf("N_active is: %i\n", r->N); printf("Timestep is: %.3f\n", r->dt); r->heartbeat = heartbeat; r->dt = 10.0; r->gravity = REB_GRAVITY_TREE; r->integrator = REB_INTEGRATOR_WHFAST; r->collision = REB_COLLISION_TREE; r->boundary = REB_BOUNDARY_OPEN; const double boxsize = 2.5e10; // about 0.15 AU, with fragments at 0.0054 AU reb_configure_box(r,boxsize,1,1,1); struct rebx_extras* rebx = rebx_init(r); /* struct rebx_effect* rad_params = rebx_add(rebx, "radiation_forces"); double* c = rebx_add_param(rad_params, "c", REBX_TYPE_DOUBLE); *c = 3.e8; // speed of light in SI units */ struct reb_particle* wd = reb_get_particle_by_hash(r, reb_hash("wd")); int wd_index = reb_get_particle_index(wd); /* int* rad_source = rebx_add_param(&r->particles[wd_index], "radiation_source", REBX_TYPE_INT); *rad_source = 1; */ struct rebx_effect* gr_params = rebx_add(rebx, "gr"); double* c_2 = rebx_add_param(gr_params, "c", REBX_TYPE_DOUBLE); *c_2 = 3.e8; int* source = rebx_add_param(&r->particles[wd_index], "gr_source", REBX_TYPE_INT); *source = 1; double wd_rad = wd->r; double disk_rad_in = 10.0*wd_rad; double disk_rad_out = 90.0*wd_rad; printf("Inner disk radius is: %f AU\n", disk_rad_in/1.496e11); printf("Outer disk radius is: %f AU\n", disk_rad_out/1.496e11); int N_disk = 2000; double disk_inc_low = 0.0; double disk_inc_high = 0.0; double e_low = 0.0; double e_high = 0.0; r->N_active = r->N; double* add_beta; while(r->N<N_disk + r->N_active){ struct reb_particle pt = {0}; double a = reb_random_uniform(disk_rad_in, disk_rad_out); double e = reb_random_uniform(e_low, e_high); double inc = reb_random_uniform(disk_inc_low, disk_inc_high); double Omega = reb_random_uniform(0, 2.*M_PI); double apsis = reb_random_uniform(0, 2.*M_PI); double phi = reb_random_uniform(0.0, 2.*M_PI); pt = reb_tools_orbit_to_particle(r->G, r->particles[wd_index], 0.0, a, e, inc, Omega, apsis, phi); int N_count = r->N - r->N_active; pt.hash = N_count + 8000; reb_add(r, pt); add_beta = rebx_add_param(&r->particles[N_count], "beta", REBX_TYPE_DOUBLE); *add_beta = 0.01; } r->simulationarchive_interval = 6.32e6; char sim_name[1000]; filename[strlen(filename) - 4] = 0; sprintf(sim_name, "%s_months.bin", filename); r->simulationarchive_filename = sim_name; for (int i=0; i < r->N; i=i+1){ fprintf(fp2, "%u, %f, %f\n", r->particles[i].hash, r->particles[i].m, r->particles[i].r); } fclose(fp2); reb_integrate(r, 1.6e8); // ~5 years rebx_free(rebx); }