30 #include <gsl/gsl_sf_elljac.h>
31 #include <gsl/gsl_sf_ellint.h>
33 #include <lal/SphericalHarmonics.h>
43 #include <lal/LALAdaptiveRungeKuttaIntegrator.h>
45 #define MIN(a,b) (((a)<(b))?(a):(b))
46 #define MAX(a,b) (((a)>(b))?(a):(b))
53 #ifndef PHENOMXHMDEBUG
88 pPrec->
sqrt2 = 1.4142135623730951;
89 pPrec->
sqrt5 = 2.23606797749978981;
90 pPrec->
sqrt6 = 2.44948974278317788;
91 pPrec->
sqrt7 = 2.64575131106459072;
92 pPrec->
sqrt10 = 3.16227766016838;
93 pPrec->
sqrt14 = 3.74165738677394133;
94 pPrec->
sqrt15 = 3.87298334620741702;
95 pPrec->
sqrt70 = 8.36660026534075563;
96 pPrec->
sqrt30 = 5.477225575051661;
97 pPrec->
sqrt2p5 = 1.58113883008419;
105 REAL8 chi_in_plane = sqrt(chi1x*chi1x+chi1y*chi1y+chi2x*chi2x+chi2y*chi2y);
119 if (ModeArray != NULL)
128 XLAL_CHECK(
flow>0.,
XLAL_EDOM,
"Error in %s: starting frequency for SpinTaylor angles must be positive!",__func__);
129 status=
IMRPhenomX_InspiralAngles_SpinTaylor(pPrec->
PNarrays,chi1x,chi1y,chi1z,chi2x,chi2y,chi2z,
flow,pPrec->
IMRPhenomXPrecVersion,pWF,lalParams);
134 XLAL_PRINT_WARNING(
"Warning: due to a failure in the SpinTaylor routines, the model will default to MSA angles.");
160 if(pflag != 101 && pflag != 102 && pflag != 103 && pflag != 104 && pflag != 220 && pflag != 221 && pflag != 222 && pflag != 223 && pflag != 224 && pflag!=310 && pflag!=311 && pflag!=320 && pflag!=321)
162 XLAL_ERROR(
XLAL_EINVAL,
"Error in IMRPhenomXGetAndSetPrecessionVariables: Invalid precession flag. Allowed versions are 101, 102, 103, 104, 220, 221, 222, 223, 224, 310, 311, 320 or 321.\n");
185 printf(
"Initializing MSA system...\n");
190 XLAL_ERROR(
XLAL_EINVAL,
"Error in IMRPhenomXGetAndSetPrecessionVariables: Invalid expansion order for MSA corrections. Default is 5, allowed values are [-1,0,1,2,3,4,5].\n");
207 XLAL_ERROR(
XLAL_EINVAL,
"Error in IMRPhenomXGetAndSetPrecessionVariables: IMRPhenomXPrecessionVersion not recognized.\n");
220 const REAL8 M = (m1 + m2);
223 const REAL8 m1_2 = m1 * m1;
224 const REAL8 m1_3 = m1 * m1_2;
225 const REAL8 m1_4 = m1 * m1_3;
226 const REAL8 m1_5 = m1 * m1_4;
227 const REAL8 m1_6 = m1 * m1_5;
228 const REAL8 m1_7 = m1 * m1_6;
229 const REAL8 m1_8 = m1 * m1_7;
231 const REAL8 m2_2 = m2 * m2;
241 const REAL8 eta2 = eta*eta;
242 const REAL8 eta3 = eta*eta2;
243 const REAL8 eta4 = eta*eta3;
244 const REAL8 eta5 = eta*eta4;
245 const REAL8 eta6 = eta*eta5;
258 pPrec->
inveta = 1.0 / eta;
270 pPrec->
chi1x = chi1x;
271 pPrec->
chi1y = chi1y;
272 pPrec->
chi1z = chi1z;
273 pPrec->
chi1_norm = sqrt(chi1x*chi1x + chi1y*chi1y + chi1z*chi1z);
275 pPrec->
chi2x = chi2x;
276 pPrec->
chi2y = chi2y;
277 pPrec->
chi2z = chi2z;
278 pPrec->
chi2_norm = sqrt(chi2x*chi2x + chi2y*chi2y + chi2z*chi2z);
287 pPrec->
S1x = chi1x * m1_2;
288 pPrec->
S1y = chi1y * m1_2;
289 pPrec->
S1z = chi1z * m1_2;
292 pPrec->
S2x = chi2x * m2_2;
293 pPrec->
S2y = chi2y * m2_2;
294 pPrec->
S2z = chi2z * m2_2;
301 pPrec->
chi1_perp = sqrt(chi1x*chi1x + chi1y*chi1y);
302 pPrec->
chi2_perp = sqrt(chi2x*chi2x + chi2y*chi2y);
305 pPrec->
S1_perp = (m1_2) * sqrt(chi1x*chi1x + chi1y*chi1y);
306 pPrec->
S2_perp = (m2_2) * sqrt(chi2x*chi2x + chi2y*chi2y);
319 PNRUseTunedAngles = 0;
322 AntisymmetricWaveform = 0;
331 pPrec->
A1 = 2.0 + (3.0 * m2) / (2.0 * m1);
332 pPrec->
A2 = 2.0 + (3.0 * m1) / (2.0 * m2);
338 const REAL8 den = (m2 > m1) ? pPrec->
A2*(m2_2) : pPrec->
A1*(m1_2);
341 const REAL8 chip = num / den;
342 const REAL8 chi1L = chi1z;
343 const REAL8 chi2L = chi2z;
352 pPrec->
SL = chi1L*m1_2 + chi2L*m2_2;
355 pPrec->
Sperp = chip * m1_2;
390 "Error: IMRPhenomX_PNR_GetAndSetCoPrecParams failed \
391 in IMRPhenomXGetAndSetPrecessionVariables.\n");
398 if( pflag == 220 || pflag == 221 || pflag == 222 || pflag == 223 || pflag == 224 )
401 printf(
"Evaluating MSA system.\n");
410 if(pflag == 220 || pflag == 223 || pflag == 224)
412 XLAL_PRINT_WARNING(
"Warning: Initialization of MSA system failed. Defaulting to NNLO angles using 3PN aligned-spin approximation.");
418 XLAL_ERROR(
XLAL_EDOM,
"Error: IMRPhenomX_Initialize_MSA_System failed to initialize. Terminating.\n");
424 printf(
"In IMRPhenomXSetPrecessionVariables... \n\n");
425 printf(
"chi_p : %e\n",pPrec->
chi_p);
427 printf(
"SL : %e\n",pPrec->
SL);
428 printf(
"Sperp : %e\n\n",pPrec->
Sperp);
438 const REAL8 chip2 = chip * chip;
441 const REAL8 chi1L2 = chi1L * chi1L;
442 const REAL8 chi2L2 = chi2L * chi2L;
444 const REAL8 log16 = 2.772588722239781;
461 pPrec->
L2 = ((3.0/2.0) + (eta/6.0));
463 pPrec->
L4 = (81.0 + (-57.0 + eta)*eta)/24.;
483 pPrec->
L2 = 3.0/2. + eta/6.0;
484 pPrec->
L3 = (5*(chi1L*(-2 - 2*
delta + eta) + chi2L*(-2 + 2*
delta + eta)))/6.;
485 pPrec->
L4 = (81 + (-57 + eta)*eta)/24.;
486 pPrec->
L5 = (-7*(chi1L*(72 +
delta*(72 - 31*eta) + eta*(-121 + 2*eta)) + chi2L*(72 + eta*(-121 + 2*eta) +
delta*(-72 + 31*eta))))/144.;
502 pPrec->
L2 = 3.0/2. + eta/6.0;
503 pPrec->
L3 = (-7*(chi1L + chi2L + chi1L*
delta - chi2L*
delta) + 5*(chi1L + chi2L)*eta)/6.;
504 pPrec->
L4 = (81 + (-57 + eta)*eta)/24.;
505 pPrec->
L5 = (-1650*(chi1L + chi2L + chi1L*
delta - chi2L*
delta) + 1336*(chi1L + chi2L)*eta + 511*(chi1L - chi2L)*
delta*eta + 28*(chi1L + chi2L)*eta2)/600.;
519 pPrec->
L2 = 3.0/2. + eta/6.0;
520 pPrec->
L3 = (5*(chi1L*(-2 - 2*
delta + eta) + chi2L*(-2 + 2*
delta + eta)))/6.;
521 pPrec->
L4 = (81 + (-57 + eta)*eta)/24.;
522 pPrec->
L5 = (-7*(chi1L*(72 +
delta*(72 - 31*eta) + eta*(-121 + 2*eta)) + chi2L*(72 + eta*(-121 + 2*eta) +
delta*(-72 + 31*eta))))/144.;
524 pPrec->
L7 = (chi2L*(-324 + eta*(1119 - 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta)))
525 - chi1L*(324 + eta*(-1119 + 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta))))/32.;
526 pPrec->
L8 = 2835/128. - (eta*(-10677852 + 100*eta*(-640863 + eta*(774 + 11*eta))
529 pPrec->
L8L = -(64.0/3.0) * eta;
541 pPrec->
L2 = 3.0/2. + eta/6.0;
542 pPrec->
L3 = (5*(chi1L*(-2 - 2*
delta + eta) + chi2L*(-2 + 2*
delta + eta)))/6.;
543 pPrec->
L4 = (81 + (-57 + eta)*eta)/24.;
544 pPrec->
L5 = (-7*(chi1L*(72 +
delta*(72 - 31*eta) + eta*(-121 + 2*eta)) + chi2L*(72 + eta*(-121 + 2*eta) +
delta*(-72 + 31*eta))))/144.;
546 pPrec->
L7 = (chi2L*(-324 + eta*(1119 - 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta)))
547 - chi1L*(324 + eta*(-1119 + 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta))))/32.;
548 pPrec->
L8 = 2835/128. - (eta*(-10677852 + 100*eta*(-640863 + eta*(774 + 11*eta))
552 pPrec->
L8L = -(64.0/3.0) * eta;
555 pPrec->
L4 += (chi1L2*(1 +
delta - 2*eta) + 4*chi1L*chi2L*eta - chi2L2*(-1 +
delta + 2*eta))/2.;
556 pPrec->
L7 += (3*(chi1L + chi2L)*eta*(chi1L2*(1 +
delta - 2*eta) + 4*chi1L*chi2L*eta - chi2L2*(-1 +
delta + 2*eta)))/4.;
563 XLAL_ERROR(
XLAL_EINVAL,
"Error: IMRPhenomXPrecVersion not recognized. Requires version 101, 102, 103, 104, 220, 221, 222, 223, 224, 310, 311, 320 or 321.\n");
569 pPrec->
LRef =
M *
M *
XLALSimIMRPhenomXLPNAnsatz(pWF->
v_ref, pWF->
eta / pWF->
v_ref, pPrec->
L0, pPrec->
L1, pPrec->
L2, pPrec->
L3, pPrec->
L4, pPrec->
L5, pPrec->
L6, pPrec->
L7, pPrec->
L8, pPrec->
L8L);
578 pPrec->
J0x_Sf = (m1_2)*chi1x + (m2_2)*chi2x;
579 pPrec->
J0y_Sf = (m1_2)*chi1y + (m2_2)*chi2y;
580 pPrec->
J0z_Sf = (m1_2)*chi1z + (m2_2)*chi2z + pPrec->
LRef;
585 if(pPrec->
J0 < 1
e-10)
599 if ( !(convention == 0 || convention == 1 || convention == 5 || convention == 6 || convention == 7))
601 XLAL_ERROR(
XLAL_EINVAL,
"Error: IMRPhenomXPConvention not recognized. Requires version 0, 1, 5, 6 or 7.\n");
605 printf(
"\n*** Convention = %i\n", convention);
612 printf(
"\nAligned spin limit!\n");
703 printf(
"\nAligned-spin case.\n");
730 pPrec->
alpha0 = atan2(tmp_y,tmp_x);
750 tmp_x = pPrec->
Nx_Sf;
751 tmp_y = pPrec->
Ny_Sf;
752 tmp_z = pPrec->
Nz_Sf;
758 pPrec->
Nx_Jf = tmp_x;
759 pPrec->
Ny_Jf = tmp_y;
760 pPrec->
Nz_Jf = tmp_z;
771 pPrec->
thetaJN = acos( J0dotN / pPrec->
J0 );
795 tmp_x = pPrec->
Xx_Sf;
796 tmp_y = pPrec->
Xy_Sf;
797 tmp_z = pPrec->
Xz_Sf;
874 REAL8 chiL = (1.0 +
q) * (chi_eff /
q);
875 REAL8 chiL2 = chiL * chiL;
879 pPrec->
alpha2 = ((15*chiL*
delta*m1)/128. - (35*chiL*m1_2)/128.)/eta;
881 pPrec->
alpha3 = -5515/3072. + eta*(-515/384. - (15*delta2)/(256.*m1_2)
882 + (175*
delta)/(256.*m1)) + (4555*
delta)/(7168.*m1)
883 + ((15*chip2*
delta*m1_3)/128. - (35*chip2*m1_4)/128.)/eta2;
886 pPrec->
alpha4L = ((5*chiL*delta2)/16. - (5*chiL*
delta*m1)/3. + (2545*chiL*m1_2)/1152.
887 + ((-2035*chiL*
delta*m1)/21504.
888 + (2995*chiL*m1_2)/9216.)/eta + ((5*chiL*chip2*
delta*m1_5)/128.
889 - (35*chiL*chip2*m1_6)/384.)/eta3
892 pPrec->
alpha5 = (5*(-190512*delta3*eta6 + 2268*delta2*eta3*m1*(eta2*(323 + 784*eta)
893 + 336*(25*chiL2 + chip2)*m1_4) + 7*m1_3*(8024297*eta4 + 857412*eta5
894 + 3080448*eta6 + 143640*chip2*eta2*m1_4
895 - 127008*chip2*(-4*chiL2 + chip2)*m1_8
896 + 6048*eta3*((2632*chiL2 + 115*chip2)*m1_4 - 672*chiL*m1_2*
LAL_PI))
897 + 3*
delta*m1_2*(-5579177*eta4 + 80136*eta5 - 3845520*eta6
898 + 146664*chip2*eta2*m1_4 + 127008*chip2*(-4*chiL2 + chip2)*m1_8
899 - 42336*eta3*((726*chiL2 + 29*chip2)*m1_4
900 - 96*chiL*m1_2*
LAL_PI))))/(6.5028096e7*eta4*m1_3);
905 pPrec->
epsilon2 = ((15*chiL*
delta*m1)/128. - (35*chiL*m1_2)/128.)/eta;
907 pPrec->
epsilon3 = -5515/3072. + eta*(-515/384. - (15*delta2)/(256.*m1_2)
908 + (175*
delta)/(256.*m1)) + (4555*
delta)/(7168.*m1);
911 pPrec->
epsilon4L = (5*chiL*delta2)/16. - (5*chiL*
delta*m1)/3. + (2545*chiL*m1_2)/1152.
912 + ((-2035*chiL*
delta*m1)/21504. + (2995*chiL*m1_2)/9216.)/eta - (35*
LAL_PI)/48.
915 pPrec->
epsilon5 = (5*(-190512*delta3*eta3 + 2268*delta2*m1*(eta2*(323 + 784*eta)
917 - 3*
delta*m1_2*(eta*(5579177 + 504*eta*(-159 + 7630*eta))
918 + 254016*chiL*m1_2*(121*chiL*m1_2 - 16*
LAL_PI))
919 + 7*m1_3*(eta*(8024297 + 36*eta*(23817 + 85568*eta))
920 + 338688*chiL*m1_2*(47*chiL*m1_2 - 12*
LAL_PI))))/(6.5028096e7*eta*m1_3);
948 XLAL_ERROR(
XLAL_EINVAL,
"Error: IMRPhenomXPrecVersion not recognized. Requires version 101, 102, 103, 104, 220, 221, 222, 223, 224, 310, 311, 320 or 321.\n");
953 REAL8 alpha_offset = 0, epsilon_offset = 0;
956 printf(
"thetaJN : %e\n", pPrec->
thetaJN);
957 printf(
"phiJ_Sf : %e\n", pPrec->
phiJ_Sf);
958 printf(
"alpha0 : %e\n", pPrec->
alpha0);
960 printf(
"kappa : %e\n", pPrec->
kappa);
961 printf(
"pi/2 - phiRef : %e\n",
LAL_PI_2 - phiRef);
963 printf(
"zeta_polarization : %.16e\n", acos(pPrec->
XdotPArun));
964 printf(
"zeta_polarization : %.16e\n", asin(pPrec->
XdotQArun));
966 printf(
"alpha1 : %e\n", pPrec->
alpha1);
967 printf(
"alpha2 : %e\n", pPrec->
alpha2);
968 printf(
"alpha3 : %e\n", pPrec->
alpha3);
969 printf(
"alpha4L : %e\n", pPrec->
alpha4L);
970 printf(
"alpha5 : %e\n\n", pPrec->
alpha5);
989 if(convention == 5 || convention == 7)
1032 XLAL_PRINT_WARNING(
"Very high mass, only merger in frequency band, multibanding not efficient, switching off for non-precessing modes and Euler angles.");
1043 XLAL_PRINT_WARNING(
"Very high mass ratio, NNLO angles may become pathological, switching off multibanding for angles.\n");
1049 else if ( pWF->
q > 50 && pWF->
Mtot > 100 )
1059 const REAL8 yphi = 0.0;
1163 if (PNRUseTunedCoprec) fsflag = 5;
1166 if (PNRUseInputCoprecDeviations) fsflag = 6;
1169 if( PNRUseTunedCoprec ){
1174 double chi1L = pPrec->
chi1z;
1175 double chi2L = pPrec->
chi2z;
1194 if( pflag == 220 || pflag == 221 || pflag == 222 || pflag == 223 || pflag == 224 )
1198 XLAL_PRINT_WARNING(
"Initialization of MSA system failed. Defaulting to final spin version 0.\n");
1206 sign = copysign(1, af_parallel);
1214 XLAL_PRINT_WARNING(
"Error: XLALSimInspiralWaveformParamsLookupPhenomXPFinalSpinMod version 3 requires PrecVersion 220, 221, 222, 223 or 224. Defaulting to version 0.\n");
1228 sign = copysign(1, cos(pWF->
betaRD) );
1254 XLAL_ERROR(
XLAL_EDOM,
"Error: XLALSimInspiralWaveformParamsLookupPhenomXPFinalSpinMod version not recognized. Requires PhenomXPFinalSpinMod of 0, 1, 2, 3, or 5.\n");
1259 if( !PNRUseTunedCoprec ){
1271 printf(
"*** PNR Co-precessing model in use (l=m=2) ***\n\n");
1272 printf(
"PNR window : %e\n", pWF->
pnr_window);
1273 printf(
"pWF->afinal : %e\n",pWF->
afinal);
1274 printf(
"pWF->afinal_prec : %e\n",pWF->
afinal_prec);
1280 if( fabs(pWF->
afinal) > 1.0 )
1292 printf(
"afinal (prec) : %e\n",pWF->
afinal);
1293 printf(
"fring (prec) : %e\n",pWF->
fRING);
1294 printf(
"fdamp (prec) : %e\n\n",pWF->
fDAMP);
1305 if( APPLY_PNR_DEVIATIONS )
1333 printf(
"pflag : %i\n",pflag);
1334 printf(
"pWF->betaRD : %e\n",pWF->
betaRD);
1336 printf(
"fring22 (prec) : %e\n",fRING22_prec);
1337 printf(
"fRING : %e\n",pWF->
fRING);
1351 double omega_ref = pWF->
piM * pWF->
fRef * 2./mprime;
1356 if(pflag == 220 || pflag == 221 || pflag == 222 || pflag == 223 || pflag == 224)
1358 const double v = cbrt ( omega_ref );
1361 *alpha_offset = vangles.
x - pPrec->
alpha0;
1362 *epsilon_offset = vangles.
y - pPrec->
epsilon0;
1367 double logomega_ref = log(omega_ref);
1368 double omega_ref_cbrt = cbrt(omega_ref);
1369 double omega_ref_cbrt2 = omega_ref_cbrt * omega_ref_cbrt;
1372 pPrec->
alpha1 / omega_ref
1373 + pPrec->
alpha2 / omega_ref_cbrt2
1374 + pPrec->
alpha3 / omega_ref_cbrt
1375 + pPrec->
alpha4L * logomega_ref
1381 + pPrec->
epsilon2 / omega_ref_cbrt2
1414 const REAL8 sqx = sqrt(
x);
1423 return LNorm * (L0 + L1*sqx + L2*
x + L3*(
x*sqx) + L4*x2 + L5*(x2*sqx) + L6*x3 + L7*(x3*sqx) + L8*x4 + L8L*x4*log(
x));
1434 const REAL8 eta2 = eta*eta;
1437 const REAL8 sqx = v;
1439 return (eta / sqx) * ( 1.0 +
x * (3/2. + eta/6.) + x2 * (27/8. - (19*eta)/8. + eta2/24.) );
1451 const REAL8 eta2 = eta*eta;
1456 const REAL8 sqx = v;
1458 return (eta/sqx) * (
1460 + (3/2. + eta/6.) *
x
1461 + (chi1L*(-5/3. - (5*
delta)/3. + (5*eta)/6.) + chi2L*(-5/3. + (5*
delta)/3. + (5*eta)/6.)) *
x * sqx
1462 + (27/8. - (19*eta)/8. + eta2/24.) * x2
1463 + ((-7*(chi1L*(72 +
delta*(72 - 31*eta) + eta*(-121 + 2*eta)) + chi2L*(72 + eta*(-121 + 2*eta) +
delta*(-72 + 31*eta))))/144.) * x2 * sqx
1464 + ((10935 + eta*(-62001 + eta*(1674 + 7*eta) + 2214*
LAL_TWOPI))/1296.) * x3
1481 const REAL8 sqx = sqrt(
x);
1482 const REAL8 logx = log(
x);
1484 return (eta/sqx) * (
1486 + ((9 + eta)/6.) *
x
1487 + ((5*chi1L*(-2 - 2*
delta + eta) + 5*chi2L*(-2 + 2*
delta + eta))/6.) *
x * sqx
1488 + ((81 + (-57 + eta)*eta)/24.) * x2
1489 + ((-7*(chi1L*(72 +
delta*(72 - 31*eta) + eta*(-121 + 2*eta)) + chi2L*(72 + eta*(-121 + 2*eta) +
delta*(-72 + 31*eta))))/144.) * x2 * sqx
1490 + ((10935 + eta*(-62001 + eta*(1674 + 7*eta) + 2214*
LAL_TWOPI))/1296.) * x3
1491 + ((chi2L*(-324 + eta*(1119 - 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta)))
1492 - chi1L*(324 + eta*(-1119 + 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta))))/32.) * x3 * sqx
1493 + (2835/128. - (eta*(-10677852 + 100*eta*(-640863 + eta*(774 + 11*eta)) + 26542080*
LAL_GAMMA
1494 + 675*(3873 + 3608*eta)*
LAL_TWOPI))/622080. - (64*eta*log(16.))/3.) * x4
1495 + (-64*eta/3.) * x4 * logx
1508 const REAL8 chi1L2 = chi1L * chi1L;
1509 const REAL8 chi2L2 = chi2L * chi2L;
1515 const REAL8 sqx = sqrt(
x);
1516 const REAL8 logx = log(
x);
1518 return (eta/sqx) * (
1520 + ((9 + eta)/6.) *
x
1521 + ((5*chi1L*(-2 - 2*
delta + eta) + 5*chi2L*(-2 + 2*
delta + eta))/6.) *
x * sqx
1522 + ((81 + (-57 + eta)*eta)/24.) * x2
1523 + ((-7*(chi1L*(72 +
delta*(72 - 31*eta) + eta*(-121 + 2*eta)) + chi2L*(72 + eta*(-121 + 2*eta) +
delta*(-72 + 31*eta))))/144.) * x2 * sqx
1524 + ((10935 + eta*(-62001 + eta*(1674 + 7*eta) + 2214*
LAL_TWOPI))/1296.) * x3
1525 + ((chi2L*(-324 + eta*(1119 - 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta)))
1526 - chi1L*(324 + eta*(-1119 + 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta))))/32.) * x3 * sqx
1527 + (2835/128. - (eta*(-10677852 + 100*eta*(-640863 + eta*(774 + 11*eta)) + 26542080*
LAL_GAMMA
1528 + 675*(3873 + 3608*eta)*
LAL_TWOPI))/622080. - (64*eta*log(16.))/3.) * x4
1529 + (-64*eta/3.) * x4 * logx
1530 + ((chi1L2*(1 +
delta - 2*eta) + 4*chi1L*chi2L*eta - chi2L2*(-1 +
delta + 2*eta))/2.) * x2
1531 + ((3*(chi1L + chi2L)*eta*(chi1L2*(1 +
delta - 2*eta) + 4*chi1L*chi2L*eta - chi2L2*(-1 +
delta + 2*eta)))/4.) * x3
1555 const REAL8 logomega = log(omega);
1556 const REAL8 omega_cbrt = cbrt(omega);
1557 const REAL8 omega_cbrt2 = omega_cbrt*omega_cbrt;
1565 const REAL8 m1_2 = m1*m1;
1566 const REAL8 m1_3 = m1*m1_2;
1567 const REAL8 m1_4 = m1*m1_3;
1568 const REAL8 m1_5 = m1*m1_4;
1569 const REAL8 m1_6 = m1_3*m1_3;
1570 const REAL8 m1_8 = m1_4*m1_4;
1575 const REAL8 eta2 = eta*eta;
1576 const REAL8 eta3 = eta*eta2;
1577 const REAL8 eta4 = eta*eta3;
1578 const REAL8 eta5 = eta*eta4;
1579 const REAL8 eta6 = eta*eta5;
1581 const REAL8 chi_eff = m1*chi1L + m2*chi2L;
1582 const REAL8 chiL = (1.0 +
q) * chi_eff /
q;
1583 const REAL8 chiL2 = chiL*chiL;
1584 const REAL8 chip2 = chip*chip;
1586 const REAL8 alpha1 = (-35/192. - (5*
delta)/(64.*m1));
1587 const REAL8 alpha2 = (((-15*chiL*
delta*m1)/128. - (35*chiL*m1_2)/128.)/eta);
1588 const REAL8 alpha3 = (-5515/3072. + eta*(-515/384. - (15*delta2)/(256.*m1_2) - (175*
delta)/(256.*m1)) - (4555*
delta)/(7168.*m1)
1589 + ((-15*chip2*
delta*m1_3)/128. - (35*chip2*m1_4)/128.)/eta2);
1590 const REAL8 alpha4 = (((5*chiL*delta2)/16. + (5*chiL*
delta*m1)/3. + (2545*chiL*m1_2)/1152. + ((2035*chiL*
delta*m1)/21504.
1591 + (2995*chiL*m1_2)/9216.)/eta + ((-5*chiL*chip2*
delta*m1_5)/128.
1592 - (35*chiL*chip2*m1_6)/384.)/eta3 - (35*
LAL_PI)/48. - (5*
delta*
LAL_PI)/(16.*m1)));
1593 const REAL8 alpha5 = ((5*(190512*delta3*eta6 + 2268*delta2*eta3*m1*(eta2*(323 + 784*eta) + 336*(25*chiL2 + chip2)*m1_4)
1594 + 7*m1_3*(8024297*eta4 + 857412*eta5 + 3080448*eta6 + 143640*chip2*eta2*m1_4 - 127008*chip2*(-4*chiL2 + chip2)*m1_8
1595 + 6048*eta3*((2632*chiL2 + 115*chip2)*m1_4 - 672*chiL*m1_2*
LAL_PI)) + 3*
delta*m1_2*(5579177*eta4
1596 - 80136*eta5 + 3845520*eta6 - 146664*chip2*eta2*m1_4 - 127008*chip2*(-4*chiL2 + chip2)*m1_8
1597 + 42336*eta3*((726*chiL2 + 29*chip2)*m1_4 - 96*chiL*m1_2*
LAL_PI))))/(6.5028096e7*eta4*m1_3));
1599 return (alpha1/omega + alpha2/omega_cbrt2 + alpha3/omega_cbrt + alpha4*logomega + alpha5*omega_cbrt + alpha0);
1614 const REAL8 logomega = log(omega);
1615 const REAL8 omega_cbrt = cbrt(omega);
1616 const REAL8 omega_cbrt2 = omega_cbrt*omega_cbrt;
1624 const REAL8 m1_2 = m1*m1;
1625 const REAL8 m1_3 = m1*m1_2;
1626 const REAL8 m1_4 = m1*m1_3;
1627 const REAL8 m1_5 = m1*m1_4;
1628 const REAL8 m1_6 = m1_3*m1_3;
1629 const REAL8 m1_8 = m1_4*m1_4;
1634 const REAL8 eta2 = eta*eta;
1635 const REAL8 eta3 = eta*eta2;
1636 const REAL8 eta4 = eta*eta3;
1637 const REAL8 eta5 = eta*eta4;
1638 const REAL8 eta6 = eta*eta5;
1640 const REAL8 chi_eff = m1*chi1L + m2*chi2L;
1641 const REAL8 chiL = (1.0 +
q) * chi_eff /
q;
1642 const REAL8 chiL2 = chiL*chiL;
1643 const REAL8 chip2 = chip*chip;
1645 const REAL8 epsilon1 = (-35/192. - (5*
delta)/(64.*m1));
1646 const REAL8 epsilon2 = (((-15*chiL*
delta*m1)/128. - (35*chiL*m1_2)/128.)/eta);
1647 const REAL8 epsilon3 = (-5515/3072. + eta*(-515/384. - (15*delta2)/(256.*m1_2) - (175*
delta)/(256.*m1)) - (4555*
delta)/(7168.*m1)
1648 + ((-15*chip2*
delta*m1_3)/128. - (35*chip2*m1_4)/128.)/eta2);
1649 const REAL8 epsilon4L = (((5*chiL*delta2)/16. + (5*chiL*
delta*m1)/3. + (2545*chiL*m1_2)/1152. + ((2035*chiL*
delta*m1)/21504.
1650 + (2995*chiL*m1_2)/9216.)/eta + ((-5*chiL*chip2*
delta*m1_5)/128.
1651 - (35*chiL*chip2*m1_6)/384.)/eta3 - (35*
LAL_PI)/48. - (5*
delta*
LAL_PI)/(16.*m1)));
1652 const REAL8 epsilon5 = ((5*(190512*delta3*eta6 + 2268*delta2*eta3*m1*(eta2*(323 + 784*eta) + 336*(25*chiL2 + chip2)*m1_4)
1653 + 7*m1_3*(8024297*eta4 + 857412*eta5 + 3080448*eta6 + 143640*chip2*eta2*m1_4 - 127008*chip2*(-4*chiL2 + chip2)*m1_8
1654 + 6048*eta3*((2632*chiL2 + 115*chip2)*m1_4 - 672*chiL*m1_2*
LAL_PI)) + 3*
delta*m1_2*(5579177*eta4
1655 - 80136*eta5 + 3845520*eta6 - 146664*chip2*eta2*m1_4 - 127008*chip2*(-4*chiL2 + chip2)*m1_8
1656 + 42336*eta3*((726*chiL2 + 29*chip2)*m1_4 - 96*chiL*m1_2*
LAL_PI))))/(6.5028096e7*eta4*m1_3));
1658 return (epsilon1/omega + epsilon2/omega_cbrt2 + epsilon3/omega_cbrt + epsilon4L*logomega + epsilon5*omega_cbrt + epsilon0);
1666 const double omega_cbrt2,
1667 const double omega_cbrt,
1668 const double logomega
1676 + pPrec->
alpha2 / omega_cbrt2
1677 + pPrec->
alpha3 / omega_cbrt
1679 + pPrec->
alpha5 * omega_cbrt
1690 const double omega_cbrt2,
1691 const double omega_cbrt,
1692 const double logomega
1695 double epsilon = 0.0;
1725 double epsilon = 0.0;
1727 double cBetah = 0.0;
1728 double sBetah = 0.0;
1730 const double omega =
LAL_PI * Mf;
1731 const double logomega = log(omega);
1732 const double omega_cbrt = cbrt(omega);
1733 const double omega_cbrt2 = omega_cbrt * omega_cbrt;
1735 const double v = omega_cbrt;
1737 double s, s2, cos_beta;
1743 cos_beta = cos(pPrec->
betaPNR);
1758 const REAL8 L =
XLALSimIMRPhenomXLPNAnsatz(v, pWF->
eta/v, pPrec->
L0, pPrec->
L1, pPrec->
L2, pPrec->
L3, pPrec->
L4, pPrec->
L5, pPrec->
L6, pPrec->
L7, pPrec->
L8, pPrec->
L8L);
1764 s = pPrec->
Sperp / (L + pPrec->
SL);
1766 cos_beta = copysign(1.0, L + pPrec->
SL) / sqrt(1.0 + s2);
1776 vector vangles = {0.,0.,0.};
1783 cos_beta = vangles.
z;
1789 XLAL_ERROR(
XLAL_EINVAL,
"Error: IMRPhenomXPrecessionVersion not recognized. Recommended default is 223.\n");
1801 const REAL8 cBetah2 = cBetah * cBetah;
1802 const REAL8 cBetah3 = cBetah * cBetah2;
1803 const REAL8 cBetah4 = cBetah * cBetah3;
1804 const REAL8 sBetah2 = sBetah * sBetah;
1805 const REAL8 sBetah3 = sBetah * sBetah2;
1806 const REAL8 sBetah4 = sBetah * sBetah3;
1815 const COMPLEX16 d22[5] = {sBetah4, 2.0*cBetah*sBetah3, pPrec->
sqrt6*sBetah2*cBetah2, 2.0*cBetah3*sBetah, cBetah4};
1818 const COMPLEX16 d2m2[5] = {d22[4], -d22[3], d22[2], -d22[1], d22[0]};
1824 COMPLEX16 cexp_2i_alpha = cexp_i_alpha * cexp_i_alpha;
1825 COMPLEX16 cexp_mi_alpha = 1.0 / cexp_i_alpha;
1826 COMPLEX16 cexp_m2i_alpha = cexp_mi_alpha * cexp_mi_alpha;
1827 COMPLEX16 cexp_im_alpha_l2[5] = {cexp_m2i_alpha, cexp_mi_alpha, 1.0, cexp_i_alpha, cexp_2i_alpha};
1835 for(
int m=-2;
m<=2;
m++)
1838 COMPLEX16 A2m2emm = cexp_im_alpha_l2[-
m+2] * d2m2[
m+2] * Y2mA[
m+2];
1839 COMPLEX16 A22emmstar = cexp_im_alpha_l2[
m+2] * d22[
m+2] * conj(Y2mA[
m+2]);
1840 hp_sum += A2m2emm + polarizationSymmetry * A22emmstar;
1841 hc_sum += I*(A2m2emm - polarizationSymmetry * A22emmstar);
1845 COMPLEX16 eps_phase_hP = cexp(-2.0*I*epsilon) * hAS / 2.0;
1848 *hp = eps_phase_hP * hp_sum;
1849 *hc = eps_phase_hP * hc_sum;
1856 sprintf(fileSpec,
"angles_XP.dat");
1858 fileangle = fopen(fileSpec,
"a");
1871 REAL8 *cos_beta_half,
1872 REAL8 *sin_beta_half,
1873 const REAL8 cos_beta
1877 *cos_beta_half = + sqrt( fabs(1.0 + cos_beta) / 2.0 );
1878 *sin_beta_half = + sqrt( fabs(1.0 - cos_beta) / 2.0 );
1884 REAL8 *cos_beta_half,
1885 REAL8 *sin_beta_half,
1892 const REAL8 L =
XLALSimIMRPhenomXLPNAnsatz(v, pWF->
eta/v, pPrec->
L0, pPrec->
L1, pPrec->
L2, pPrec->
L3, pPrec->
L4, pPrec->
L5, pPrec->
L6, pPrec->
L7, pPrec->
L8, pPrec->
L8L);
1900 const REAL8 cos_beta = copysign(1.0, L + pPrec->
SL) / sqrt(1.0 + s2);
1902 *cos_beta_half = + sqrt( fabs(1.0 + cos_beta) / 2.0 );
1903 *sin_beta_half = + sqrt( fabs(1.0 - cos_beta) / 2.0 );
1919 const REAL8 v_at_max_beta = sqrt(2.0 / 3.0) * sqrt( (-9.0 - eta + sqrt(1539.0 - 1008.0*eta + 19.0*eta*eta)) / (81 - 57*eta + eta*eta) );
1929 const REAL8 max_beta = 2.0 * acos(cBetah);
1937 if ((L_min + pPrec->
SL) < 0. && pPrec->
chi_p > 0.)
1939 XLAL_PRINT_WARNING(
"The maximum opening angle exceeds Pi/2.\nThe model may be pathological in this regime.");
1943 XLAL_PRINT_WARNING(
"The maximum opening angle %g is larger than Pi/4.\nThe model has not been tested against NR in this regime.", max_beta);
1967 vector vout = {0.,0.,0.};
1970 const double L_norm = pWF->
eta / v;
1973 double L_norm3PN = 0.0;
1982 L_norm3PN =
XLALSimIMRPhenomXLPNAnsatz(v, L_norm, pPrec->
L0, pPrec->
L1, pPrec->
L2, pPrec->
L3, pPrec->
L4, pPrec->
L5, pPrec->
L6, pPrec->
L7, pPrec->
L8, pPrec->
L8L);
1994 pPrec->
S32 = vRoots.
x;
1995 pPrec->
Smi2 = vRoots.
y;
1996 pPrec->
Spl2 = vRoots.
z;
2000 pPrec->
Spl = sqrt(pPrec->
Spl2);
2001 pPrec->
Smi = sqrt(pPrec->
Smi2);
2007 vector vMSA = {0.,0.,0.};
2008 if(fabs(pPrec->
Smi2 - pPrec->
Spl2) > 1.e-5)
2014 const double phiz_MSA = vMSA.
x;
2015 const double zeta_MSA = vMSA.
y;
2021 vout.
x = phiz + phiz_MSA;
2022 vout.
y =
zeta + zeta_MSA;
2023 vout.
z = cos_theta_L;
2035 if(pflag != 220 && pflag != 221 && pflag != 222 && pflag != 223 && pflag != 224)
2037 XLAL_ERROR(
XLAL_EINVAL,
"Error: MSA system requires IMRPhenomXPrecVersion 220, 221, 222, 223 or 224.\n");
2047 const double eta = pPrec->
eta;
2048 const double eta2 = pPrec->
eta2;
2049 const double eta3 = pPrec->
eta3;
2050 const double eta4 = pPrec->
eta4;
2052 const double m1 = pWF->
m1;
2053 const double m2 = pWF->
m2;
2056 const double domegadt_constants_NS[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.};
2057 const double domegadt_constants_SO[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.};
2058 const double domegadt_constants_SS[4] = {-494./5.,-1442./5.,-233./5.,-719./5.};
2060 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.};
2061 const double L_csts_spinorbit[6] = {-14./6.,-3./2.,-11./2.,133./72.,-33./8.,7./4.};
2069 const double q = m2 / m1;
2070 const double invq = 1.0 /
q;
2072 pPrec->
invqq = invq;
2074 const double mu = (m1 * m2) / (m1 + m2);
2077 printf(
"m1 = %.6f\n\n",pWF->
m1);
2078 printf(
"m2 = %.6f\n\n",pWF->
m2);
2079 printf(
"q (<1) = %.6f\n\n",pPrec->
qq);
2083 pPrec->
delta_qq = (1.0 - pPrec->
qq) / (1.0 + pPrec->
qq);
2093 vector Lhat = {0.,0.,1.};
2133 printf(
"v_0 = %.6f\n\n",pPrec->
v_0);
2135 printf(
"chi1x = %.6f\n",pPrec->
chi1x);
2136 printf(
"chi1y = %.6f\n",pPrec->
chi1y);
2137 printf(
"chi1z = %.6f\n\n",pPrec->
chi1z);
2139 printf(
"chi2x = %.6f\n",pPrec->
chi2x);
2140 printf(
"chi2y = %.6f\n",pPrec->
chi2y);
2141 printf(
"chi2z = %.6f\n\n",pPrec->
chi2z);
2143 printf(
"S1_0.x = %.6f\n",pPrec->
S1_0.
x);
2144 printf(
"S1_0.y = %.6f\n",pPrec->
S1_0.
y);
2145 printf(
"S1_0.z = %.6f\n",pPrec->
S1_0.
z);
2146 printf(
"S1_0 = %.6f\n\n",S1_0_norm);
2148 printf(
"S2_0.x = %.6f\n",pPrec->
S2_0.
x);
2149 printf(
"S2_0.y = %.6f\n",pPrec->
S2_0.
y);
2150 printf(
"S2_0.z = %.6f\n",pPrec->
S2_0.
z);
2151 printf(
"S2_0 = %.6f\n\n",S2_0_norm);
2155 double dotS1L, dotS2L, dotS1Ln, dotS2Ln, dotS1S2;
2160 dotS1Ln = dotS1L / S1_0_norm;
2161 dotS2Ln = dotS2L / S2_0_norm;
2171 printf(
"Lhat_0.x = %.6f\n",Lhat.
x);
2172 printf(
"Lhat_0.y = %.6f\n",Lhat.
y);
2173 printf(
"Lhat_0.z = %.6f\n\n",Lhat.
z);
2175 printf(
"dotS1L = %.6f\n",pPrec->
dotS1L);
2176 printf(
"dotS2L = %.6f\n",pPrec->
dotS2L);
2177 printf(
"dotS1Ln = %.6f\n",pPrec->
dotS1Ln);
2178 printf(
"dotS2Ln = %.6f\n",pPrec->
dotS2Ln);
2179 printf(
"dotS1S2 = %.6f\n\n",pPrec->
dotS1S2);
2183 pPrec->
constants_L[0] = (L_csts_nonspin[0] + eta*L_csts_nonspin[1]);
2185 pPrec->
constants_L[2] = (L_csts_nonspin[2] + eta*L_csts_nonspin[3] + eta*eta*L_csts_nonspin[4]);
2187 pPrec->
constants_L[4] = (L_csts_nonspin[5]+L_csts_nonspin[6]*eta +L_csts_nonspin[7]*eta*eta+L_csts_nonspin[8]*eta*eta*eta);
2190 const double Seff = (1.0 +
q) * pPrec->
dotS1L + (1 + (1.0/
q))*pPrec->
dotS2L;
2191 const double Seff2 = Seff * Seff;
2194 pPrec->
Seff2 = Seff2;
2197 printf(
"Seff = %.6f\n\n",pPrec->
Seff);
2208 printf(
"S_0_x = %.6f\n",pPrec->
S_0.
x);
2209 printf(
"S_0_y = %.6f\n",pPrec->
S_0.
y);
2210 printf(
"S_0_z = %.6f\n\n",pPrec->
S_0.
z);
2217 printf(
"J_0_x = %.6f\n",pPrec->
J_0.
x);
2218 printf(
"J_0_y = %.6f\n",pPrec->
J_0.
y);
2219 printf(
"J_0_z = %.6f\n\n",pPrec->
J_0.
z);
2230 const double L0norm = pPrec->
L_0_norm;
2231 const double J0norm = pPrec->
J_0_norm;
2234 printf(
"L_0_norm = %.6f\n",pPrec->
L_0_norm);
2235 printf(
"J_0_norm = %.6f\n\n",pPrec->
J_0_norm);
2248 printf(
"B = %.6f\n",vBCD.x);
2249 printf(
"C = %.6f\n",vBCD.y);
2250 printf(
"D = %.6f\n\n",vBCD.z);
2259 vector vRoots = {0.,0.,0.};
2264 pPrec->
Spl2 = vRoots.
z;
2265 pPrec->
Smi2 = vRoots.
y;
2266 pPrec->
S32 = vRoots.
x;
2275 pPrec->
Spl = sqrt(pPrec->
Spl2);
2276 pPrec->
Smi = sqrt(pPrec->
Smi2);
2280 pPrec->
SAv = sqrt(pPrec->
SAv2);
2285 printf(
"From vRoots... \n");
2286 printf(
"Spl2 = %.6f\n",pPrec->
Spl2);
2287 printf(
"Smi2 = %.6f\n",pPrec->
Smi2);
2288 printf(
"S32 = %.6f\n",pPrec->
S32);
2289 printf(
"SAv2 = %.6f\n",pPrec->
SAv2);
2290 printf(
"SAv = %.6f\n\n",pPrec->
SAv);
2294 const double c_1 = 0.5 * (J0norm*J0norm - L0norm*L0norm - pPrec->
SAv2) / pPrec->
L_0_norm * eta;
2295 const double c1_2 = c_1 * c_1;
2299 pPrec->
c12 = c_1 * c_1;
2303 const double omqsq = (1.0 -
q) * (1.0 -
q) + 1
e-16;
2304 const double omq2 = (1.0 -
q *
q) + 1
e-16;
2307 pPrec->
S1L_pav = (c_1 * (1.0 +
q) -
q * eta * Seff) / (eta * omq2);
2308 pPrec->
S2L_pav = -
q * (c_1 * (1.0 +
q) - eta * Seff) / (eta * omq2);
2315 pPrec->
beta3 = ( (113./12.) + (25./4.)*(m2/m1) )*pPrec->
S1L_pav + ( (113./12.) + (25./4.)*(m1/m2) )*pPrec->
S2L_pav;
2317 pPrec->
beta5 = ( ( (31319./1008.) - (1159./24.)*eta) + (m2/m1)*((809./84) - (281./8.)*eta) )*pPrec->
S1L_pav
2318 + ( ( (31319./1008.) - (1159./24.)*eta) + (m1/m2)*((809./84) - (281./8.)*eta) )*pPrec->
S2L_pav;
2320 pPrec->
beta6 =
LAL_PI * ( ( (75./2.) + (151./6.)*(m2/m1))*pPrec->
S1L_pav + ( (75./2.) + (151./6.)*(m1/m2))*pPrec->
S2L_pav );
2323 ( (130325./756) - (796069./2016)*eta + (100019./864.)*eta2 ) + (m2/m1)*( (1195759./18144) - (257023./1008.)*eta + (2903/32.)*eta2 ) * pPrec->
S1L_pav
2324 + ( (130325./756) - (796069./2016)*eta + (100019./864.)*eta2 ) + (m1/m2)*( (1195759./18144) - (257023./1008.)*eta + (2903/32.)*eta2 ) * pPrec->
S2L_pav
2332 pPrec->
a0 = 96.0 * eta / 5.0;
2335 pPrec->
a2 = -(743./336.) - (11.0/4.)*eta;
2337 pPrec->
a4 = (34103./18144.) + (13661./2016.)*eta + (59./18.)*eta2 - pPrec->
sigma4;
2340 + eta*( (451./48)*
LAL_PI*
LAL_PI - (56198689./217728.) ) + eta2*(541./896.) - eta3*(5605./2592.);
2344 pPrec->
a2 *= pPrec->
a0;
2345 pPrec->
a3 *= pPrec->
a0;
2346 pPrec->
a4 *= pPrec->
a0;
2347 pPrec->
a5 *= pPrec->
a0;
2348 pPrec->
a6 *= pPrec->
a0;
2349 pPrec->
a7 *= pPrec->
a0;
2352 printf(
"a0 = %.6f\n",pPrec->
a0);
2353 printf(
"a2 = %.6f\n",pPrec->
a2);
2354 printf(
"a3 = %.6f\n",pPrec->
a3);
2355 printf(
"a4 = %.6f\n",pPrec->
a4);
2356 printf(
"a5 = %.6f\n\n",pPrec->
a5);
2360 if(pflag == 222 || pflag == 223)
2362 pPrec->
a0 = eta*domegadt_constants_NS[0];
2363 pPrec->
a2 = eta*(domegadt_constants_NS[1] + eta*(domegadt_constants_NS[2]));
2364 pPrec->
a3 = eta*(domegadt_constants_NS[3] +
IMRPhenomX_Get_PN_beta(domegadt_constants_SO[0], domegadt_constants_SO[1], pPrec));
2365 pPrec->
a4 = eta*(domegadt_constants_NS[4] + eta*(domegadt_constants_NS[5] + eta*(domegadt_constants_NS[6])) +
IMRPhenomX_Get_PN_sigma(domegadt_constants_SS[0], domegadt_constants_SS[1], pPrec) +
IMRPhenomX_Get_PN_tau(domegadt_constants_SS[2], domegadt_constants_SS[3], pPrec));
2366 pPrec->
a5 = eta*(domegadt_constants_NS[7] + eta*(domegadt_constants_NS[8]) +
IMRPhenomX_Get_PN_beta((domegadt_constants_SO[2] + eta*(domegadt_constants_SO[3])), (domegadt_constants_SO[4] + eta*(domegadt_constants_SO[5])), pPrec));
2371 printf(
"Using list of coefficients... \n");
2372 printf(
"a0 = %.6f\n",pPrec->
a0);
2373 printf(
"a2 = %.6f\n",pPrec->
a2);
2374 printf(
"a3 = %.6f\n",pPrec->
a3);
2375 printf(
"a4 = %.6f\n",pPrec->
a4);
2376 printf(
"a5 = %.6f\n\n",pPrec->
a5);
2388 pPrec->
g0 = 1. / pPrec->
a0;
2391 pPrec->
g2 = -(pPrec->
a2 / pPrec->
a0_2);
2394 pPrec->
g3 = -(pPrec->
a3/pPrec->
a0_2);
2400 pPrec->
g5 = -(pPrec->
a5*pPrec->
a0 - 2.0*pPrec->
a3*pPrec->
a2) / pPrec->
a0_3;
2403 printf(
"g0 = %.6f\n",pPrec->
g0);
2404 printf(
"g2 = %.6f\n",pPrec->
g2);
2405 printf(
"g3 = %.6f\n",pPrec->
g3);
2406 printf(
"g4 = %.6f\n",pPrec->
g4);
2407 printf(
"g5 = %.6f\n\n",pPrec->
g5);
2413 const double delta3 =
delta * delta2;
2414 const double delta4 =
delta * delta3;
2422 pPrec->
psi1 = 3.0 * (2.0 * eta2 * Seff - c_1) / (eta * delta2);
2425 double c_1_over_nu_2 = c_1_over_nu * c_1_over_nu;
2426 double one_p_q_sq = (1.+
q) * (1.+
q);
2427 double Seff_2 = Seff * Seff;
2429 double one_m_q_sq = (1.-
q)*(1.-
q);
2430 double one_m_q2_2 = (1. - q_2) * (1. - q_2);
2431 double one_m_q_4 = one_m_q_sq * one_m_q_sq;
2433 double term1, term2, term3, term4, term5, term6, term7, term8;
2438 if(pflag == 222 || pflag == 223)
2440 const double Del1 = 4. * c_1_over_nu_2 * one_p_q_sq;
2441 const double Del2 = 8. * c_1_over_nu *
q * (1. +
q) * Seff;
2442 const double Del3 = 4. * (one_m_q2_2 * pPrec->
S1_norm_2 - q_2 * Seff_2);
2443 const double Del4 = 4. * c_1_over_nu_2 * q_2 * one_p_q_sq;
2444 const double Del5 = 8. * c_1_over_nu * q_2 * (1. +
q) * Seff;
2445 const double Del6 = 4. * (one_m_q2_2 * pPrec->
S2_norm_2 - q_2 * Seff_2);
2446 pPrec->
Delta = sqrt( fabs( (Del1 - Del2 - Del3) * (Del4 - Del5 - Del6) ));
2451 term1 = c1_2 * eta / (
q * delta4);
2452 term2 = -2.0 * c_1 * eta3 * (1.0 +
q) * Seff / (
q * delta4);
2453 term3 = -eta2 * (delta2 * pPrec->
S1_norm_2 - eta2 * Seff2) / delta4;
2461 term4 = c1_2 * eta *
q / delta4;
2462 term5 = -2.0*c_1*eta3*(1.0 +
q)*Seff / delta4;
2463 term6 = -eta2 * (delta2*pPrec->
S2_norm_2 - eta2*Seff2) / delta4;
2466 pPrec->
Delta = sqrt( fabs( (term1 + term2 + term3) * (term4 + term5 + term6) ) );
2472 if(pflag == 222 || pflag == 223)
2474 const double u1 = 3. * pPrec->
g2 / pPrec->
g0;
2475 const double u2 = 0.75 * one_p_q_sq / one_m_q_4;
2476 const double u3 = -20. * c_1_over_nu_2 * q_2 * one_p_q_sq;
2478 const double u5 = 2. * q_2 * (7. + 6. *
q + 7. * q_2) * 2. * c_1_over_nu * Seff;
2479 const double u6 = 2. * q_2 * (3. + 4. *
q + 3. * q_2) * Seff_2;
2480 const double u7 =
q * pPrec->
Delta;
2488 term1 = 3.0 * pPrec->
g2 / pPrec->
g0;
2491 term2 = 3.0 *
q *
q / (2.0 * eta3);
2492 term3 = 2.0 * pPrec->
Delta;
2493 term4 = -2.0*eta2*pPrec->
SAv2 / delta2;
2494 term5 = -10.*eta*c1_2 / delta4;
2495 term6 = 2.0 * eta2 * (7.0 + 6.0*
q + 7.0*
q*
q) * c_1 * Seff / (omqsq * delta2);
2496 term7 = -eta3 * (3.0 + 4.0*
q + 3.0*
q*
q) * Seff2 / (omqsq * delta2);
2500 pPrec->
psi2 = term1 + term2 * (term3 + term4 + term5 + term6 + term7 + term8);
2504 printf(
"psi1 = %.6f\n",pPrec->
psi1);
2505 printf(
"psi2 = %.6f\n\n",pPrec->
psi2);
2509 const double Rm = pPrec->
Spl2 - pPrec->
Smi2;
2510 const double Rm_2 = Rm * Rm;
2513 const double cp = pPrec->
Spl2 * eta2 - c1_2;
2514 double cm = pPrec->
Smi2 * eta2 - c1_2;
2527 const double cpcm = fabs( cp * cm );
2528 const double sqrt_cpcm = sqrt(cpcm);
2531 const double a1dD = 0.5 + 0.75/eta;
2534 const double a2dD = -0.75*Seff/eta;
2537 const double D2RmSq = (cp - sqrt_cpcm) / eta2 ;
2540 const double D4RmSq = -0.5*Rm*sqrt_cpcm/eta2 - cp/eta4*(sqrt_cpcm - cp);
2545 double aw = (-3.*(1. +
q)/
q*(2.*(1. +
q)*eta2*Seff*c_1 - (1. +
q)*c1_2 + (1. -
q)*eta2*S0m));
2546 double cw = 3./32./eta*Rm_2;
2547 double dw = 4.0*cp - 4.0*D2RmSq*eta2;
2548 double hw = -2.0*(2.0*D2RmSq - Rm)*c_1;
2549 double fw = Rm*D2RmSq - D4RmSq - 0.25*Rm_2;
2551 const double adD = aw / dw;
2552 const double hdD = hw / dw;
2553 const double cdD = cw / dw;
2554 const double fdD = fw / dw;
2556 const double gw = 3./16./eta2/eta*Rm_2*(c_1 - eta2*Seff);
2557 const double gdD = gw / dw;
2560 const double hdD_2 = hdD * hdD;
2561 const double adDfdD = adD * fdD;
2562 const double adDfdDhdD = adDfdD * hdD;
2563 const double adDhdD_2 = adD * hdD_2;
2566 printf(
"\na1dD = %.6f\n",a1dD);
2567 printf(
"a2dD = %.6f\n",a2dD);
2568 printf(
"adD = %.6f\n",adD);
2569 printf(
"cdD = %.6f\n",cdD);
2570 printf(
"hdD = %.6f\n",hdD);
2571 printf(
"fdD = %.6f\n",fdD);
2572 printf(
"Rm = %.6f\n",Rm);
2573 printf(
"Delta = %.6f\n",pPrec->
Delta);
2574 printf(
"sqrt_cpcm = %.6f\n",sqrt_cpcm);
2575 printf(
"c1 = %.6f\n",pPrec->
c1);
2576 printf(
"gdD = %.6f\n\n",gdD);
2583 pPrec->
Omegaz1 = a2dD - adD*Seff - adD*hdD;
2586 pPrec->
Omegaz2 = adD*hdD*Seff + cdD - adD*fdD + adD*hdD_2;
2589 pPrec->
Omegaz3 = (adDfdD - cdD - adDhdD_2)*(Seff + hdD) + adDfdDhdD;
2592 pPrec->
Omegaz4 = (cdD + adDhdD_2 - 2.0*adDfdD)*(hdD*Seff + hdD_2 - fdD) - adD*fdD*fdD;
2595 pPrec->
Omegaz5 = (cdD - adDfdD + adDhdD_2) * fdD * (Seff + 2.0*hdD) - (cdD + adDhdD_2 - 2.0*adDfdD) * hdD_2 * (Seff + hdD) - adDfdD*fdD*hdD;
2598 printf(
"Omegaz0 = %.6f\n",pPrec->
Omegaz0);
2599 printf(
"Omegaz1 = %.6f\n",pPrec->
Omegaz1);
2600 printf(
"Omegaz2 = %.6f\n",pPrec->
Omegaz2);
2601 printf(
"Omegaz3 = %.6f\n",pPrec->
Omegaz3);
2602 printf(
"Omegaz4 = %.6f\n",pPrec->
Omegaz4);
2603 printf(
"Omegaz5 = %.6f\n\n",pPrec->
Omegaz5);
2610 if(fabs(pPrec->
Omegaz5) > 1000.0)
2613 XLAL_PRINT_WARNING(
"Warning, |Omegaz5| = %.16f, which is larger than expected and may be pathological. Triggering MSA failure.\n",pPrec->
Omegaz5);
2616 const double g0 = pPrec->
g0;
2627 const double c1oveta2 = c_1 / eta2;
2636 printf(
"Omegazeta0 = %.6f\n",pPrec->
Omegazeta0);
2637 printf(
"Omegazeta1 = %.6f\n",pPrec->
Omegazeta1);
2638 printf(
"Omegazeta2 = %.6f\n",pPrec->
Omegazeta2);
2639 printf(
"Omegazeta3 = %.6f\n",pPrec->
Omegazeta3);
2640 printf(
"Omegazeta4 = %.6f\n",pPrec->
Omegazeta4);
2641 printf(
"Omegazeta5 = %.6f\n\n",pPrec->
Omegazeta5);
2652 switch(ExpansionOrder)
2663 #if __GNUC__ >= 7 && !defined __INTEL_COMPILER
2672 #if __GNUC__ >= 7 && !defined __INTEL_COMPILER
2681 #if __GNUC__ >= 7 && !defined __INTEL_COMPILER
2690 #if __GNUC__ >= 7 && !defined __INTEL_COMPILER
2703 XLAL_ERROR(
XLAL_EDOM,
"Expansion order for MSA corrections = %i not recognized. Default is 5. Allowed values are: [-1,1,2,3,4,5].",ExpansionOrder);
2724 double psi_of_v0 = 0.0;
2727 double volume_element = 0.0;
2728 double vol_sign = 0.0;
2731 printf(
"psi1 = %.6f\n",pPrec->
psi1);
2732 printf(
"psi2 = %.6f\n\n",pPrec->
psi2);
2733 printf(
"S_0_norm = %.6f\n\n",pPrec->
S_0_norm);
2737 if( fabs(pPrec->
Smi2 - pPrec->
Spl2) < 1.0e-5)
2743 mm = sqrt( (pPrec->
Smi2 - pPrec->
Spl2) / (pPrec->
S32 - pPrec->
Spl2) );
2747 vol_sign = (volume_element > 0) - (volume_element < 0);
2751 if( tmpB < 0. || tmpB > 1. )
2753 if(tmpB > 1.0 && (tmpB - 1.) < 0.00001)
2755 pPrec->
psi0 = gsl_sf_ellint_F(asin(vol_sign*sqrt(1.)) , mm, GSL_PREC_DOUBLE ) - psi_of_v0;
2757 if(tmpB < 0.0 && tmpB > -0.00001)
2759 pPrec->
psi0 = gsl_sf_ellint_F(asin(vol_sign*sqrt(0.)), mm, GSL_PREC_DOUBLE ) - psi_of_v0;
2764 pPrec->
psi0 = gsl_sf_ellint_F(asin( vol_sign * sqrt(tmpB) ), mm, GSL_PREC_DOUBLE) - psi_of_v0;
2769 printf(
"psi0_of_v0 = %.6f\n",psi_of_v0);
2770 printf(
"tmpB = %.6f\n",tmpB);
2771 printf(
"psi0 = %.6f\n\n",pPrec->
psi0);
2774 vector vMSA = {0.,0.,0.};
2776 double phiz_0 = 0.0;
2777 UNUSED
double phiz_0_MSA = 0.0;
2779 double zeta_0 = 0.0;
2780 UNUSED
double zeta_0_MSA = 0.0;
2783 if( fabs(pPrec->
Spl2 - pPrec->
Smi2) > 1.e-5 )
2787 phiz_0_MSA = vMSA.
x;
2788 zeta_0_MSA = vMSA.
y;
2799 pPrec->
phiz_0 = - phiz_0 - vMSA.
x;
2800 pPrec->
zeta_0 = - zeta_0 - vMSA.
y;
2803 printf(
"v_0 = %.6f\n",pPrec->
v_0);
2804 printf(
"c1 = %.6f\n\n",pPrec->
c1);
2806 printf(
"eta = %.6f\n",pPrec->
eta);
2807 printf(
"eta2 = %.6f\n",pPrec->
eta2);
2808 printf(
"eta3 = %.6f\n",pPrec->
eta3);
2809 printf(
"eta4 = %.6f\n",pPrec->
eta4);
2810 printf(
"ieta = %.6f\n",pPrec->
inveta);
2811 printf(
"ieta2 = %.6f\n",pPrec->
inveta2);
2812 printf(
"ieta3 = %.6f\n\n",pPrec->
inveta3);
2814 printf(
"SAv = %.6f\n",pPrec->
SAv);
2815 printf(
"SAv2 = %.6f\n\n",pPrec->
SAv2);
2816 printf(
"invSAv2 = %.6f\n\n",pPrec->
invSAv2);
2817 printf(
"invSAv = %.6f\n\n",pPrec->
invSAv);
2819 printf(
"J_0_norm = %.6f\n",pPrec->
J_0_norm);
2820 printf(
"L_0_norm = %.6f\n\n",pPrec->
L_0_norm);
2822 printf(
"phiz_0 = %.6f\n",pPrec->
phiz_0);
2823 printf(
"zeta_0 = %.6f\n",pPrec->
zeta_0);
2824 printf(
"phiz_0_MSA = %.6f\n",phiz_0_MSA);
2825 printf(
"zeta_0_MSA = %.6f\n\n",zeta_0_MSA);
2834 return ( psi0 - 0.75*pPrec->
g0 * pPrec->
delta_qq * (1.0 + psi1*v + psi2*v2) / (v2*v) );
2860 const double B = vBCD.
x;
2861 const double C = vBCD.
y;
2862 const double D = vBCD.
z;
2864 const double S1Norm2 = pPrec->
S1_norm_2;
2865 const double S2Norm2 = pPrec->
S2_norm_2;
2869 const double B2 =
B *
B;
2870 const double B3 = B2 *
B;
2871 const double BC =
B * C;
2873 const double p = C - B2 / 3;
2874 const double qc = (2.0/27.0)*B3 - BC/3.0 + D;
2876 const double sqrtarg = sqrt(-
p/3.0);
2877 double acosarg = 1.5 * qc/
p/sqrtarg;
2888 const double theta = acos(acosarg) / 3.0;
2889 const double cos_theta = cos(
theta);
2891 const double dotS1Ln = pPrec->
dotS1Ln;
2892 const double dotS2Ln = pPrec->
dotS2Ln;
2894 double S32, Spl2, Smi2;
2899 if(
theta !=
theta || sqrtarg!=sqrtarg || dotS1Ln == 1 || dotS2Ln == 1 || dotS1Ln == -1 || dotS2Ln == -1 || S1Norm2 == 0
2919 tmp3 = 2.0*sqrtarg*cos_theta -
B/3.0;
2964 const double JNorm2 = (LNorm*LNorm + (2.0 * LNorm * pPrec->
c1_over_eta) + pPrec->
SAv2);
2965 return sqrt(JNorm2);
2977 double sn, cn, dn,
m, psi;
2984 if( fabs(pPrec->
Smi2 - pPrec->
Spl2) < 1.0e-5 )
2996 gsl_sf_elljac_e(psi,
m, &
sn, &cn, &dn);
3002 return sqrt(SNorm2);
3014 const double JNorm2 = JNorm * JNorm;
3017 const double LNorm2 = LNorm * LNorm;
3020 const double S1Norm2 = pPrec->
S1_norm_2;
3021 const double S2Norm2 = pPrec->
S2_norm_2;
3023 const double q = pPrec->
qq;
3024 const double eta = pPrec->
eta;
3026 const double J2mL2 = (JNorm2 - LNorm2);
3027 const double J2mL2Sq = J2mL2 * J2mL2;
3037 const double Seff = pPrec->
Seff;
3042 vout.
x = (LNorm2 + S1Norm2)*
q + 2.0*LNorm*Seff - 2.0*JNorm2 -
3043 S1Norm2 - S2Norm2 + (LNorm2 + S2Norm2)/
q;
3046 vout.
y = J2mL2Sq - 2.0*LNorm*Seff*J2mL2 - 2.0*((1.0 -
q)/
q)*LNorm2*(S1Norm2 -
q*S2Norm2) +
3047 4.0*eta*LNorm2*Seff*Seff - 2.0*
delta*(S1Norm2 - S2Norm2)*Seff*LNorm +
3048 2.0*((1.0 -
q)/
q)*(
q*S1Norm2 - S2Norm2)*JNorm2;
3051 vout.
z = ((1.0 -
q)/
q)*(S2Norm2 -
q*S1Norm2)*J2mL2Sq
3052 + deltaSq*(S1Norm2 - S2Norm2)*(S1Norm2 - S2Norm2)*LNorm2/eta
3053 + 2.0*
delta*LNorm*Seff*(S1Norm2 - S2Norm2)*J2mL2;
3068 const double v2 = v*v;
3069 const double v3 = v*v2;
3070 const double v4 = v2*v2;
3071 const double v6 = v3*v3;
3073 const double JNorm2 = JNorm * JNorm;
3075 vector vout = {0.,0.,0.};
3077 const double Seff = pPrec->
Seff;
3082 vout.
x = JNorm * ( 0.75*(1.0 - Seff*v) * v2 * (pPrec->
eta3 + 4.0*pPrec->
eta3*Seff*v
3084 - 4.0*pPrec->
eta*Seff*(JNorm2 - pPrec->
Spl2)*v3 + (JNorm2 - pPrec->
Spl2)*(JNorm2 - pPrec->
Spl2)*v4*pPrec->
inveta) );
3087 vout.
y = JNorm * ( -1.5 * pPrec->
eta * (pPrec->
Spl2 - pPrec->
Smi2)*(1.0 + 2.0*Seff*v - (JNorm2 - pPrec->
Spl2)*v2*pPrec->
inveta2) * (1.0 - Seff*v)*v4 );
3090 vout.
z = JNorm * ( 0.75 * pPrec->
inveta * (pPrec->
Spl2 - pPrec->
Smi2)*(pPrec->
Spl2 - pPrec->
Smi2)*(1.0 - Seff * v)*v6 );
3098 double v_3 = v * v_2;
3099 double v_4 = v_2 * v_2;
3100 double v_6 = v_2 * v_4;
3101 double J_norm = JNorm;
3103 double eta = pPrec->
eta;
3104 double eta_2 = eta * eta;
3107 vout.
y = 1.5*(pPrec->
Smi2-pPrec->
Spl2)*J_norm*((JNorm2-pPrec->
Spl2)/(pPrec->
eta)*v_2-2.*(pPrec->
eta)*(pPrec->
Seff)*v-(pPrec->
eta))*((pPrec->
Seff)*v-1.)*v_4;
3121 const double LNorm2 = LNorm * LNorm;
3122 const double JNorm2 = JNorm * JNorm;
3124 vector vout = {0.,0.,0.};
3126 vout.
x = -( JNorm2 - (LNorm + pPrec->
Spl)*(LNorm + pPrec->
Spl))
3127 * ( (JNorm2 - (LNorm - pPrec->
Spl)*(LNorm - pPrec->
Spl)) );
3128 vout.
y = -2.0*(pPrec->
Spl2 - pPrec->
Smi2)*(JNorm2 + LNorm2 - pPrec->
Spl2);
3142 double costhetaLJ = 0.5*(J_norm*J_norm + L_norm*L_norm - S_norm*S_norm)/(L_norm * J_norm);
3144 if (costhetaLJ > 1.0) costhetaLJ = +1.0;
3145 if (costhetaLJ < -1.0) costhetaLJ = -1.0;
3157 return ( -0.75 * pPrec->
g0 * pPrec->
delta_qq * (1.0 + pPrec->
psi1*v + pPrec->
psi2*v2) / (v2*v) );
3169 const double v2 = v*v;
3171 const double A_coeff = -1.5 * (v2 * v2 * v2) * (1.0 - v*pPrec->
Seff) * pPrec->
sqrt_inveta;
3172 const double psi_dot = 0.5 * A_coeff * sqrt(pPrec->
Spl2 - pPrec->
S32);
3183 const double invv = 1.0/v;
3184 const double invv2 = invv * invv;
3186 const double LNewt = (pPrec->
eta/v);
3188 const double c1 = pPrec->
c1;
3189 const double c12 =
c1 *
c1;
3191 const double SAv2 = pPrec->
SAv2;
3192 const double SAv = pPrec->
SAv;
3193 const double invSAv = pPrec->
invSAv;
3194 const double invSAv2 = pPrec->
invSAv2;
3197 const double log1 = log( fabs(
c1 + JNorm*pPrec->
eta + pPrec->
eta*LNewt) );
3198 const double log2 = log( fabs(
c1 + JNorm*SAv*v + SAv2*v) );
3201 const double phiz_0_coeff = (JNorm * pPrec->
inveta4) * (0.5*c12 -
c1*pPrec->
eta2*invv/6.0 - SAv2*pPrec->
eta2/3.0 - pPrec->
eta4*invv2/3.0)
3206 const double phiz_1_coeff = - 0.5 * JNorm * pPrec->
inveta2 * (
c1 + pPrec->
eta * LNewt) + 0.5*pPrec->
inveta3*(c12 - pPrec->
eta2*SAv2)*log1;
3209 const double phiz_2_coeff = -JNorm + SAv*log2 -
c1*log1*pPrec->
inveta;
3212 const double phiz_3_coeff = JNorm*v - pPrec->
eta*log1 +
c1*log2*pPrec->
invSAv;
3215 const double phiz_4_coeff = (0.5*JNorm*invSAv2*v)*(
c1 + v*SAv2) - (0.5*invSAv2*invSAv)*(c12 - pPrec->
eta2*SAv2)*log2;
3218 const double phiz_5_coeff = -JNorm*v*( (0.5*c12*invSAv2*invSAv2) - (
c1*v*invSAv2/6.0) - v*v/3.0 - pPrec->
eta2*invSAv2/3.0)
3219 + (0.5*
c1*invSAv2*invSAv2*invSAv)*(c12 - pPrec->
eta2*SAv2)*log2;
3237 if (phiz_out != phiz_out) phiz_out = 0;
3255 const double invv = 1.0/v;
3256 const double invv2 = invv*invv;
3257 const double invv3 = invv*invv2;
3258 const double v2 = v*v;
3259 const double logv = log(v);
3263 double zeta_out = pPrec->
eta * (
3273 if (zeta_out != zeta_out) zeta_out = 0;
3285 vector c_vec = {0.,0.,0.};
3286 vector d_vec = {0.,0.,0.};
3292 vector vMSA = {0.,0.,0.};
3300 const double c0 = c_vec.
x;
3301 const double c2 = c_vec.
y;
3302 const double c4 = c_vec.
z;
3304 const double d0 = d_vec.
x;
3305 const double d2 = d_vec.
y;
3306 const double d4 = d_vec.
z;
3309 const double two_d0 = 2.0 * d0;
3312 const double sd = sqrt( fabs(d2*d2 - 4.0*d0*d4) );
3315 const double A_theta_L = 0.5 * ( (JNorm/LNorm) + (LNorm/JNorm) - (pPrec->
Spl2 / (JNorm * LNorm)) );
3318 const double B_theta_L = 0.5 * pPrec->
Spl2mSmi2 / (JNorm * LNorm);
3321 const double nc_num = 2.0*(d0 + d2 + d4);
3322 const double nc_denom = two_d0 + d2 + sd;
3325 const double nc = nc_num / nc_denom;
3326 const double nd = nc_denom / two_d0;
3328 const double sqrt_nc = sqrt(fabs(nc));
3329 const double sqrt_nd = sqrt(fabs(nd));
3337 const double tan_psi = tan(psi);
3338 const double atan_psi = atan(tan_psi);
3340 double C1,
C2, C2num, C2den;
3343 C1 = -0.5 * (
c0/d0 - 2.0*(
c0+
c2+c4)/nc_num);
3346 C2num =
c0*( -2.0*d0*d4 + d2*d2 + d2*d4 ) -
c2*d0*( d2 + 2.0*d4 ) + c4*d0*( two_d0 + d2 );
3347 C2den = 2.0 * d0 * sd * (d0 + d2 + d4);
3355 double phiz_0_MSA_Cphi_term, phiz_0_MSA_Dphi_term;
3361 phiz_0_MSA_Cphi_term = 0.0;
3365 if(pflag == 222 || pflag == 223)
3368 phiz_0_MSA_Cphi_term = fabs( (c4 * d0 * ((2*d0+d2) + sd) -
c2 * d0 * ((d2+2.*d4) - sd) -
c0 * ((2*d0*d4) - (d2+d4) * (d2 - sd))) / (C2den)) * (sqrt_nc / (nc - 1.) * (atan_psi - atan(sqrt_nc * tan_psi))) / psi_dot;
3373 phiz_0_MSA_Cphi_term = ( (Cphi / psi_dot) * sqrt_nc / (nc - 1.0) ) * atan( ( (1.0 - sqrt_nc) * tan_psi ) / ( 1.0 + (sqrt_nc * tan_psi * tan_psi) ) );
3381 phiz_0_MSA_Dphi_term = 0.0;
3385 if(pflag == 222 || pflag == 223)
3388 phiz_0_MSA_Dphi_term = fabs( (-c4 * d0 * ((2*d0+d2) - sd) +
c2 * d0 * ((d2+2.*d4) + sd) -
c0 * (-(2*d0*d4) + (d2+d4) * (d2 + sd)))) / (C2den) * (sqrt_nd / (nd - 1.) * (atan_psi - atan(sqrt_nd * tan_psi))) / psi_dot;
3393 phiz_0_MSA_Dphi_term = ( (Dphi / psi_dot) * sqrt_nd / (nd - 1.0) ) * atan( ( (1.0 - sqrt_nd) * tan_psi ) / ( 1.0 + (sqrt_nd * tan_psi * tan_psi) ) );
3398 vMSA.
x = ( phiz_0_MSA_Cphi_term + phiz_0_MSA_Dphi_term );
3403 if(pflag == 222 || pflag == 223 || pflag == 224)
3409 vMSA.
y = A_theta_L*vMSA.
x + 2.*B_theta_L*d0*(phiz_0_MSA_Cphi_term/(sd-d2) - phiz_0_MSA_Dphi_term/(sd+d2));
3414 vMSA.
y = ( ( A_theta_L * (Cphi + Dphi) ) + (2.0 * d0 * B_theta_L) * ( ( Cphi / (sd - d2) ) - ( Dphi / (sd + d2) ) ) ) / psi_dot;
3418 if (vMSA.
x != vMSA.
x) vMSA.
x = 0;
3419 if (vMSA.
y != vMSA.
y) vMSA.
y = 0;
3459 return (v1.
x*v2.
x) + (v1.
y*v2.
y) + (v1.
z*v2.
z);
3466 v3.
x = v1.
y*v2.
z - v1.
z*v2.
y;
3467 v3.
y = v1.
z*v2.
x - v1.
x*v2.
z;
3468 v3.
z = v1.
x*v2.
y - v1.
y*v2.
x;
3475 const double dot_product = (v1.
x*v1.
x) + (v1.
y*v1.
y) + (v1.
z*v1.
z);
3476 return sqrt(dot_product);
3510 const double rsinth = v1.
r * sin(v1.
theta);
3512 v2.
x = rsinth * cos(v1.
phi);
3513 v2.
y = rsinth * sin(v1.
phi);
3523 v2.
r = sqrt(v1.
x*v1.
x + v1.
y*v1.
y + v1.
z*v1.
z);
3535 v2.
x = v1.
x * cos(angle) - v1.
y * sin(angle);
3536 v2.
y = v1.
x * sin(angle) + v1.
y * cos(angle);
3547 v2.
x = + v1.
x * cos(angle) + v1.
z * sin(angle);
3549 v2.
z = - v1.
x * sin(angle) + v1.
z * cos(angle);
3562 REAL8 cosa=cos(angle), sina=sin(angle);
3565 REAL8 tmp2 = tmpx*sina + tmpy*cosa;
3579 REAL8 cosa=cos(angle), sina=sin(angle);
3582 REAL8 tmp2 = - tmpx*sina + tmpz*cosa;
3592 const REAL8 norm = sqrt(
x*
x +
y*
y + z*z);
3595 theta = acos(z / (norm + 1
e-16));
3613 const double rsintheta = mag * sin(
theta);
3615 v1.
x = rsintheta * cos(phi);
3616 v1.
y = rsintheta * sin(phi);
3629 memcpy(start->
data->
data + origlen -2,
end->data->data,
3630 (
end->data->length)*
sizeof(
REAL8));
3643 int success = GSL_SUCCESS;
3645 double ftrans = fmaxPN;
3646 double f1 = 0.97 *ftrans ;
3647 double f2 = 0.99 *ftrans ;
3648 double f1sq = f1*f1, f2sq = f2*f2;
3649 double f1cube = f1sq*f1;
3651 double alpha1, alpha2, dalpha1;
3653 success = gsl_spline_eval_e(&spline_alpha, f1, &accel_alpha,&alpha1);
3655 if(success != GSL_SUCCESS)
3661 success = success + gsl_spline_eval_deriv_e (&spline_alpha, f1, &accel_alpha,&dalpha1);
3663 if(success != GSL_SUCCESS)
3670 success = success + gsl_spline_eval_e (&spline_alpha, f2, &accel_alpha,&alpha2);
3672 if(success != GSL_SUCCESS)
3678 double aC=0., bC=0., cC=0.;
3680 if(success == GSL_SUCCESS){
3682 aC = (f1cube*(f1 - f2)*(f1 + f2)*dalpha1 + 2*(pow(f1,4) - 2*f1sq*f2sq)*alpha1 + 2*pow(f2,4)*alpha2)/(2.*pow(f1sq - f2sq,2));
3684 bC = (pow(f1,4)*f2sq*(f1*(f1 - f2)*(f1 + f2)*dalpha1 + 2*f2sq*(-alpha1 + alpha2)))/(2.*pow(f1sq - f2sq,2));
3686 cC = (f1sq*(f1*(-pow(f1,4) + pow(f2,4))*dalpha1 + 4*pow(f2,4)*(alpha1 - alpha2)))/(2.*pow(f1sq - f2sq,2));
3689 alpha_params->
aRD = aC;
3690 alpha_params->
bRD = bC;
3691 alpha_params->
cRD = cC;
3701 double Mf4 = Mf2*Mf2;
3702 double minalpha=alpha_params->
aRD + alpha_params->
bRD/Mf4 + alpha_params->
cRD/Mf2;
3711 double Mf3 = Mf2*Mf;
3712 double Mf5 = Mf2*Mf3;
3714 return (4.*alpha_params->
bRD/Mf5+2.*alpha_params->
cRD/Mf3);
3721 int success = GSL_SUCCESS;
3731 double f1 = 0.97 *fmaxPN ;
3732 double f2 = 0.98 *fmaxPN ;
3733 double f1sq = f1*f1, f2sq = f2*f2 ;
3734 double ef1 = exp(kappa*f1), ef2 = exp(kappa*f2);
3737 success = gsl_spline_eval_e(&spline_cosb, f1, &accel_cosb, &cosbeta1);
3740 success=gsl_spline_eval_deriv_e (&spline_cosb, f2, &accel_cosb,&dcosbeta2);
3743 success = gsl_spline_eval_e(&spline_cosb, f2, &accel_cosb,&cosbeta2);
3746 success = gsl_spline_eval_e(&spline_cosb, pPrec->
fmax_inspiral, &accel_cosb, &cosbetamax);
3750 if(fabs(cosbeta1)>1 || fabs(cosbeta2)>1 || fabs(cosbetamax)>1||success!=GSL_SUCCESS)
3758 success = GSL_SUCCESS;
3764 double beta1 = acos(cosbeta1);
3765 double beta2 = acos(cosbeta2);
3766 double sqrtarg = 1.-cosbeta2*cosbeta2;
3767 double dbeta2 = - dcosbeta2/sqrt((sqrtarg <= 0. ? 1. : sqrtarg));
3770 double off = (cosbetamax < 0. ?
LAL_PI : 0.);
3772 aC= (-(ef1*pow(f1,4)*(off - beta1)) + ef2*pow(f2,3)*(f2*(-f1 + f2)*dbeta2 + (-(f2*(3 + f2*kappa)) + f1*(4 + f2*kappa))*(off - beta2)))/pow(f1 - f2,2);
3774 bC =(2*ef1*pow(f1,4)*f2*(off - beta1) + ef2*pow(f2,3)*((f1 - f2)*f2*(f1 + f2)*dbeta2 - (-(f2sq*(2 + f2*kappa)) + f1sq*(4 + f2*kappa))*(off - beta2)))/pow(f1 - f2,2);
3776 cC =(-(ef1*pow(f1,4)*f2sq*(off - beta1)) + ef2*f1*pow(f2,4)*(f2*(-f1 + f2)*dbeta2 + (-(f2*(2 + f2*kappa)) + f1*(3 + f2*kappa))*(off - beta2)))/pow(f1 - f2,2);
3808 double Mf3 = Mf2* Mf;
3809 beta = exp(-Mf*kappa)/Mf*(beta_params->
aRD/Mf+beta_params->
bRD/(Mf2)+beta_params->
cRD/Mf3)+beta_params->
dRD;
3823 REAL8 Mf_high = Mf+deltaMf;
3824 REAL8 alphadoti, Mf_aux, gammai;
3825 REAL8 step = (Mf_high-Mf)*0.25;
3827 double alphadotcosbeta[5], cosbeta_aux[5];
3829 int status_alpha=GSL_SUCCESS, status_beta=GSL_SUCCESS;
3831 if(Mf<=pPrec->ftrans_MRD)
3833 for(
UINT4 jdx=0; jdx<5; jdx++){
3838 XLAL_CHECK(status_alpha == GSL_SUCCESS && status_beta==GSL_SUCCESS,
XLAL_EFUNC,
"Error in %s: could not evaluate splines for alpha and/or gamma angles.\n",__func__);
3839 alphadotcosbeta[jdx]=cosbeta_aux[jdx]*alphadoti;
3846 for(
UINT4 jdx=0; jdx<5; jdx++){
3851 alphadotcosbeta[jdx]=cosbeta_aux[jdx]*alphadoti;
3855 gammai= -2.*step/45.*(7.*alphadotcosbeta[0]+32.*alphadotcosbeta[1]+12.*alphadotcosbeta[2]+32.*alphadotcosbeta[3]+7.*alphadotcosbeta[4]);
3858 return(status_beta+status_alpha);
3888 size_t output_length = freqsIN->
length;
3898 REAL8 alphamin=0., cosbetamin=0.;
3901 if(
status != GSL_SUCCESS)
3903 XLALPrintError(
"Error in %s: could not evaluate alpha(f_min). Got alpha=%.4f \n",__func__,alphamin);
3907 if (
status != GSL_SUCCESS)
3908 {
XLALPrintError(
"Error in %s: could not evaluate cosbeta(f_min). Got cosbeta=%.4f \n",__func__,cosbetamin);
3929 (*gammaFS)->data[0] = 0.;
3930 (*alphaFS)->data[0] = alphamin-pPrec->
alpha_ref+alphaOff;
3931 (*cosbetaFS)->data[0] = cosbetamin;
3934 REAL8 alphai=0., cosbetai=0., gammai=0.;
3938 for(
UINT4 i = 1;
i < output_length;
i++ ){
3943 if(Mf<pPrec->ftrans_MRD)
3952 (*cosbetaFS)->data[
i] = cosbetai;
3953 (*gammaFS)->
data[
i] = gammai;
3964 (*cosbetaFS)->data[
i]=cos(beta_MRD);
3965 REAL8 deltagamma = 0.;
3968 (*gammaFS) ->
data[
i] = (*gammaFS)->
data[
i-1]+deltagamma;
3969 else (*gammaFS) ->
data[
i] = (*gammaFS)->
data[
i-1];
3975 (*alphaFS)->data[
i]=(*alphaFS)->data[
i-1];
3976 (*cosbetaFS)->data[
i]=(*cosbetaFS)->
data[
i-1];
3977 (*gammaFS) ->
data[
i]=(*gammaFS)->
data[
i-1];
4051 REAL8 deltaFv1= 1./
MAX(4.,pow(2, ceil(log(seglen)/log(2))));
4055 size_t iStart = (size_t) (fmin / deltaF);
4056 size_t iStop = (size_t) (fmax / deltaF) + 1;
4057 size_t output_length = iStop-iStart;
4060 XLALPrintError(
"Error in %s: no. of points is insufficient for spline interpolation of gamma",__func__);
4067 frequencies->
data[0]=Mfmin;
4071 gamma_array->
data[0]=0.;
4073 int gamma_status=GSL_SUCCESS;
4075 for(
UINT4 i = 1;
i < output_length;
i++ )
4079 frequencies->
data[
i]=Mf;
4080 REAL8 deltagamma=0.;
4082 if(Mf<pPrec->ftrans_MRD){
4084 gamma_array->
data[
i]=gamma_array->
data[
i-1]+deltagamma;
4089 gamma_array->
data[
i]=gamma_array->
data[
i-1]+deltagamma;
4097 if(gamma_status!=GSL_SUCCESS)
status=gamma_status;
4103 pPrec->
gamma_acc = gsl_interp_accel_alloc();
4104 pPrec->
gamma_spline = gsl_spline_alloc(gsl_interp_cspline, output_length);
4112 gsl_interp_accel_free(pPrec->
alpha_acc);
4159 REAL8 fgw_Mf, fgw_Hz, Mfmax_PN=0.;
4162 REAL8 LNhatx_temp,LNhaty_temp,LNhatz_temp;
4180 alphaaux->
data[
i] = atan2(LNhaty_temp, LNhatx_temp);
4181 cosbeta->
data[
i] = LNhatz_temp;
4182 fgw->
data[
i] = fgw_Mf;
4195 if(fmax_inspiral > pWF->
fRING-pWF->
fDAMP) fmax_inspiral = 1.020 * pWF->
fMECO;
4202 pPrec->
alpha_acc = gsl_interp_accel_alloc();
4203 pPrec->
alpha_spline = gsl_spline_alloc(gsl_interp_cspline, lenPN);
4208 if (
status != GSL_SUCCESS)
4210 XLALPrintError(
"Error in %s: error in computing gsl spline for alpha.\n",__func__);
4215 pPrec->
cosbeta_spline = gsl_spline_alloc(gsl_interp_cspline, lenPN);
4218 if (
status != GSL_SUCCESS)
4220 XLALPrintError(
"Error in %s: error in computing gsl spline for cos(beta).\n",__func__);
4226 if(
status != GSL_SUCCESS)
4228 XLALPrintError(
"Error in %s: error in computing cosbeta.\n",__func__);
4252 REAL8 chi_perp_norm = S_perp_norm *pow(m1 + m2,2)/pow(m1,2);
4295 if(
status != GSL_SUCCESS){
4299 gsl_interp_accel_free(pPrec->
alpha_acc);
4339 REAL8 s1x=chi1x, s1y=chi1y, s1z=chi1z;
4340 REAL8 s2x=chi2x, s2y=chi2y, s2z=chi2z;
4351 if (PrecVersion==311 || PrecVersion==321)
4364 if(lscorr!=0)
XLAL_PRINT_WARNING(
"IMRPhenomXP with SpinTaylor angles was only reviewed for lscorr=0.\n");
4390 REAL8 lnhatx,lnhaty,lnhatz, e1y,e1z,e1x;
4391 lnhatx = lnhaty = e1y = e1z = 0;
4396 if(approx_name==NULL)
4397 approx_name=
"SpinTaylorT4";
4405 if(fmin>fMECO_Hz &&(PrecVersion==320 || PrecVersion==321))
4416 REAL8 deltaT_coarse = 0.5*coarse_fac/(fCut);
4427 n=
XLALSimInspiralSpinTaylorPNEvolveOrbit(&
V, &Phi, &S1x, &S1y, &S1z, &S2x, &S2y, &S2z, &LNhatx, &LNhaty, &LNhatz, &E1x, &E1y, &E1z, deltaT_coarse, m1_SI, m2_SI,fS,fE,s1x,s1y,s1z,s2x,s2y,s2z,lnhatx,lnhaty,lnhatz,e1x,e1y,e1z,lambda1,lambda2,quadparam1, quadparam2, spinO, tideO, phaseO, lscorr, approx);
4440 &S1x, &S1y, &S1z, &S2x, &S2y, &S2z,
4441 &LNhatx, &LNhaty, &LNhatz, &E1x, &E1y, &E1z,
4442 deltaT_coarse, m1_SI, m2_SI, fS, fE, s1x, s1y, s1z, s2x, s2y,
4443 s2z, lnhatx, lnhaty, lnhatz, e1x, e1y, e1z, lambda1, lambda2,
4444 quadparam1, quadparam2, spinO, tideO, phaseO, lscorr, approx);
4450 if(
V->data->length>1){
4452 REAL8TimeSeries *V2=NULL, *Phi2=NULL, *S1x2=NULL, *S1y2=NULL, *S1z2=NULL, *S2x2=NULL, *S2y2=NULL, *S2z2=NULL;
4453 REAL8TimeSeries *LNhatx2=NULL, *LNhaty2=NULL, *LNhatz2=NULL, *E1x2=NULL, *E1y2=NULL, *E1z2=NULL;
4460 &S1x2, &S1y2, &S1z2, &S2x2, &S2y2, &S2z2,
4461 &LNhatx2, &LNhaty2, &LNhatz2, &E1x2, &E1y2, &E1z2,
4462 deltaT_coarse, m1_SI, m2_SI, fS, fE, s1x, s1y, s1z, s2x, s2y,
4463 s2z, lnhatx, lnhaty, lnhatz, e1x, e1y, e1z, lambda1, lambda2,
4464 quadparam1, quadparam2, spinO, tideO, phaseO, lscorr, approx);
4478 LNhatx =
appendTS(LNhatx, LNhatx2);
4479 LNhaty =
appendTS(LNhaty, LNhaty2);
4480 LNhatz =
appendTS(LNhatz, LNhatz2);
4521 int lenLow=
V->data->length;
4522 int nbuffer=
MIN(9,lenLow-1);
4524 if(lenLow-1-nbuffer<0) nbuffer=lenLow-1;
4526 copyLength=lenLow-1-nbuffer;
4528 REAL8 vtrans =
V->data->data[lenLow-1-nbuffer];
4529 REAL8 ftrans = pow(vtrans,3.)/piGM;
4535 REAL8 E1x_trans, E1y_trans, E1z_trans;
4536 E1x_trans = E1x->
data->
data[lenLow-1-nbuffer];
4537 E1y_trans = E1y->
data->
data[lenLow-1-nbuffer];
4538 E1z_trans = E1z->
data->
data[lenLow-1-nbuffer];
4540 REAL8 S1x_trans, S1y_trans, S1z_trans, S2x_trans, S2y_trans, S2z_trans;
4541 S1x_trans = S1x->
data->
data[lenLow-1-nbuffer];
4542 S1y_trans = S1y->
data->
data[lenLow-1-nbuffer];
4543 S1z_trans = S1z->
data->
data[lenLow-1-nbuffer];
4545 S2x_trans = S2x->
data->
data[lenLow-1-nbuffer];
4546 S2y_trans = S2y->
data->
data[lenLow-1-nbuffer];
4547 S2z_trans = S2z->
data->
data[lenLow-1-nbuffer];
4553 XLAL_CHECK(fS > 0.,
XLAL_EFUNC,
"Error: Transition frequency in PN integration is not positive.\n");
4555 REAL8TimeSeries *Phi_PN=NULL, *E1x_PN=NULL, *E1y_PN=NULL, *E1z_PN=NULL;
4557 n=
XLALSimInspiralSpinTaylorPNEvolveOrbit(&arrays->
V_PN, &Phi_PN, &arrays->
S1x_PN, &arrays->
S1y_PN, &arrays->
S1z_PN, &arrays->
S2x_PN, &arrays->
S2y_PN, &arrays->
S2z_PN, &arrays->
LNhatx_PN, &arrays->
LNhaty_PN, &arrays->
LNhatz_PN, &E1x_PN, &E1y_PN, &E1z_PN,
deltaT, m1_SI, m2_SI,fS,fE,S1x_trans,S1y_trans,S1z_trans,S2x_trans,S2y_trans,S2z_trans,LNhatx_trans,LNhaty_trans,LNhatz_trans,E1x_trans, E1y_trans, E1z_trans,lambda1,lambda2,quadparam1, quadparam2, spinO, tideO, phaseO, lscorr, approx);
4571 XLALPrintError(
"Error in %s: no. of points is insufficient for spline interpolation",__func__);
4591 copyLength=
V->data->length-1;
4592 if(copyLength < 4) {
4593 XLALPrintError(
"Error in %s: no. of points is insufficient for spline interpolation",__func__);
4679 XLAL_CHECK(fminAngles > 0.,
XLAL_EFUNC,
"Error - %s: fMin is too low and numerical angles could not be computed.\n",__func__);
4736 if(fRef < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef must be positive or set to 0 to ignore.\n"); }
4742 if(fRef > 0.0 && fRef < fmin){
XLAL_ERROR(
XLAL_EDOM,
"fRef must be >= fmin or =0 to use fmin.\n"); }
4745 size_t iStart = (size_t) (fmin / deltaF);
4746 size_t iStop = (size_t) (fmax / deltaF) + 1;
4747 size_t output_length = iStop-iStart;
4755 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, s1z, s2z, deltaF, fRef, phiRef, fmin, fmax, 1e6*
LAL_PC_SI, 0., LALparams, 0);
4761 status =
IMRPhenomXGetAndSetPrecessionVariables(pWF,pPrec,m1_SI,m2_SI,s1x,s1y,s1z,s2x,s2y,s2z,LALparams,0);
4771 REAL8 alphamin=0., cosbetamin=0.;
4802 (*gammaFS)->data[0] = 0.;
4803 (*alphaFS)->data[0] = alphamin-pPrec->
alpha_ref+alphaOff;
4804 (*cosbetaFS)->data[0] = cosbetamin;
4807 REAL8 alphai=0., cosbetai=0., gammai=0.;
4811 frequencies->
data[0]=Mfmin;
4813 for(
UINT4 i = 1;
i < output_length;
i++ ){
4816 frequencies->
data[
i]=Mf;
4817 REAL8 deltagamma=0.;
4819 if(Mf<pPrec->ftrans_MRD)
4829 gammai=(*gammaFS)->data[
i-1]+deltagamma;
4832 (*cosbetaFS)->data[
i] = cosbetai;
4833 (*gammaFS)->
data[
i] = gammai;
4845 (*cosbetaFS)->data[
i]=cos(beta_MRD);
4849 gammai=(*gammaFS)->data[
i-1]+deltagamma;
4850 (*gammaFS)->
data[
i] =gammai;
4857 (*alphaFS)->data[
i]=(*alphaFS)->data[
i-1];
4858 (*cosbetaFS)->data[
i]=(*cosbetaFS)->
data[
i-1];
4859 (*gammaFS) ->
data[
i]=(*gammaFS)->
data[
i-1];
4867 pPrec->
gamma_acc = gsl_interp_accel_alloc();
4868 pPrec->
gamma_spline = gsl_spline_alloc(gsl_interp_cspline, output_length);
4878 gsl_interp_accel_free(pPrec->
alpha_acc);
4884 gsl_interp_accel_free(pPrec->
gamma_acc);
4903 int nmodes=modeseq->
length/2;
4904 float M_MAX=1., M_MIN=4.;
4905 for(
int jj=0; jj<nmodes; jj++)
4907 if(modeseq->
data[2*jj+1]>M_MAX) M_MAX=(float)(modeseq->
data[2*jj+1]);
4908 if(abs(modeseq->
data[2*jj+1])<M_MIN) M_MIN=(
float)abs(modeseq->
data[2*jj+1]);
4934 double cBetah = 0.0;
4935 double sBetah = 0.0;
4946 const REAL8 cBetah2 = cBetah * cBetah;
4947 const REAL8 cBetah3 = cBetah * cBetah2;
4948 const REAL8 cBetah4 = cBetah * cBetah3;
4949 const REAL8 sBetah2 = sBetah * sBetah;
4950 const REAL8 sBetah3 = sBetah * sBetah2;
4951 const REAL8 sBetah4 = sBetah * sBetah3;
4959 const COMPLEX16 d22[5] = {sBetah4, 2.0*cBetah*sBetah3, pPrec->
sqrt6*sBetah2*cBetah2, 2.0*cBetah3*sBetah, cBetah4};
4962 const COMPLEX16 d2m2[5] = {d22[4], -d22[3], d22[2], -d22[1], d22[0]};
4968 COMPLEX16 cexp_2i_alpha = cexp_i_alpha * cexp_i_alpha;
4969 COMPLEX16 cexp_mi_alpha = 1.0 / cexp_i_alpha;
4970 COMPLEX16 cexp_m2i_alpha = cexp_mi_alpha * cexp_mi_alpha;
4971 COMPLEX16 cexp_im_alpha_l2[5] = {cexp_m2i_alpha, cexp_mi_alpha, 1.0, cexp_i_alpha, cexp_2i_alpha};
4977 for(
int m=-2;
m<=2;
m++)
4980 COMPLEX16 A2m2emm = cexp_im_alpha_l2[-
m+2] * d2m2[
m+2] * Y2mA[
m+2];
4981 COMPLEX16 A22emmstar = cexp_im_alpha_l2[
m+2] * d22[
m+2] * conj(Y2mA[
m+2]);
4982 hp_sum += A2m2emm + A22emmstar;
4983 hc_sum += I*(A2m2emm - A22emmstar);
4987 COMPLEX16 eps_phase_hP = cexp(-2.0*I*epsilon) * hAS / 2.0;
4990 *hp = eps_phase_hP * hp_sum;
4991 *hc = eps_phase_hP * hc_sum;
static double fdamp(double eta, double chi1, double chi2, double finspin)
fdamp is the complex part of the ringdown frequency 1508.07250 figure 9
#define MAX_TOL_ATAN
Tolerance used below which numbers are treated as zero for the calculation of atan2.
static double evaluate_QNMfit_fdamp22(double finalDimlessSpin)
static double evaluate_QNMfit_fring22(double finalDimlessSpin)
static double evaluate_QNMfit_fring21(double finalDimlessSpin)
static double double delta
IMRPhenomX_UsefulPowers powers_of_lalpi
REAL8 IMRPhenomX_PNR_GenerateRingdownPNRBeta(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
We evaluate beta at the final Mf_beta_upper connection frequency to approximate the final value of be...
INT4 IMRPhenomX_PNR_GetAndSetCoPrecParams(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, LALDict *lalParams)
INT4 IMRPhenomX_PNR_GetAndSetPNRVariables(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
This function computes the required single-spin quantities used to parameterize the MR tuned function...
int IMRPhenomXSetWaveformVariables(IMRPhenomXWaveformStruct *wf, const REAL8 m1_SI, const REAL8 m2_SI, const REAL8 chi1L_In, const REAL8 chi2L_In, const REAL8 deltaF, const REAL8 fRef, const REAL8 phi0, const REAL8 f_min, const REAL8 f_max, const REAL8 distance, const REAL8 inclination, LALDict *LALParams, UNUSED const UINT4 debug)
double IMRPhenomX_psiofv(const double v, const double v2, const double psi0, const double psi1, const double psi2, const IMRPhenomXPrecessionStruct *pPrec)
double IMRPhenomX_Return_Psi_MSA(double v, double v2, const IMRPhenomXPrecessionStruct *pPrec)
Get using Eq 51 of Chatziioannou et al, PRD 95, 104004, (2017), arXiv:1703.03967:
double IMRPhenomX_Get_PN_tau(const double a, const double b, const IMRPhenomXPrecessionStruct *pPrec)
Internal function to computes PN spin-spin couplings.
vector IMRPhenomX_vector_PolarToCartesian(const sphpolvector v1)
double dalphaMRD(double Mf, PhenomXPalphaMRD *alpha_params)
int betaMRD_coeff(gsl_spline spline_cosb, gsl_interp_accel accel_cosb, double fmaxPN, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
Function to determine coefficients of analytical continuation of beta through MRD.
vector IMRPhenomX_vector_sum(const vector v1, const vector v2)
int IMRPhenomX_SpinTaylorAnglesSplinesAll(REAL8 fmin, REAL8 fmax, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, LALDict *LALparams)
This function builds and stores splines for and in the frequency range covered by PN,...
vector IMRPhenomX_vector_cross_product(const vector v1, const vector v2)
double IMRPhenomX_Return_Psi_dot_MSA(const double v, const IMRPhenomXPrecessionStruct *pPrec)
Get using Eq 24 of Chatziioannou et al, PRD 95, 104004, (2017), arXiv:1703.03967:
vector IMRPhenomX_Return_MSA_Corrections_MSA(double v, double LNorm, double JNorm, const IMRPhenomXPrecessionStruct *pPrec)
sphpolvector IMRPhenomX_vector_CartesianToPolar(const vector v1)
vector IMRPhenomX_Return_Spin_Evolution_Coefficients_MSA(const double LNorm, const double JNorm, const IMRPhenomXPrecessionStruct *pPrec)
Get coefficients for Eq 21 of Chatziioannou et al, PRD 95, 104004, (2017), arXiv:1703....
double IMRPhenomX_Get_PN_beta(const double a, const double b, const IMRPhenomXPrecessionStruct *pPrec)
Internal function to computes the PN spin-orbit couplings.
int IMRPhenomXPSpinTaylorAnglesIMR(REAL8Sequence **alphaFS, REAL8Sequence **cosbetaFS, REAL8Sequence **gammaFS, REAL8Sequence *freqsIN, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, LALDict *LALparams)
This function evaluates the SpinTaylor Euler angles on a frequency grid passed by the user.
int IMRPhenomX_InterpolateGamma_SpinTaylor(REAL8 fmin, REAL8 fmax, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
This function computes gamma from the minimal rotation condition and stores a spline for it.
double IMRPhenomX_Return_zeta_MSA(const double v, const IMRPhenomXPrecessionStruct *pPrec)
Get using Eq F5 in Appendix F of Chatziioannou et al, PRD 95, 104004, (2017):
vector IMRPhenomX_Return_Constants_d_MSA(const double LNorm, const double JNorm, const IMRPhenomXPrecessionStruct *pPrec)
Get d constants from Appendix B (B9, B10, B11) of Chatziioannou et al, PRD 95, 104004,...
int IMRPhenomX_Initialize_MSA_System(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, int ExpansionOrder)
This function initializes all the core variables required for the MSA system.
vector IMRPhenomX_Return_Roots_MSA(double LNorm, double JNorm, const IMRPhenomXPrecessionStruct *pPrec)
Here we solve for the roots of Eq 21 in Chatziioannou et al, PRD 95, 104004, (2017),...
int IMRPhenomXPTwistUp22(const REAL8 Mf, const COMPLEX16 hAS, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, COMPLEX16 *hp, COMPLEX16 *hc)
Core twisting up routine, see Section III A of arXiv:2004.06503.
REAL8 XLALSimIMRPhenomXPNEuleralphaNNLO(const REAL8 f, const REAL8 eta, const REAL8 chi1L, const REAL8 chi2L, const REAL8 chip, const REAL8 alpha0)
External wrapper function to next-to-next-to-leading (NNLO) in spin-orbit expression for the PN Euler...
double IMRPhenomX_PN_Euler_epsilon_NNLO(IMRPhenomXPrecessionStruct *pPrec, const double omega, const double omega_cbrt2, const double omega_cbrt, const double logomega)
Internal function to calculate epsilon using pre-cached NNLO PN expressions.
double IMRPhenomX_vector_L2_norm(const vector v1)
REAL8 XLALSimIMRPhenomXLPNAnsatz(REAL8 v, REAL8 LNorm, REAL8 L0, REAL8 L1, REAL8 L2, REAL8 L3, REAL8 L4, REAL8 L5, REAL8 L6, REAL8 L7, REAL8 L8, REAL8 L8L)
This is a convenient wrapper function for PN orbital angular momentum.
double IMRPhenomX_Return_SNorm_MSA(const double v, IMRPhenomXPrecessionStruct *pPrec)
Get norm of S, see PRD 95, 104004, (2017)
vector IMRPhenomX_vector_PolarToCartesian_components(const REAL8 mag, const REAL8 theta, const REAL8 phi)
int IMRPhenomX_InterpolateAlphaBeta_SpinTaylor(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, LALDict *LALparams)
This function computes cubic splines of the alpha and beta inspiral Euler angles, which are then stor...
double IMRPhenomX_PN_Euler_alpha_NNLO(IMRPhenomXPrecessionStruct *pPrec, const double omega, const double omega_cbrt2, const double omega_cbrt, const double logomega)
Internal function to calculate alpha using pre-cached NNLO PN expressions.
INT4 IMRPhenomX_SetPrecessingRemnantParams(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, LALDict *lalParams)
void IMRPhenomX_GetandSetModes(LALValue *ModeArray, IMRPhenomXPrecessionStruct *pPrec)
REAL8 XLALSimIMRPhenomXL2PNNS(const REAL8 v, const REAL8 eta)
2PN non-spinning orbital angular momentum as a function of x = v^2 = (Pi M f)^{2/3}
int IMRPhenomXWignerdCoefficients(REAL8 *cos_beta_half, REAL8 *sin_beta_half, const REAL8 v, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
REAL8 XLALSimIMRPhenomXL4PNAS(const REAL8 v, const REAL8 eta, const REAL8 chi1L, const REAL8 chi2L, const REAL8 delta)
4PN orbital angular momentum as a function of x = v^2 = (Pi M f)^{2/3}
void IMRPhenomX_rotate_y(REAL8 angle, REAL8 *vx, REAL8 *vy, REAL8 *vz)
Function to rotate vector about y axis by given angle.
vector IMRPhenomX_vector_rotate_z(const REAL8 angle, const vector v1)
Function to rotate vector about z axis by given angle.
int gamma_from_alpha_cosbeta(double *gamma, double Mf, double deltaMf, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
vector IMRPhenomX_vector_scalar(const vector v1, const double a)
vector IMRPhenomX_vector_diff(const vector v1, const vector v2)
vector IMRPhenomX_Return_phi_zeta_costhetaL_MSA(const double v, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
Wrapper to generate , and at a given frequency.
void IMRPhenomX_rotate_z(const REAL8 angle, REAL8 *vx, REAL8 *vy, REAL8 *vz)
Function to rotate vector about z axis by given angle.
REAL8 XLALSimIMRPhenomXL4PNLOSIAS(const REAL8 v, const REAL8 eta, const REAL8 chi1L, const REAL8 chi2L, const REAL8 delta)
4PN orbital angular momentum as a function of x = v^2 = (Pi M f)^{2/3}
double alphaMRD(double Mf, PhenomXPalphaMRD *alpha_params)
int IMRPhenomXPTwistUp22_NumericalAngles(const COMPLEX16 hAS, REAL8 alpha, REAL8 cos_beta, REAL8 gamma, IMRPhenomXPrecessionStruct *pPrec, COMPLEX16 *hp, COMPLEX16 *hc)
Core twisting up routine for SpinTaylor angles.
int IMRPhenomXPCheckMaxOpeningAngle(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
Helper function to check if maximum opening angle > pi/2 or pi/4 and issues a warning.
double IMRPhenomX_Get_PN_sigma(const double a, const double b, const IMRPhenomXPrecessionStruct *pPrec)
Internal function to compute PN spin-spin couplings.
int alphaMRD_coeff(gsl_spline spline_alpha, gsl_interp_accel accel_alpha, double fmaxPN, IMRPhenomXWaveformStruct *pWF, PhenomXPalphaMRD *alpha_params)
Analytical continuation for alpha angle in MRD.
REAL8 IMRPhenomX_Cartesian_to_SphericalPolar_theta(const double x, const double y, const UNUSED double z)
double IMRPhenomX_L_norm_3PN_of_v(const double v, const double v2, const double L_norm, IMRPhenomXPrecessionStruct *pPrec)
Returns the 3PN accurate orbital angular momentum as implemented in LALSimInspiralFDPrecAngles_intern...
REAL8 XLALSimIMRPhenomXL3PNAS(const REAL8 v, const REAL8 eta, const REAL8 chi1L, const REAL8 chi2L, const REAL8 delta)
3PN orbital angular momentum as a function of x = v^2 = (Pi M f)^{2/3}
double IMRPhenomX_costhetaLJ(const double L_norm, const double J_norm, const double S_norm)
Calculate (L dot J)
int IMRPhenomX_Initialize_Euler_Angles(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, LALDict *lalParams)
Wrapper of IMRPhenomX_SpinTaylorAnglesSplinesAll: fmin and fmax are determined by the function based ...
REAL8 IMRPhenomX_Cartesian_to_SphericalPolar_phi(const double x, const double y, const UNUSED double z)
vector IMRPhenomX_vector_rotate_y(const REAL8 angle, const vector v1)
Function to rotate vector about y axis by given angle.
REAL8 XLALSimIMRPhenomXPNEulerepsilonNNLO(REAL8 f, REAL8 eta, REAL8 chi1L, REAL8 chi2L, REAL8 chip, REAL8 epsilon0)
External wrapper to NNLO PN epsilon angle.
static REAL8TimeSeries * appendTS(REAL8TimeSeries *start, REAL8TimeSeries *end)
used in numerical evaluation of Euler angles
vector IMRPhenomX_Return_Constants_c_MSA(const double v, const double JNorm, const IMRPhenomXPrecessionStruct *pPrec)
Get c constants from Appendix B (B6, B7, B8) of Chatziioannou et al, PRD 95, 104004,...
double IMRPhenomX_JNorm_MSA(const double LNorm, IMRPhenomXPrecessionStruct *pPrec)
Get norm of J using Eq 41 of Chatziioannou et al, PRD 95, 104004, (2017)
int IMRPhenomX_InspiralAngles_SpinTaylor(PhenomXPInspiralArrays *arrays, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, REAL8 fmin, int PrecVersion, IMRPhenomXWaveformStruct *pWF, LALDict *LALparams)
Wrapper of XLALSimInspiralSpinTaylorPNEvolveOrbit : if integration is successful, stores arrays conta...
double IMRPhenomX_Return_phiz_MSA(const double v, const double JNorm, const IMRPhenomXPrecessionStruct *pPrec)
Get using Eq 66 of Chatziioannou et al, PRD 95, 104004, (2017), arXiv:1703.03967:
double IMRPhenomX_vector_dot_product(const vector v1, const vector v2)
void Get_alphaepsilon_atfref(REAL8 *alpha_offset, REAL8 *epsilon_offset, UINT4 mprime, IMRPhenomXPrecessionStruct *pPrec, IMRPhenomXWaveformStruct *pWF)
Get alpha and epsilon offset depending of the mprime (second index of the non-precessing mode)
int IMRPhenomXWignerdCoefficients_cosbeta(REAL8 *cos_beta_half, REAL8 *sin_beta_half, const REAL8 cos_beta)
int IMRPhenomXGetAndSetPrecessionVariables(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, LALDict *lalParams, INT4 debug_flag)
Function to populate the IMRPhenomXPrecessionStruct:
int XLALSimIMRPhenomXPSpinTaylorAngles(REAL8Sequence **alphaFS, REAL8Sequence **cosbetaFS, REAL8Sequence **gammaFS, REAL8 m1_SI, REAL8 m2_SI, REAL8 s1x, REAL8 s1y, REAL8 s1z, REAL8 s2x, REAL8 s2y, REAL8 s2z, REAL8 fmin, REAL8 fmax, REAL8 deltaF, REAL8 fRef, REAL8 phiRef, LALDict *LALparams)
XLAL function that evaluates the SpinTaylor Euler angles on a frequency grid passed by the user.
double betaMRD(double Mf, UNUSED IMRPhenomXWaveformStruct *pWF, PhenomXPbetaMRD *beta_params)
void IMRPhenomXHM_Initialize_QNMs(QNMFits *qnms)
void XLALSimIMRPhenomXUnwrapArray(double *in, double *out, int len)
Function to unwrap a time series that contains an angle, to obtain a continuous time series.
INT4 XLALIMRPhenomXPCheckMassesAndSpins(REAL8 *m1, REAL8 *m2, REAL8 *chi1x, REAL8 *chi1y, REAL8 *chi1z, REAL8 *chi2x, REAL8 *chi2y, REAL8 *chi2z)
Check if m1 > m2.
REAL8 XLALSimIMRPhenomXFinalSpin2017(REAL8 eta, REAL8 chi1L, REAL8 chi2L)
Final Dimensionless Spin, X Jimenez-Forteza et al, PRD, 95, 064024, (2017), arXiv:1611....
REAL8 XLALSimIMRPhenomXatan2tol(REAL8 a, REAL8 b, REAL8 tol)
REAL8 XLALSimIMRPhenomXUtilsHztoMf(REAL8 fHz, REAL8 Mtot_Msun)
Convert from frequency in Hz to geometric frequency.
REAL8 XLALSimIMRPhenomXUtilsMftoHz(REAL8 Mf, REAL8 Mtot_Msun)
Convert from geometric frequency to Hz.
REAL8 XLALSimIMRPhenomXPrecessingFinalSpin2017(const REAL8 eta, const REAL8 chi1L, const REAL8 chi2L, const REAL8 chi_inplane)
Wrapper for the final spin in generically precessing binary black holes.
REAL8 XLALSimInspiralChirpTimeBound(REAL8 fstart, REAL8 m1, REAL8 m2, REAL8 s1, REAL8 s2)
Routine to compute an overestimate of the inspiral time from a given frequency.
int XLALSimInspiralGetApproximantFromString(const char *waveform)
Parses a waveform string to determine approximant.
static double beta(const double a, const double b, const sysq *system)
Internal function that computes the spin-orbit couplings.
static REAL8 UNUSED C2(REAL8 e0, REAL8 f0)
static REAL8 UNUSED C1(REAL8 Mtotal)
void XLALDestroyValue(LALValue *value)
void * XLALMalloc(size_t n)
Approximant
Enum that specifies the PN approximant to be used in computing the waveform.
int XLALSimInspiralSpinTaylorPNEvolveOrbit(REAL8TimeSeries **V, REAL8TimeSeries **Phi, REAL8TimeSeries **S1x, REAL8TimeSeries **S1y, REAL8TimeSeries **S1z, REAL8TimeSeries **S2x, REAL8TimeSeries **S2y, REAL8TimeSeries **S2z, REAL8TimeSeries **LNhatx, REAL8TimeSeries **LNhaty, REAL8TimeSeries **LNhatz, REAL8TimeSeries **E1x, REAL8TimeSeries **E1y, REAL8TimeSeries **E1z, REAL8 deltaT, REAL8 m1, REAL8 m2, REAL8 fStart, REAL8 fEnd, REAL8 s1x, REAL8 s1y, REAL8 s1z, REAL8 s2x, REAL8 s2y, REAL8 s2z, REAL8 lnhatx, REAL8 lnhaty, REAL8 lnhatz, REAL8 e1x, REAL8 e1y, REAL8 e1z, REAL8 lambda1, REAL8 lambda2, REAL8 quadparam1, REAL8 quadparam2, LALSimInspiralSpinOrder spinO, LALSimInspiralTidalOrder tideO, INT4 phaseO, INT4 lscorr, Approximant approx)
This function evolves the orbital equations for a precessing binary using the "TaylorT1/T5/T4" approx...
void XLALDestroyINT2Sequence(INT2Sequence *sequence)
void XLALDestroyREAL8Sequence(REAL8Sequence *sequence)
REAL8Sequence * XLALCreateREAL8Sequence(size_t length)
COMPLEX16 XLALSpinWeightedSphericalHarmonic(REAL8 theta, REAL8 phi, int s, int l, int m)
REAL8TimeSeries * XLALResizeREAL8TimeSeries(REAL8TimeSeries *series, int first, size_t length)
REAL8TimeSeries * XLALCreateREAL8TimeSeries(const CHAR *name, const LIGOTimeGPS *epoch, REAL8 f0, REAL8 deltaT, const LALUnit *sampleUnits, size_t length)
void XLALDestroyREAL8TimeSeries(REAL8TimeSeries *series)
const LALUnit lalDimensionlessUnit
#define XLAL_CHECK(assertion,...)
#define XLAL_PRINT_WARNING(...)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
LIGOTimeGPS * XLALGPSAdd(LIGOTimeGPS *epoch, REAL8 dt)
REAL8 epsilon_offset_3
offset passed to modes.
gsl_interp_accel * gamma_acc
REAL8 Ny_Sf
Line-of-sight vector component in L frame.
vector S_0
Initial value for .
PhenomXPbetaMRD * beta_params
Parameters needed for analytical MRD continuation of cosbeta.
REAL8 PNR_q_window_lower
Boundary values for PNR angle transition window.
REAL8 zeta_0
Initial value of .
INT4 ExpansionOrder
Flag to control expansion order of MSA system of equations.
REAL8 QArunz_Jf
Component of triad basis vector Q in J frame, arXiv:0810.5336.
vector J_0
Initial value for .
REAL8 S2L_pav
Precession averaged coupling , Eq.
REAL8 QAruny_Jf
Component of triad basis vector Q in J frame, arXiv:0810.5336.
INT4 IMRPhenomXReturnCoPrec
REAL8 psi1
as defined in Eq.
REAL8 alpha_offset_4
offset passed to modes.
vector S1_0
Initial value for .
gsl_spline * gamma_spline
REAL8 epsilon3
Coefficient of .
REAL8 zeta_polarization
Angle to rotate the polarizations.
REAL8 v_0
Orbital velocity at reference frequency, .
REAL8 A2
Mass weighted pre-factor, see Eq.
REAL8 phiJ_Sf
Azimuthal angle of in the L frame.
REAL8 thetaJ_Sf
Angle between and (z-direction)
REAL8 PNR_HM_Mflow
Mf_alpha_lower stored from alphaParams struct, 2 A4 / 7 from arXiv:2107.08876.
REAL8 cosbeta_ftrans
Record value of cosbeta at end of inspiral, used in IMRPhenomXPHMTwistUp and IMRPhenomXPHMTwistUpOneM...
REAL8 alpha_ftrans
Record value of alpha at end of inspiral, used in IMRPhenomXPHMTwistUp and IMRPhenomXPHMTwistUpOneMod...
vector L_0
Initial value for .
INT4 MBandPrecVersion
Flag to control multibanding for Euler angles.
REAL8 thetaJN
Angle between J0 and line of sight (z-direction)
REAL8 alpha_offset_3
offset passed to modes.
REAL8 epsilon5
Coefficient of .
REAL8 epsilon_offset_4
offset passed to modes.
REAL8 epsilon1
Coefficient of .
REAL8 alpha_offset_1
offset passed to modes.
REAL8 Spl2
Largest root of polynomial , Eq.
REAL8 Ny_Jf
Line-of-sight vector component in J frame.
REAL8 costheta_singleSpin
Polar angle of effective single spin, Eq.
REAL8 PArunz_Jf
Component of triad basis vector P in J frame, arXiv:0810.5336.
INT4 IMRPhenomXPNRUseTunedAngles
REAL8 S2Lsq_pav
Precession averaged coupling , Eq.
REAL8 Xx_Sf
Component of triad basis vector X in L frame.
REAL8 S32
Third root of polynomial , Eq.
REAL8 IMRPhenomXPNRInterpTolerance
IMRPhenomXWaveformStruct * pWF22AS
REAL8 gamma_ftrans
Record value of gamma at end of inspiral, used in IMRPhenomXPHMTwistUp and IMRPhenomXPHMTwistUpOneMod...
REAL8 PArunx_Jf
Component of triad basis vector P in J frame, arXiv:0810.5336.
REAL8 alpha3
Coefficient of .
REAL8 epsilon_offset
Offset for .
REAL8 Nx_Jf
Line-of-sight vector component in J frame.
gsl_interp_accel * alpha_acc
REAL8 QArunx_Jf
Component of triad basis vector Q in J frame, arXiv:0810.5336.
INT4 IMRPhenomXPrecVersion
Flag to set version of Euler angles used.
REAL8 psi2
as defined in Eq.
REAL8 epsilon4L
Coefficient of .
INT4 IMRPhenomXPNRUseTunedCoprec
vector S2_0
Initial value for .
REAL8 Smi2
Smallest root of polynomial , Eq.
REAL8 alpha_offset
Offset for .
INT4 debug_prec
Set debugging level.
REAL8 epsilon0
Coefficient of .
REAL8 SAv
as defined in Eq.
REAL8 Nz_Jf
Line-of-sight vector component in LJ frame.
REAL8 epsilon2
Coefficient of .
INT4 MSA_ERROR
Flag to track errors in initialization of MSA system.
REAL8 alpha0
Coefficient of .
REAL8 chi_singleSpin_antisymmetric
magnitude of effective single spin of a two spin system for the antisymmetric waveform
REAL8 PAruny_Jf
Component of triad basis vector P in J frame, arXiv:0810.5336.
REAL8 alpha1
Coefficient of .
INT4 IMRPhenomXAntisymmetricWaveform
REAL8 Nz_Sf
Line-of-sight vector component in L frame.
PhenomXPalphaMRD * alpha_params
Parameters needed for analytical MRD continuation of alpha.
REAL8 S1S2_pav
Precession averaged coupling , Eq.
gsl_spline * alpha_spline
REAL8 S1Lsq_pav
Precession averaged coupling , Eq.
REAL8 Xy_Sf
Component of triad basis vector X in L frame.
REAL8 chi_singleSpin
Magnitude of effective single spin used for tapering two-spin angles, Eq.
REAL8 PolarizationSymmetry
REAL8 theta_antisymmetric
Polar angle effective single spin for antisymmetric waveform.
REAL8 epsilon_offset_1
offset passed to modes.
REAL8 alpha4L
Coefficient of .
PhenomXPInspiralArrays * PNarrays
gsl_interp_accel * cosbeta_acc
REAL8 phiz_0
Initial value of .
REAL8 A1
Mass weighted pre-factor, see Eq.
gsl_spline * cosbeta_spline
REAL8 phi0_aligned
Initial phase to feed the underlying aligned-spin model.
REAL8 v_0_2
Orbital velocity at reference frequency squared, .
REAL8 PNR_chi_window_lower
REAL8 PNR_chi_window_upper
REAL8 alpha5
Coefficient of .
REAL8 Xz_Sf
Component of triad basis vector X in L frame.
REAL8 alpha2
Coefficient of .
REAL8 Nx_Sf
Line-of-sight vector component in L frame.
REAL8 PNR_HM_Mfhigh
Mf_beta_lower stored from betaParams struct, Eq.
REAL8 S1LS2L_pav
Precession averaged coupling , Eq.
REAL8 S1L_pav
Precession averaged coupling , Eq.
REAL8 costheta_final_singleSpin
Polar angle of approximate final spin, see technical document FIXME: add reference.
INT4 IMRPhenomXPNRUseInputCoprecDeviations
REAL8TimeSeries * LNhatx_PN
REAL8TimeSeries * LNhatz_PN
REAL8TimeSeries * LNhaty_PN
fitQNM_fdamp fdamp_lm[N_HIGHERMODES_IMPLEMENTED]