phigrape/n_bh.c

74 lines
1.6 KiB
C

/***************************************************************************/
/*
Coded by : Peter Berczik
Version number : 1.0
Last redaction : 2011.II.20. 13:00
*/
void calc_force_n_BH(double m1, double xx1[], double vv1[],
double m2, double xx2[], double vv2[],
double eps_BH,
double *pot_n1, double a_n1[], double adot_n1[],
double *pot_n2, double a_n2[], double adot_n2[])
{
/*
INPUT
m1 - mass of the 1 BH
xx1[0,1,2] - coordinate of the 1 BH
vv1[0,1,2] - velocity of the 1 BH
m2 - mass of the 2 BH
xx2[0,1,2] - coordinate of the 2 BH
vv2[0,1,2] - velocity of the 2 BH
eps_BH - force softening, can be even exactly 0.0 !
OUTPUT
pot_n1 for the 1 BH
a_n1 [0,1,2] for the 1 BH
adot_n1 [0,1,2] for the 1 BH
pot_n2 for the 2 BH
a_n2 [0,1,2] for the 2 BH
adot_n2 [0,1,2] for the 2 BH
*/
int k;
double r, r2, r3, r4, RP, x[3], v[3];
for(k=0;k<3;k++)
{
x[k] = xx1[k] - xx2[k];
v[k] = vv1[k] - vv2[k];
}
r2 = SQR(x[0]) + SQR(x[1]) + SQR(x[2]) + SQR(eps_BH);
r = sqrt(r2);
r3 = r2*r;
r4 = r2*r2;
RP = 3.0*(x[0]*v[0]+x[1]*v[1]+x[2]*v[2])/r;
// Newton pot + acc & jerks
*pot_n1 = -m2/r;
*pot_n2 = -m1/r;
for(k=0;k<3;k++)
{
a_n1[k] = -m2*x[k]/r3;
a_n2[k] = m1*x[k]/r3;
adot_n1[k] = -m2*(v[k]/r3 - RP*x[k]/r4);
adot_n2[k] = m1*(v[k]/r3 - RP*x[k]/r4);
}
}
/***************************************************************************/