#include #include #include #include "double3.h" struct Particle_ref { Particle_ref(double& m, double3& x, double3& v, double& pot, double3& acc, double3& jrk) : m(m), x(x), v(v), pot(pot), acc(acc), jrk(jrk) {} const double& m; const double3& x; const double3& v; double& pot; double3& acc; double3& jrk; }; struct Bbh_gravity { double pot1, pot2; double3 a1, a2, adot1, adot2, a_pn1[7], a_pn2[7], adot_pn1[7], adot_pn2[7]; double spin1[3], spin2[3]; }; class Black_hole_physics { public: Black_hole_physics() : count(0), c(0) {} Black_hole_physics(const int count, const int myRank, const int rootRank) : count(count), c(0), myRank(myRank), rootRank(rootRank) {} void set_post_newtonian(const double c, const int pn_usage[7]) { this->c = c; std::copy(pn_usage, pn_usage+7, this->pn_usage); } void set_spins(const double spin1[3], const double spin2[3]) { std::copy(spin1, spin1+3, this->bbh_grav.spin1); std::copy(spin2, spin2+3, this->bbh_grav.spin2); } void set_softening(const double eps_old, const double eps_new) { this->eps_old = eps_old; this->eps_new = eps_new; } void adjust_softening(const std::vector& particles); void adjust_post_newtonian( const double dt_bh, // pn_usage should be const double3& acc1, double3& acc2, double3& jrk1, double3& jrk2); void 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); public: //TODO make private /////////////std::vector masses; int count; int myRank, rootRank; double eps_old, eps_new; double c; int pn_usage[7]; Bbh_gravity bbh_grav; }; class Write_bh_nb_data { public: Write_bh_nb_data(int nb, int smbh_count, int N, const std::vector &m, const std::vector &x, const std::vector &v) : nb(nb), smbh_count(smbh_count), N(N), m(m), x(x), v(v) { ind_sort.resize(N); var_sort.resize(N); out = fopen("bh_neighbors.dat", "w"); } ~Write_bh_nb_data() { fclose(out); } void operator()(double time_cur); private: int nb, smbh_count, N; const std::vector &m; const std::vector &x, &v; std::vector ind_sort; std::vector var_sort; FILE *out; }; class Binary_smbh_influence_sphere_output { public: Binary_smbh_influence_sphere_output(double factor, int N, const std::vector &m, const std::vector &x, const std::vector &v, const std::vector &pot, const std::vector &dt) : factor(factor), m(m), x(x), v(v), pot(pot), dt(dt) { inf_event.assign(N, 0); out = fopen("bbh_inf.dat", "w"); } ~Binary_smbh_influence_sphere_output() { fclose(out); } void operator()(const std::vector& ind_act, int n_act, double timesteps, double time_cur); private: double factor; const std::vector &pot, &m, &dt; const std::vector &x, &v; std::vector inf_event; FILE *out; };