#include #include #include "black_holes.h" /* BEGIN legacy inclusion */ // I'm not going to touch this C file #define SQR(x) ((x)*(x)) double L[3]; // needed in pn_bh_spin.c #include "pn_bh_spin.c" #undef SQR /* END legacy inclusion */ void two_body_gravity(const Particle_ref& j, const Particle_ref& i, const double eps, double& pot, double3& acc, double3& jrk) { double3 dx = i.x - j.x; double3 dv = i.v - j.v; double r2 = dx.norm2() + eps*eps; double r = sqrt(r2); double r3 = r2*r; double r4 = r2*r2; double RP = 3*(dx*dv)/r; pot = -j.m/r; acc = -j.m*dx/r3; jrk = -j.m*(dv/r3 - RP*dx/r4); } void Black_hole_physics::adjust_softening(const std::vector& particles) { if (eps_new < 0) return; double pot_old, pot_new; double3 acc_old, acc_new, jrk_old, jrk_new; for (int j = 0; j < particles.size(); j++) { for (int i = 0; i < particles.size(); i++) { if (i == j) continue; two_body_gravity(particles[j], particles[i], eps_old, pot_old, acc_old, jrk_old); two_body_gravity(particles[j], particles[i], eps_new, pot_new, acc_new, jrk_new); particles[i].pot += pot_new - pot_old; particles[i].acc += acc_new - acc_old; particles[i].jrk += jrk_new - jrk_old; } } } #if 0 void Black_hole_physics::adjust_post_newtonian( const double dt_bh, // pn_usage should be const double3& acc1, double3& acc2, double3& jrk1, double3& jrk2) { // calculate and "plus" the new BH <-> BH : PN1, PN2, PN2.5, PN3, PN3.5 : acc, jerk // TODO maybe have the PN terms as local variables here? int tmp; tmp = calc_force_pn_BH(masses[0], x1, v1, bbh_grav.spin1, masses[1], x2, v2, bbh_grav.spin2, c, dt_bh, pn_usage, (double(*)[3])bbh_grav.a_pn1, (double(*)[3])bbh_grav.adot_pn1, (double(*)[3])bbh_grav.a_pn2, (double(*)[3])bbh_grav.adot_pn2, myRank, rootRank); if (tmp == 505) exit(-1); // Very ugly way to terminate // NOTE we have these _corr variables accumulating the corrections before // applying it. It's almost the same but different from applying each // correction term in a loop. double3 acc1_corr(0,0,0), acc2_corr(0,0,0), jrk1_corr(0,0,0), jrk2_corr(0,0,0); for (int i=1; i<7; i++) { acc1_corr += bbh_grav.a_pn1[i]; acc2_corr += bbh_grav.a_pn2[i]; jrk1_corr += bbh_grav.adot_pn1[i]; jrk2_corr += bbh_grav.adot_pn2[i]; } acc1 += acc1_corr; acc2 += acc2_corr; jrk1 += jrk1_corr; jrk2 += jrk2_corr; } #endif void Black_hole_physics::write_bh_data(const double time_cur, const int count, const std::vector &m, const std::vector &x, const std::vector &v, const std::vector &pot, const std::vector &a, const std::vector &adot, const std::vector &dt) { auto out = fopen("bh.dat", "a"); for (int i = 0; i < count; i++) { fprintf(out,"%.16E \t %.8E \t % .16E % .16E % .16E \t %.16E \t % .16E % .16E % .16E \t %.16E \t % .8E \t % .8E % .8E % .8E \t %.8E \t % .8E % .8E % .8E \t %.8E \t %.8E \n", time_cur, m[i], x[i][0], x[i][1], x[i][2], x[i].norm(), v[i][0], v[i][1], v[i][2], v[i].norm(), pot[i], a[i][0], a[i][1], a[i][2], a[i].norm(), adot[i][0], adot[i][1], adot[i][2], adot[i].norm(), dt[i]); } fprintf(out, "\n"); fclose(out); } void Write_bh_nb_data::operator()(double time_cur) { for (int i_bh=0; i_bh < smbh_count; i_bh++) { for (int i=0; i& ind_act, int n_act, double timesteps, double time_cur) { double m_bh1 = m[0]; double m_bh2 = m[1]; double3 x_bh1 = x[0]; double3 x_bh2 = x[1]; double3 v_bh1 = v[0]; double3 v_bh2 = v[1]; double3 x_bbhc = (m_bh1*x_bh1 + m_bh2*x_bh2)/(m_bh1 + m_bh2); double3 v_bbhc = (m_bh1*v_bh1 + m_bh2*v_bh2)/(m_bh1 + m_bh2); double DR2 = (x_bh1 - x_bh2).norm2(); double DV2 = (v_bh1 - v_bh2).norm2(); double EB = -(m_bh1 + m_bh2) / sqrt(DR2) + 0.5 * DV2; double SEMI_a = -0.5 * (m_bh1 + m_bh2)/EB; double SEMI_a2 = SEMI_a*SEMI_a; for (int i=0; i