40 const int ExpansionOrder
43 memset(system, 0,
sizeof(
sysq));
47 const double domegadt_csts_nonspin[17] = {96./5.,-1486./35.,-264./5.,384.*
LAL_PI/5.,34103./945.,13661./105.,944./15.,
LAL_PI*(-4159./35.),
LAL_PI*(-2268./5.),(16447322263./7276500. +
LAL_PI*
LAL_PI*512./5. -
LAL_LN2*109568./175. -
LAL_GAMMA*54784./175.),(-56198689./11340. +
LAL_PI*
LAL_PI*902./5.),1623./140.,-1121./27.,-54784./525.,-
LAL_PI*883./42.,
LAL_PI*71735./63.,
LAL_PI*73196./63.};
48 const double domegadt_csts_spinorbit[18] = {-904./5.,-120.,-62638./105.,4636./5.,-6472./35.,3372./5.,-
LAL_PI*720.,-
LAL_PI*2416./5.,-208520./63.,796069./105.,-100019./45.,-1195759./945.,514046./105.,-8709./5.,-
LAL_PI*307708./105.,
LAL_PI*44011./7.,-
LAL_PI*7992./7.,
LAL_PI*151449./35.};
49 const double domegadt_csts_spinspin[4] = {-494./5.,-1442./5.,-233./5.,-719./5.};
50 const double L_csts_nonspin[9] = {3./2.,1./6.,27./8.,-19./8.,1./24.,135./16.,-6889/144.+ 41./24.*
LAL_PI*
LAL_PI,31./24.,7./1296.};
51 const double L_csts_spinorbit[6] = {-14./6.,-3./2.,-11./2.,133./72.,-33./8.,7./4.};
54 const double M = m1 + m2;
56 const double q = system->
q;
57 system->
nu =
q/(1+
q)/(1+
q);
58 const double nu = system->
nu;
60 const double nu_2 = system->
nu_2;
65 const double S1_norm = fabs(ch1)*nu/
q;
66 const double S2_norm = fabs(ch2)*nu*
q;
68 const double xi_0 = pow(piGM_over_cthree*f_0, system->
onethird);
69 const double xi0_2 = xi_0*xi_0;
87 const double S_0_norm =
Norm(S_0);
88 const double J_0_norm =
Norm(J_0);
89 const double L_0_norm =
Norm(L_0);
94 const vector roots =
Roots(L_0_norm,J_0_norm,system);
96 const double q_2 =
q*
q;
97 const double one_m_q_sq = (1.-
q)*(1.-
q);
98 const double one_m_q_4 = one_m_q_sq*one_m_q_sq;
99 const double one_p_q_sq = (1.+
q)*(1.+
q);
101 const double Save_square = 0.5*(roots.
z+roots.
y);
102 const double S1_norm_2 = system->
S1_norm_2;
103 const double S2_norm_2 = system->
S2_norm_2;
104 const double Seff = system->
Seff;
105 const double Seff_2 = Seff*Seff;
109 const double a0 = nu*domegadt_csts_nonspin[0];
110 const double a2 = nu*(domegadt_csts_nonspin[1] + nu*(domegadt_csts_nonspin[2]));
111 const double a3 = nu*(domegadt_csts_nonspin[3] +
beta(domegadt_csts_spinorbit[0], domegadt_csts_spinorbit[1], system));
112 const double a4 = nu*(domegadt_csts_nonspin[4] + nu*(domegadt_csts_nonspin[5] + nu*(domegadt_csts_nonspin[6])) +
sigma(domegadt_csts_spinspin[0], domegadt_csts_spinspin[1], system) +
tau(domegadt_csts_spinspin[2], domegadt_csts_spinspin[3], system));
113 const double a5 = nu*(domegadt_csts_nonspin[7] + nu*(domegadt_csts_nonspin[8]) +
beta((domegadt_csts_spinorbit[2] + nu*(domegadt_csts_spinorbit[3])), (domegadt_csts_spinorbit[4] + nu*(domegadt_csts_spinorbit[5])), system));
115 const double a0_2 = a0*a0;
116 const double a0_3 = a0_2*a0;
117 const double a2_2 =
a2*
a2;
121 const double c0 = 1./a0;
123 const double c2 = -
a2/a0_2;
125 const double c3 = -a3/a0_2;
127 const double c4 = (a2_2 - a0*
a4)/a0_3;
129 const double c5 = (2.*
a2*a3 - a0*a5)/a0_3;
131 system->
nu_4 = nu_2*nu_2;
132 const double nu_4 = system->
nu_4;
135 system->
c_1 =0.5*(J_0_norm*J_0_norm - L_0_norm*L_0_norm - Save_square)/L_0_norm*nu;
136 double c_1 = system->
c_1;
139 system->
c1_2 = c_1*c_1;
140 double c1_2 = system->
c1_2;
141 double c1_over_nu_2 = c_1_over_nu*c_1_over_nu;
143 const double one_m_q2_2 = (1. - q_2) * (1. - q_2);
146 const double Del1 = 4. * c1_over_nu_2 * one_p_q_sq;
147 const double Del2 = 8. * c_1_over_nu *
q * (1. +
q) * Seff;
148 const double Del3 = 4. * (one_m_q2_2 * S1_norm_2 - q_2 * Seff_2);
149 const double Del4 = 4. * c1_over_nu_2 * q_2 * one_p_q_sq;
150 const double Del5 = 8. * c_1_over_nu * q_2 * (1. +
q) * Seff;
151 const double Del6 = 4. * (one_m_q2_2 * S2_norm_2 - q_2 * Seff_2);
152 const double Delta = sqrt((Del1 - Del2 - Del3) * (Del4 - Del5 - Del6));
157 system->
constants_u[1] = (6.*Seff*nu - 3.*c_1_over_nu)/deltam_over_M/deltam_over_M;
160 const double u1 = 3. *
c2 /
c0;
161 const double u2 = 0.75 * one_p_q_sq / one_m_q_4;
162 const double u3 = -20. * c1_over_nu_2 * q_2 * one_p_q_sq;
163 const double u4 = 2. * one_m_q2_2 * (
q * (2. +
q) * S1_norm_2 + (1. + 2. *
q) * S2_norm_2 - 2. *
q * Save_square);
164 const double u5 = 2. * q_2 * (7. + 6. *
q + 7. * q_2) * 2. * c_1_over_nu * Seff;
165 const double u6 = 2. * q_2 * (3. + 4. *
q + 3. * q_2) * Seff_2;
166 const double u7 =
q * Delta;
171 system->
Ssqave = 0.5*(roots.
z+roots.
y);
175 const double Rm = roots.
z - roots.
y;
176 const double Rm_2 = Rm*Rm;
178 const double cp = roots.
z*nu_2 - c1_2;
180 const double cm = cp-Rm*nu_2;
182 const double S0m = S1_norm_2 - S2_norm_2;
183 const double cpcm = fabs(cp*cm);
184 const double sqrt_cpcm = sqrt(cpcm);
187 const double A1t = 0.5+0.75/nu;
189 const double A2t = -0.75*Seff/nu;
191 const double A1ave = (cp-sqrt_cpcm)/nu_2 ;
193 const double Bave = -0.5*Rm*sqrt_cpcm/nu_2 - cp/nu_4*(sqrt_cpcm-cp);
195 const double aw = (-3.*(1. +
q)/
q*(2.*(1. +
q)*nu_2*Seff*c_1 - (1. +
q)*c1_2 + (1. -
q)*nu_2*S0m));
196 const double cw = 3./32./nu*Rm_2;
197 const double dw = 4.*cp - 4.*A1ave*nu_2;
198 const double hw = -2*(2*A1ave - Rm)*c_1;
199 const double fw = Rm*A1ave-Bave-0.25*Rm_2;
202 const double ad = aw/dw;
204 const double hd = hw/dw;
206 const double cd = cw/dw;
208 const double fd = fw/dw;
210 const double hd_2 = hd*hd;
211 const double hd_4 = hd_2*hd_2;
212 const double adfd = ad*fd;
213 const double adfdhd = adfd*hd;
214 const double adfdhd_2 = adfd*hd_2;
215 const double adhd = ad*hd;
216 const double adhd_2 = ad*hd_2;
217 const double adhd_3 = ad*hd_2*hd;
218 const double adhd_4 = ad*hd_4;
219 const double cdfd = cd*fd;
220 const double cdhd = cd*hd;
221 const double cdhd_2 = cd*hd_2;
224 double Omegaz0 = A1t + ad;
226 double Omegaz1 = A2t - ad*Seff - adhd;
228 double Omegaz2 = cd - adfd + adhd_2 + adhd*Seff;
230 double Omegaz3 = (adfd - cd - adhd_2)*Seff + 2*adfdhd - adhd_3 - cdhd;
232 double Omegaz4 = -(2*adfdhd - adhd_3 - cdhd)*Seff + adfd*fd - cdfd + cdhd_2 - 3*adfdhd_2 + adhd_4;
234 double Omegaz5 = -(adfd*fd - cdfd + cdhd_2 - 3*adfdhd_2 + adhd_4)*Seff + hd*(2*cdfd - 3*adfd*fd - cdhd_2 + 4*adfdhd_2 - adhd_4);
241 "Omegaz5 = %.16f which is larger than expected. Not generating a waveform here.\n",
255 system->
constants_phiz[5] = 3.*(c5*Omegaz0 + c4*Omegaz1 + c3*Omegaz2 +
c2*Omegaz3 +
c0*Omegaz5);
257 const double gw = 3./16./nu_2/nu*Rm_2*(c_1 - nu_2*Seff);
259 const double gd = gw/dw;
262 Omegaz5 += Omegaz4*c_1/nu_2 - fd*gd + gd*hd_2 + gd*hd*Seff;
264 Omegaz4 += Omegaz3*c_1/nu_2 - gd*hd - gd*Seff;
266 Omegaz3 += Omegaz2*c_1/nu_2 + gd;
268 Omegaz2 += Omegaz1*c_1/nu_2;
270 Omegaz1 += Omegaz0*c_1/nu_2;
283 system->
constants_zeta[5] = 3.*(Omegaz0*c5 + Omegaz1*c4 + Omegaz2*c3 + Omegaz3*
c2 + Omegaz5*
c0);
285 switch (ExpansionOrder)
294 #if __GNUC__ >= 7 && !defined __INTEL_COMPILER
300 #if __GNUC__ >= 7 && !defined __INTEL_COMPILER
306 #if __GNUC__ >= 7 && !defined __INTEL_COMPILER
312 #if __GNUC__ >= 7 && !defined __INTEL_COMPILER
321 Defaulting to keeping all orders in expansion. \
322 In future please choose from [1,2,3,4,5,-1]. \n", ExpansionOrder);
325 double m,
B, volumeellement;
331 m = sqrt((roots.
y - roots.
z)/(roots.
x - roots.
z));
332 B = (S_0_norm*S_0_norm-roots.
z)/(roots.
y-roots.
z);
334 sign_num = (volumeellement > 0) - (volumeellement < 0);
336 if(B < 0. || B > 1.) {
337 if(
B > 1 &&
B-1. < 0.00001) system->
constant_of_S = gsl_sf_ellint_F(asin(sign_num*sqrt(1.)),
m, GSL_PREC_DOUBLE) -
u_of_xi(xi_0,xi0_2,system);
338 if(B < 0 && B > -0.00001) system->
constant_of_S = gsl_sf_ellint_F(asin(sign_num*sqrt(0.)),
m, GSL_PREC_DOUBLE) -
u_of_xi(xi_0,xi0_2,system);
340 else system->
constant_of_S = gsl_sf_ellint_F(asin(sign_num*sqrt(
B)),
m, GSL_PREC_DOUBLE) -
u_of_xi(xi_0,xi0_2,system);
343 system->
constants_L[0] = (L_csts_nonspin[0] + nu*L_csts_nonspin[1]);
344 system->
constants_L[1] =
beta(L_csts_spinorbit[0], L_csts_spinorbit[1], system);
345 system->
constants_L[2] = (L_csts_nonspin[2] + nu*L_csts_nonspin[3] + nu*nu*L_csts_nonspin[4]);
346 system->
constants_L[3] =
beta((L_csts_spinorbit[2]+L_csts_spinorbit[3]*nu), (L_csts_spinorbit[4]+L_csts_spinorbit[5]*nu), system);
347 system->
constants_L[4] = (L_csts_nonspin[5]+L_csts_nonspin[6]*nu +L_csts_nonspin[7]*nu*nu+L_csts_nonspin[8]*nu*nu*nu);
349 vector MScorrections = {0.,0.,0.};
350 if(fabs(roots.
y-roots.
z)>1.e-5){
368 const double xi_2 = xi*xi;
369 const double L_norm = ((*system).nu)/xi;
371 const double J_norm3PN =
J_norm_of_xi(L_norm3PN,system);
374 const double S_norm =
S_norm_of_xi(xi,xi_2,roots,system);
376 vector MScorrections = {0.,0.,0.};
377 if(fabs(roots.
y-roots.
z)>1.e-5){
381 angles.
x =
phiz_of_xi(xi,xi_2,J_norm,system) + MScorrections.
x;
382 angles.
y =
zeta_of_xi(xi,xi_2,system) + MScorrections.
y;
383 angles.
z =
costhetaL(J_norm3PN,L_norm3PN,S_norm);
394 const double xi_2 = xi * xi;
395 const double L_norm = ((*system).nu) / xi;
397 const double J_norm2PN =
J_norm_of_xi(L_norm2PN, system);
399 const vector roots =
Roots(L_norm, J_norm, system);
400 const double S_norm =
S_norm_of_xi(xi, xi_2, roots, system);
402 vector MScorrections = {0., 0., 0.};
403 if (fabs(roots.
y - roots.
z) > 1.e-5)
408 angles.
x =
phiz_of_xi(xi, xi_2, J_norm, system) + MScorrections.
x;
409 angles.
y =
zeta_of_xi(xi, xi_2, system) + MScorrections.
y;
410 angles.
z =
costhetaL(J_norm2PN, L_norm2PN, S_norm);
421 const double xi_2 = xi*xi;
422 const double L_norm = ((*system).nu)/xi;
425 const double S_norm =
S_norm_of_xi(xi,xi_2,roots,system);
427 vector MScorrections = {0.,0.,0.};
428 if(fabs(roots.
y-roots.
z)>1.e-5){
432 angles.
x =
phiz_of_xi(xi,xi_2,J_norm,system) + MScorrections.
x;
433 angles.
y =
zeta_of_xi(xi,xi_2,system) + MScorrections.
y;
450 const double B_2 = coeffs.
x*coeffs.
x;
451 const double B_3 = B_2*coeffs.
x;
452 const double B_C = coeffs.
x*coeffs.
y;
454 const double p = coeffs.
y - ((*system).onethird)*B_2;
455 const double qc = 2./27.*B_3 - ((*system).onethird)*B_C + coeffs.
z;
456 const double sqrtarg = sqrt(-
p/3.);
457 double acosarg = 1.5*qc/
p/sqrtarg;
458 if(acosarg < -1) acosarg = -1;
459 if(acosarg > 1) acosarg = 1;
460 const double theta = ((*system).onethird)*acos(acosarg);
465 if(
theta!=
theta || sqrtarg!=sqrtarg || (*system).dot1n == 1 || (*system).dot2n == 1 || (*system).dot1n == -1 || (*system).dot2n == -1|| (*system).S1_norm_2 == 0 || (*system).S2_norm_2 == 0) {
467 out.
y = ((*system).S0_norm)*((*system).S0_norm);
468 out.
z = out.
y + 1
e-9;
474 out.
z = 2.*sqrtarg*cos(
theta) - ((*system).onethird)*coeffs.
x;
475 out.
y = 2.*sqrtarg*cos(
theta -
LAL_TWOPI*((*system).onethird)) - ((*system).onethird)*coeffs.
x;
476 out.
x = 2.*sqrtarg*cos(
theta - 2.*
LAL_TWOPI*((*system).onethird)) - ((*system).onethird)*coeffs.
x;
478 A3 = fmax(fmax(out.
x,out.
y),out.
z);
479 A1 = fmin(fmin(out.
x,out.
y),out.
z);
481 if ((A3 - out.
z) > 0 && (A1 - out.
z) < 0)
483 else if ((A3 - out.
x) > 0 && (A1 - out.
x) < 0)
506 const double J_norm_2 = J_norm*J_norm;
507 const double L_norm_2 = L_norm*L_norm;
509 out.
x = (L_norm_2+((*system).S1_norm_2))*((*system).q) + (L_norm_2+((*system).S2_norm_2))/((*system).q) + 2.*L_norm*((*system).Seff) - 2.*J_norm_2 - ((*system).S1_norm_2) - ((*system).S2_norm_2);
511 out.
y = (L_norm_2 - J_norm_2)*(L_norm_2 - J_norm_2) + 2.*((*system).Seff)*L_norm*(L_norm_2 - J_norm_2) - 2.*L_norm_2*(((*system).S1_norm_2) - ((*system).S2_norm_2)*((*system).q))*(1./((*system).q)-1) + 4.*((*system).nu)*((*system).Seff)*((*system).Seff)*L_norm_2 - 2.*((*system).Seff)*L_norm*(((*system).S1_norm_2)-((*system).S2_norm_2))*((*system).deltam_over_M) + 2.*J_norm_2*(((*system).S1_norm_2)*((*system).q) - ((*system).S2_norm_2))*(1./((*system).q)-1);
513 out.
z = -(L_norm_2 - J_norm_2)*(L_norm_2 - J_norm_2)*(((*system).S1_norm_2)*((*system).q) - ((*system).S2_norm_2))*(1./((*system).q)-1) - 2.*((*system).Seff)*((*system).deltam_over_M)*(((*system).S1_norm_2) - ((*system).S2_norm_2))*L_norm*(L_norm_2 - J_norm_2) + (((*system).S1_norm_2) - ((*system).S2_norm_2))*(((*system).S1_norm_2) - ((*system).S2_norm_2))*L_norm_2*((*system).deltam_over_M)*((*system).deltam_over_M)/((*system).nu);
524 return sqrt(L_norm*L_norm + 2.*L_norm*((*system).c_1_over_nu) + (*system).Ssqave);
533 double sn, cn, dn,
m,
u;
535 if(fabs(roots.
y-roots.
z)<1.e-5)
sn = 0.;
537 m = (roots.
y - roots.
z)/(roots.
x - roots.
z);
538 u =
u_of_xi(xi,xi_2,system)+(*system).constant_of_S;
539 gsl_sf_elljac_e(
u,
m, &
sn, &cn, &dn);
541 const double S_norm_square_bar = roots.
z + (roots.
y - roots.
z)*
sn*
sn;
542 return sqrt(S_norm_square_bar);
554 ((*system).constants_L[0] \
555 + xi_2 * ((*system).constants_L[2])) \
566 return L_norm*(1. + xi_2*((*system).constants_L[0] + xi*(*system).constants_L[1] + xi_2*((*system).constants_L[2] + xi*(*system).constants_L[3] + xi_2*((*system).constants_L[4]))));
578 static vector c(
const double xi,
const double xi_2,
const double J_norm,
const vector roots,
const sysq *system)
580 const double xi_3 = xi_2*xi;
581 const double xi_4 = xi_3*xi;
582 const double xi_6 = xi_3*xi_3;
584 const double J_norm_2 = J_norm*J_norm;
588 out.
x = -0.75*((J_norm_2-roots.
z)*(J_norm_2-roots.
z)*xi_4/((*system).nu) - 4.*((*system).nu)*((*system).Seff)*(J_norm_2-roots.
z)*xi_3-2.*(J_norm_2-roots.
z+2*(((*system).S1_norm_2)-((*system).S2_norm_2))*((*system).deltam_over_M))*((*system).nu)*xi_2+(4.*((*system).Seff)*xi+1)*((*system).nu)*((*system).nu_2))*J_norm*xi_2*(((*system).Seff)*xi-1.);
589 out.
y = 1.5*(roots.
y-roots.
z)*J_norm*((J_norm_2-roots.
z)/((*system).nu)*xi_2-2.*((*system).nu)*((*system).Seff)*xi-((*system).nu))*(((*system).Seff)*xi-1.)*xi_4;
590 out.
z = -0.75*J_norm*(((*system).Seff)*xi-1.)*(roots.
z-roots.
y)*(roots.
z-roots.
y)*xi_6/((*system).nu);
604 static vector d(
const double L_norm,
const double J_norm,
const vector roots)
608 out.
x = -((L_norm+J_norm)*(L_norm+J_norm)-roots.
z)*((L_norm-J_norm)*(L_norm-J_norm)-roots.
z);
609 out.
y = 2.*(roots.
y-roots.
z)*(J_norm*J_norm+L_norm*L_norm-roots.
z);
610 out.
z = -(roots.
z-roots.
y)*(roots.
z-roots.
y);
619 static double costhetaL(
const double J_norm,
const double L_norm,
const double S_norm)
621 double out = 0.5*(J_norm*J_norm + L_norm*L_norm - S_norm*S_norm)/L_norm/J_norm;
624 if (out<-1) out = -1;
633 static double u_of_xi(
const double xi,
const double xi_2,
const sysq *system)
646 return 0.75*((*system).deltam_over_M)*(*system).constants_u[0]/xi_2/xi*(1. + xi*((*system).constants_u[1] + xi*((*system).constants_u[2])));
653 static double psidot(
const double xi,
const double xi_2,
const vector roots,
const sysq *system)
655 const double xi_3 = xi_2*xi;
656 const double xi_6 = xi_3*xi_3;
672 return -0.75/sqrt((*system).nu)*(1.-(*system).Seff*xi)*xi_6*sqrt(roots.
z-roots.
x);
679 static double phiz_of_xi(
const double xi,
const double xi_2,
const double J_norm,
const sysq *system)
681 const double inside_log1 = ((*system).c_1) + J_norm*((*system).nu)+((*system).nu_2)/xi;
683 const double log1 = log(fabs(inside_log1));
684 const double inside_log2 = ((*system).c_1) + J_norm*((*system).sqrtSsqave)*xi + ((*system).Ssqave)*xi;
686 const double log2 = log(fabs(inside_log2));
689 const double phiz0 = J_norm*(0.5*((*system).c1_2)/((*system).nu_4) - 0.5*((*system).onethird)*((*system).c_1)/xi/((*system).nu_2) - ((*system).onethird)*((*system).Ssqave)/((*system).nu_2) - ((*system).onethird)/xi_2) - 0.5*((*system).c_1)*(((*system).c1_2)/((*system).nu_4) - ((*system).Ssqave)/((*system).nu_2))/((*system).nu)*log1;
691 const double phiz1 = -J_norm*0.5*(((*system).c_1)/((*system).nu_2) + 1./xi) + 0.5*(((*system).c1_2)/((*system).nu_2) - ((*system).Ssqave))/((*system).nu)*log1 ;
693 const double phiz2 = -J_norm + ((*system).sqrtSsqave)*log2 - ((*system).c_1)/((*system).nu)*log1;
695 const double phiz3 = J_norm*xi -((*system).nu)*log1 + ((*system).c_1)/((*system).sqrtSsqave)*log2;
697 const double phiz4 = J_norm*0.5*xi*(((*system).c_1)/((*system).Ssqave) + xi) - 0.5*(((*system).c1_2)/((*system).Ssqave) - ((*system).nu_2))/((*system).sqrtSsqave)*log2;
699 const double phiz5 = J_norm*xi*(-0.5*((*system).c1_2)/((*system).Ssqave)/((*system).Ssqave) + 0.5*((*system).onethird)*((*system).c_1)*xi/((*system).Ssqave) + ((*system).onethird)*(xi_2 + ((*system).nu_2)/((*system).Ssqave))) + 0.5*((*system).c_1)*(((*system).c1_2)/((*system).Ssqave) - ((*system).nu_2))/((*system).Ssqave)/((*system).sqrtSsqave)*log2;
702 double phizout = phiz0*(*system).constants_phiz[0] + phiz1*(*system).constants_phiz[1] + phiz2*(*system).constants_phiz[2] + phiz3*(*system).constants_phiz[3] + phiz4*(*system).constants_phiz[4] + phiz5*(*system).constants_phiz[5] + (*system).phiz_0;
703 if (phizout!=phizout) phizout = 0;
714 const double logxi = log(xi);
715 const double xi_3 = xi_2*xi;
718 double zetaout = ((*system).nu)*(-(*system).onethird*(*system).constants_zeta[0]/xi_3 - 0.5*(*system).constants_zeta[1]/xi_2 - (*system).constants_zeta[2]/xi + (*system).constants_zeta[3]*logxi + (*system).constants_zeta[4]*xi + 0.5*(*system).constants_zeta[5]*xi_2) + (*system).zeta_0;
719 if (zetaout!=zetaout) zetaout = 0;
731 const vector c_return =
c(xi,xi_2,J_norm,roots,system);
732 const vector d_return =
d(L_norm,J_norm,roots);
733 const double c0 = c_return.
x;
734 const double c2 = c_return.
y;
735 const double c4 = c_return.
z;
736 const double d0 = d_return.
x;
737 const double d2 = d_return.
y;
738 const double d4 = d_return.
z;
741 const double sqt = sqrt(fabs(d2 * d2 - 4. * d0 * d4));
744 const double Aa = 0.5*(J_norm/L_norm + L_norm/J_norm - roots.
z/J_norm/L_norm);
746 const double Bb = 0.5*(roots.
z - roots.
y)/L_norm/J_norm;
748 const double twod0_d2 = 2*d0+d2;
749 const double twod0d4 = 2*d0*d4;
750 const double d2_twod4 = d2+2.*d4;
751 const double d2_d4 =d2+d4;
752 const double d0_d2_d4 = d0+d2+d4;
755 const double n3 = (2.*d0_d2_d4/(twod0_d2+sqt));
757 const double n4 = ((twod0_d2+sqt)/(2.*d0));
758 const double sqtn3 = sqrt(fabs(n3));
759 const double sqtn4 = sqrt(fabs(n4));
760 const double den = 2.*d0*d0_d2_d4*sqt;
762 const double u =
u_of_xi(xi,xi_2,system)+(*system).constant_of_S;
763 const double tanu = tan(
u);
764 const double atanu = atan(tan(
u));
765 const double psdot =
psidot(xi,xi_2,roots,system);
772 L3 = fabs((c4 * d0 * (twod0_d2 + sqt) -
c2 * d0 * (d2_twod4 - sqt) -
c0 * (twod0d4 - d2_d4 * (d2 - sqt))) / (den)) * (sqtn3 / (n3 - 1.) * (atanu - atan(sqtn3 * tanu))) / psdot;
779 L4 = fabs((-c4 * d0 * (twod0_d2 - sqt) +
c2 * d0 * (d2_twod4 + sqt) -
c0 * (-twod0d4 + d2_d4 * (d2 + sqt)))) / (den) * (sqtn4 / (n4 - 1.) * (atanu - atan(sqtn4 * tanu))) / psdot;
783 if (out.
x != out.
x) out.
x=0;
786 out.
y = Aa*out.
x + 2.*Bb*d0*(L3/(sqt-d2)-L4/(sqt+d2));
787 if (out.
y != out.
y) out.
y=0;
798 static double beta(
const double a,
const double b,
const sysq *system)
800 return ((((*system).dot1)*(
a + b*((*system).q))) + (((*system).dot2)*(
a + b/((*system).q))));
806 static double sigma(
const double a,
const double b,
const sysq *system)
808 return (
a*((*system).dot12) - b*((*system).dot1)*((*system).dot2))/((*system).nu);
814 static double tau(
const double a,
const double b,
const sysq *system)
816 return (((*system).q)*((*system).S1_norm_2*
a - b*((*system).dot1)*((*system).dot1)) + ((*system).S2_norm_2*
a - b*((*system).dot2)*((*system).dot2))/((*system).q))/((*system).nu);
824 return vec1.
x*vec2.
x + vec1.
y*vec2.
y + vec1.
z*vec2.
z;
833 return sqrt(vec.
x*vec.
x + vec.
y*vec.
y + vec.
z*vec.
z);
843 const double fact =
r*sin(th);
844 out.
x = fact*cos(ph);
845 out.
y = fact*sin(ph);
870 out.
x = vec1.
x+vec2.
x;
871 out.
y = vec1.
y+vec2.
y;
872 out.
z = vec1.
z+vec2.
z;
883 out.
x = vec1.
y*vec2.
z-vec1.
z*vec2.
y;
884 out.
y = vec1.
z*vec2.
x-vec1.
x*vec2.
z;
885 out.
z = vec1.
x*vec2.
y-vec1.
y*vec2.
x;
static vector CreateSphere(const double r, const double th, const double ph)
Internal function that calculates a vector fro its spherical components.
static vector Sum(vector vec1, vector vec2)
Internal function that returns the sum of two vectors.
static UNUSED vector compute_phiz_zeta_costhetaL(const double xi, const sysq *system)
Internal function that computes phiz, zeta, and costhetaL at Newtonian order.
static double psidot(const double xi, const double xi_2, const vector roots, const sysq *system)
Internal function that returns the derivative of the phase of the magnitude of S given by equation 24...
static vector CrossProd(vector vec1, vector vec2)
Internal function that returns the cross product of two vectors.
static double L_norm_3PN_of_xi(const double xi, const double xi_2, const double L_norm, const sysq *system)
Internal function that returns the magnitude of L divided by GMsquare_over_c to 3PN order from 060514...
static double J_norm_of_xi(const double L_norm, const sysq *system)
Internal function that returns the magnitude of J to Newtonian order Equation 41 (1703....
static UNUSED int InitializeSystem(sysq *system, const double m1, const double m2, const double mul, const double phl, const double mu1, const double ph1, const double ch1, const double mu2, const double ph2, const double ch2, const double f_0, const int ExpansionOrder)
InitializeSystem computes all the prefactors needed to generate precession angles from Chatziioannou ...
static double S_norm_of_xi(const double xi, const double xi_2, const vector roots, const sysq *system)
Internal function that returns the magnitude of S divided by GMsquare_over_c Equation 23 (1703....
static double tau(const double a, const double b, const sysq *system)
Internal function that computes the spin-spin couplings.
static double sigma(const double a, const double b, const sysq *system)
Internal function that computes the spin-spin couplings.
static vector d(const double L_norm, const double J_norm, const vector roots)
Internal function that returns the coefficients "d_0", "d_2" and "d_4" from 1703.03967 corresponding ...
static vector ScalarProd(double c, vector vec)
Internal function that returns the scalar product of a vector with a scalar.
static double u_of_xi(const double xi, const double xi_2, const sysq *system)
Internal function that returns the phase of the magnitude of S given by equation 51 in arxiv:1703....
static UNUSED vector compute_phiz_zeta_costhetaL2PNNonSpinning(const double xi, const sysq *system)
Internal function that computes phiz, zeta, and costhetaL at 2PN NonSpinning.
static double costhetaL(const double J_norm, const double L_norm, const double S_norm)
Internal function that returns the cosine of the angle between L and J equation 8 1703....
static double L_norm_2PN_NonSpinning_of_xi(const double xi_2, const double L_norm, const sysq *system)
Internal function that returns the magnitude of L divided by GMsquare_over_c to 2PN order,...
static double DotProd(const vector vec1, const vector vec2)
Internal function that returns the dot product of two vectors.
static UNUSED vector compute_phiz_zeta_costhetaL3PN(const double xi, const sysq *system)
Internal function that computes phiz, zeta, and costhetaL at 3PN.
static double beta(const double a, const double b, const sysq *system)
Internal function that computes the spin-orbit couplings.
static double Norm(const vector vec)
Internal function that returns the norm of a vector.
static double zeta_of_xi(const double xi, const double xi_2, const sysq *system)
Internal function that returns zeta eq.
static vector computeMScorrections(const double xi, const double xi_2, const double L_norm, const double J_norm, const vector roots, const sysq *system)
Internal function that computes the MS corrections for phiz and zeta eq.
static vector c(const double xi, const double xi_2, const double J_norm, const vector roots, const sysq *system)
Internal function that returns the coefficients "c_0", "c_2" and "c_4" from 1703.03967 corresponding ...
static double phiz_of_xi(const double xi, const double xi_2, const double J_norm, const sysq *system)
Internal function that returns phiz equation 66 in 1703.03967.
static vector Roots(const double L_norm, const double J_norm, const sysq *system)
Internal function that computes the roots of Eq.
static vector BCDcoeff(const double L_norm, const double J_norm, const sysq *system)
Internal function that computes the B,C,D coefficients of Eq.
#define XLAL_CHECK(assertion,...)