29#include <gsl/gsl_sf_elljac.h>
30#include <gsl/gsl_sf_ellint.h>
32#include <lal/SphericalHarmonics.h>
42#include <lal/LALAdaptiveRungeKuttaIntegrator.h>
44#define MIN(a,b) (((a)<(b))?(a):(b))
45#define MAX(a,b) (((a)>(b))?(a):(b))
87 pPrec->
sqrt2 = 1.4142135623730951;
88 pPrec->
sqrt5 = 2.23606797749978981;
89 pPrec->
sqrt6 = 2.44948974278317788;
90 pPrec->
sqrt7 = 2.64575131106459072;
91 pPrec->
sqrt10 = 3.16227766016838;
92 pPrec->
sqrt14 = 3.74165738677394133;
93 pPrec->
sqrt15 = 3.87298334620741702;
94 pPrec->
sqrt70 = 8.36660026534075563;
95 pPrec->
sqrt30 = 5.477225575051661;
96 pPrec->
sqrt2p5 = 1.58113883008419;
107 REAL8 chi_in_plane = sqrt(chi1x*chi1x+chi1y*chi1y+chi2x*chi2x+chi2y*chi2y);
109 if(chi_in_plane<1e-6 && pPrec->IMRPhenomXPrecVersion==330)
149 const REAL8 M = (m1 + m2);
152 const REAL8 m1_2 = m1 * m1;
153 const REAL8 m1_3 = m1 * m1_2;
154 const REAL8 m1_4 = m1 * m1_3;
155 const REAL8 m1_5 = m1 * m1_4;
156 const REAL8 m1_6 = m1 * m1_5;
157 const REAL8 m1_7 = m1 * m1_6;
158 const REAL8 m1_8 = m1 * m1_7;
160 const REAL8 m2_2 = m2 * m2;
170 const REAL8 eta2 = eta*eta;
171 const REAL8 eta3 = eta*eta2;
172 const REAL8 eta4 = eta*eta3;
173 const REAL8 eta5 = eta*eta4;
174 const REAL8 eta6 = eta*eta5;
187 pPrec->
inveta = 1.0 / eta;
199 pPrec->
chi1x = chi1x;
200 pPrec->
chi1y = chi1y;
201 pPrec->
chi1z = chi1z;
202 pPrec->
chi1_norm = sqrt(chi1x*chi1x + chi1y*chi1y + chi1z*chi1z);
204 pPrec->
chi2x = chi2x;
205 pPrec->
chi2y = chi2y;
206 pPrec->
chi2z = chi2z;
207 pPrec->
chi2_norm = sqrt(chi2x*chi2x + chi2y*chi2y + chi2z*chi2z);
216 pPrec->
S1x = chi1x * m1_2;
217 pPrec->
S1y = chi1y * m1_2;
218 pPrec->
S1z = chi1z * m1_2;
221 pPrec->
S2x = chi2x * m2_2;
222 pPrec->
S2y = chi2y * m2_2;
223 pPrec->
S2z = chi2z * m2_2;
230 pPrec->
chi1_perp = sqrt(chi1x*chi1x + chi1y*chi1y);
231 pPrec->
chi2_perp = sqrt(chi2x*chi2x + chi2y*chi2y);
234 pPrec->
S1_perp = (m1_2) * sqrt(chi1x*chi1x + chi1y*chi1y);
235 pPrec->
S2_perp = (m2_2) * sqrt(chi2x*chi2x + chi2y*chi2y);
248 PNRUseTunedAngles = 0;
251 AntisymmetricWaveform = 0;
260 pPrec->
A1 = 2.0 + (3.0 * m2) / (2.0 * m1);
261 pPrec->
A2 = 2.0 + (3.0 * m1) / (2.0 * m2);
267 const REAL8 den = (m2 > m1) ? pPrec->
A2*(m2_2) : pPrec->
A1*(m1_2);
270 const REAL8 chip = num / den;
271 const REAL8 chi1L = chi1z;
272 const REAL8 chi2L = chi2z;
281 pPrec->
SL = chi1L*m1_2 + chi2L*m2_2;
284 pPrec->
Sperp = chip * m1_2;
295 if(precversionTag==3)
305 if (ModeArray != NULL)
324 if(PNRUseTunedAngles==
false)
336 if (pWF->
deltaF == 0.) iStart_here = 0;
338 iStart_here= (size_t)(pWF->
fMin / pWF->
deltaF);
357 "Error: IMRPhenomX_PNR_precompute_alpha_coefficients failed.\n");
362 "Error: IMRPhenomX_PNR_precompute_beta_coefficients failed.\n");
367 "Error: IMRPhenomX_PNR_BetaConnectionFrequencies failed.\n");
369 REAL8 Mf_alpha_upper = alphaParams->
A4 / 3.0;
370 REAL8 Mf_low_cut = (3.0 / 3.5) * Mf_alpha_upper;
375 if((MF_high_cut > pWF->
fCutDef) || (MF_high_cut < 0.1 * pWF->fRING)){
376 MF_high_cut = pWF->
fRING;
378 if((Mf_low_cut > pWF->
fCutDef) || (MF_high_cut < Mf_low_cut)){
379 Mf_low_cut = MF_high_cut / 2.0;
384 if(flow_alpha <
flow){
387 flow = fmin_HM_inspiral / 1.5;
393 flow = ((fmin_HM_ringdowm < fmin_HM_inspiral)&&(fmin_HM_ringdowm > 0.0)) ? fmin_HM_ringdowm : fmin_HM_inspiral;
399 flow = (
flow - 2.0 * pnr_interpolation_deltaf < 0) ?
flow / 2.0 :
flow - 2.0 * pnr_interpolation_deltaf;
401 iStart_here = (size_t)(
flow / pnr_interpolation_deltaf);
402 flow = iStart_here * pnr_interpolation_deltaf;
405 XLAL_CHECK(
flow>0.,
XLAL_EDOM,
"Error in %s: starting frequency for SpinTaylor angles must be positive!",__func__);
406 status =
IMRPhenomX_InspiralAngles_SpinTaylor(pPrec->
PNarrays,&pPrec->
fmin_integration,chi1x,chi1y,chi1z,chi2x,chi2y,chi2z,
flow,pPrec->
IMRPhenomXPrecVersion,pWF,lalParams);
413 REAL8 chi1x_evolved = chi1x;
414 REAL8 chi1y_evolved = chi1y;
415 REAL8 chi1z_evolved = chi1z;
416 REAL8 chi2x_evolved = chi2x;
417 REAL8 chi2y_evolved = chi2y;
418 REAL8 chi2z_evolved = chi2z;
441 REAL8 phi = atan2( Ly, Lx );
442 REAL8 theta = acos( Lz / sqrt(Lx*Lx + Ly*Ly + Lz*Lz) );
453 chi1x_evolved = chi1x_temp;
454 chi1y_evolved = chi1y_temp;
455 chi1z_evolved = chi1z_temp;
457 chi2x_evolved = chi2x_temp;
458 chi2y_evolved = chi2y_temp;
459 chi2z_evolved = chi2z_temp;
477 XLAL_PRINT_WARNING(
"Warning: due to a failure in the SpinTaylor routines, the model will default to MSA angles.");
491 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 && pflag!=330)
493 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, 321 or 330.\n");
516 printf(
"Initializing MSA system...\n");
521 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");
539 XLAL_ERROR(
XLAL_EINVAL,
"Error in IMRPhenomXGetAndSetPrecessionVariables: IMRPhenomXPrecessionVersion not recognized.\n");
577 "Error: IMRPhenomX_PNR_GetAndSetCoPrecParams failed \
578 in IMRPhenomXGetAndSetPrecessionVariables.\n");
585 if( pflag == 220 || pflag == 221 || pflag == 222 || pflag == 223 || pflag == 224 )
588 printf(
"Evaluating MSA system.\n");
597 if(pflag == 220 || pflag == 223 || pflag == 224)
599 XLAL_PRINT_WARNING(
"Warning: Initialization of MSA system failed. Defaulting to NNLO angles using 3PN aligned-spin approximation.");
605 XLAL_ERROR(
XLAL_EDOM,
"Error: IMRPhenomX_Initialize_MSA_System failed to initialize. Terminating.\n");
611 printf(
"In IMRPhenomXSetPrecessionVariables... \n\n");
612 printf(
"chi_p : %e\n",pPrec->
chi_p);
614 printf(
"SL : %e\n",pPrec->
SL);
615 printf(
"Sperp : %e\n\n",pPrec->
Sperp);
625 const REAL8 chip2 = chip * chip;
628 const REAL8 chi1L2 = chi1L * chi1L;
629 const REAL8 chi2L2 = chi2L * chi2L;
631 const REAL8 log16 = 2.772588722239781;
648 pPrec->
L2 = ((3.0/2.0) + (eta/6.0));
650 pPrec->
L4 = (81.0 + (-57.0 + eta)*eta)/24.;
671 pPrec->
L2 = 3.0/2. + eta/6.0;
672 pPrec->
L3 = (5*(chi1L*(-2 - 2*
delta + eta) + chi2L*(-2 + 2*
delta + eta)))/6.;
673 pPrec->
L4 = (81 + (-57 + eta)*eta)/24.;
674 pPrec->
L5 = (-7*(chi1L*(72 +
delta*(72 - 31*eta) + eta*(-121 + 2*eta)) + chi2L*(72 + eta*(-121 + 2*eta) +
delta*(-72 + 31*eta))))/144.;
690 pPrec->
L2 = 3.0/2. + eta/6.0;
691 pPrec->
L3 = (-7*(chi1L + chi2L + chi1L*
delta - chi2L*
delta) + 5*(chi1L + chi2L)*eta)/6.;
692 pPrec->
L4 = (81 + (-57 + eta)*eta)/24.;
693 pPrec->
L5 = (-1650*(chi1L + chi2L + chi1L*
delta - chi2L*
delta) + 1336*(chi1L + chi2L)*eta + 511*(chi1L - chi2L)*
delta*eta + 28*(chi1L + chi2L)*eta2)/600.;
707 pPrec->
L2 = 3.0/2. + eta/6.0;
708 pPrec->
L3 = (5*(chi1L*(-2 - 2*
delta + eta) + chi2L*(-2 + 2*
delta + eta)))/6.;
709 pPrec->
L4 = (81 + (-57 + eta)*eta)/24.;
710 pPrec->
L5 = (-7*(chi1L*(72 +
delta*(72 - 31*eta) + eta*(-121 + 2*eta)) + chi2L*(72 + eta*(-121 + 2*eta) +
delta*(-72 + 31*eta))))/144.;
712 pPrec->
L7 = (chi2L*(-324 + eta*(1119 - 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta)))
713 - chi1L*(324 + eta*(-1119 + 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta))))/32.;
714 pPrec->
L8 = 2835/128. - (eta*(-10677852 + 100*eta*(-640863 + eta*(774 + 11*eta))
717 pPrec->
L8L = -(64.0/3.0) * eta;
729 pPrec->
L2 = 3.0/2. + eta/6.0;
730 pPrec->
L3 = (5*(chi1L*(-2 - 2*
delta + eta) + chi2L*(-2 + 2*
delta + eta)))/6.;
731 pPrec->
L4 = (81 + (-57 + eta)*eta)/24.;
732 pPrec->
L5 = (-7*(chi1L*(72 +
delta*(72 - 31*eta) + eta*(-121 + 2*eta)) + chi2L*(72 + eta*(-121 + 2*eta) +
delta*(-72 + 31*eta))))/144.;
734 pPrec->
L7 = (chi2L*(-324 + eta*(1119 - 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta)))
735 - chi1L*(324 + eta*(-1119 + 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta))))/32.;
736 pPrec->
L8 = 2835/128. - (eta*(-10677852 + 100*eta*(-640863 + eta*(774 + 11*eta))
740 pPrec->
L8L = -(64.0/3.0) * eta;
743 pPrec->
L4 += (chi1L2*(1 +
delta - 2*eta) + 4*chi1L*chi2L*eta - chi2L2*(-1 +
delta + 2*eta))/2.;
744 pPrec->
L7 += (3*(chi1L + chi2L)*eta*(chi1L2*(1 +
delta - 2*eta) + 4*chi1L*chi2L*eta - chi2L2*(-1 +
delta + 2*eta)))/4.;
751 XLAL_ERROR(
XLAL_EINVAL,
"Error: IMRPhenomXPrecVersion not recognized. Requires version 101, 102, 103, 104, 220, 221, 222, 223, 224, 310, 311, 320, 321 or 330.\n");
757 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);
766 pPrec->
J0x_Sf = (m1_2)*chi1x + (m2_2)*chi2x;
767 pPrec->
J0y_Sf = (m1_2)*chi1y + (m2_2)*chi2y;
768 pPrec->
J0z_Sf = (m1_2)*chi1z + (m2_2)*chi2z + pPrec->
LRef;
773 if(pPrec->
J0 < 1
e-10)
787 if ( !(convention == 0 || convention == 1 || convention == 5 || convention == 6 || convention == 7))
789 XLAL_ERROR(
XLAL_EINVAL,
"Error: IMRPhenomXPConvention not recognized. Requires version 0, 1, 5, 6 or 7.\n");
793 printf(
"\n*** Convention = %i\n", convention);
800 printf(
"\nAligned spin limit!\n");
891 printf(
"\nAligned-spin case.\n");
918 pPrec->
alpha0 = atan2(tmp_y,tmp_x);
938 tmp_x = pPrec->
Nx_Sf;
939 tmp_y = pPrec->
Ny_Sf;
940 tmp_z = pPrec->
Nz_Sf;
946 pPrec->
Nx_Jf = tmp_x;
947 pPrec->
Ny_Jf = tmp_y;
948 pPrec->
Nz_Jf = tmp_z;
959 pPrec->
thetaJN = acos( J0dotN / pPrec->
J0 );
983 tmp_x = pPrec->
Xx_Sf;
984 tmp_y = pPrec->
Xy_Sf;
985 tmp_z = pPrec->
Xz_Sf;
1062 REAL8 chiL = (1.0 +
q) * (chi_eff /
q);
1063 REAL8 chiL2 = chiL * chiL;
1067 pPrec->
alpha2 = ((15*chiL*
delta*m1)/128. - (35*chiL*m1_2)/128.)/eta;
1069 pPrec->
alpha3 = -5515/3072. + eta*(-515/384. - (15*delta2)/(256.*m1_2)
1070 + (175*
delta)/(256.*m1)) + (4555*
delta)/(7168.*m1)
1071 + ((15*chip2*
delta*m1_3)/128. - (35*chip2*m1_4)/128.)/eta2;
1074 pPrec->
alpha4L = ((5*chiL*delta2)/16. - (5*chiL*
delta*m1)/3. + (2545*chiL*m1_2)/1152.
1075 + ((-2035*chiL*
delta*m1)/21504.
1076 + (2995*chiL*m1_2)/9216.)/eta + ((5*chiL*chip2*
delta*m1_5)/128.
1077 - (35*chiL*chip2*m1_6)/384.)/eta3
1080 pPrec->
alpha5 = (5*(-190512*delta3*eta6 + 2268*delta2*eta3*m1*(eta2*(323 + 784*eta)
1081 + 336*(25*chiL2 + chip2)*m1_4) + 7*m1_3*(8024297*eta4 + 857412*eta5
1082 + 3080448*eta6 + 143640*chip2*eta2*m1_4
1083 - 127008*chip2*(-4*chiL2 + chip2)*m1_8
1084 + 6048*eta3*((2632*chiL2 + 115*chip2)*m1_4 - 672*chiL*m1_2*
LAL_PI))
1085 + 3*
delta*m1_2*(-5579177*eta4 + 80136*eta5 - 3845520*eta6
1086 + 146664*chip2*eta2*m1_4 + 127008*chip2*(-4*chiL2 + chip2)*m1_8
1087 - 42336*eta3*((726*chiL2 + 29*chip2)*m1_4
1088 - 96*chiL*m1_2*
LAL_PI))))/(6.5028096e7*eta4*m1_3);
1093 pPrec->
epsilon2 = ((15*chiL*
delta*m1)/128. - (35*chiL*m1_2)/128.)/eta;
1095 pPrec->
epsilon3 = -5515/3072. + eta*(-515/384. - (15*delta2)/(256.*m1_2)
1096 + (175*
delta)/(256.*m1)) + (4555*
delta)/(7168.*m1);
1099 pPrec->
epsilon4L = (5*chiL*delta2)/16. - (5*chiL*
delta*m1)/3. + (2545*chiL*m1_2)/1152.
1100 + ((-2035*chiL*
delta*m1)/21504. + (2995*chiL*m1_2)/9216.)/eta - (35*
LAL_PI)/48.
1103 pPrec->
epsilon5 = (5*(-190512*delta3*eta3 + 2268*delta2*m1*(eta2*(323 + 784*eta)
1105 - 3*
delta*m1_2*(eta*(5579177 + 504*eta*(-159 + 7630*eta))
1106 + 254016*chiL*m1_2*(121*chiL*m1_2 - 16*
LAL_PI))
1107 + 7*m1_3*(eta*(8024297 + 36*eta*(23817 + 85568*eta))
1108 + 338688*chiL*m1_2*(47*chiL*m1_2 - 12*
LAL_PI))))/(6.5028096e7*eta*m1_3);
1137 XLAL_ERROR(
XLAL_EINVAL,
"Error: IMRPhenomXPrecVersion not recognized. Requires version 101, 102, 103, 104, 220, 221, 222, 223, 224, 310, 311, 320, 321 or 330.\n");
1142 REAL8 alpha_offset = 0, epsilon_offset = 0;
1145 printf(
"thetaJN : %e\n", pPrec->
thetaJN);
1146 printf(
"phiJ_Sf : %e\n", pPrec->
phiJ_Sf);
1147 printf(
"alpha0 : %e\n", pPrec->
alpha0);
1149 printf(
"kappa : %e\n", pPrec->
kappa);
1150 printf(
"pi/2 - phiRef : %e\n",
LAL_PI_2 - phiRef);
1152 printf(
"zeta_polarization : %.16e\n", acos(pPrec->
XdotPArun));
1153 printf(
"zeta_polarization : %.16e\n", asin(pPrec->
XdotQArun));
1155 printf(
"alpha1 : %e\n", pPrec->
alpha1);
1156 printf(
"alpha2 : %e\n", pPrec->
alpha2);
1157 printf(
"alpha3 : %e\n", pPrec->
alpha3);
1158 printf(
"alpha4L : %e\n", pPrec->
alpha4L);
1159 printf(
"alpha5 : %e\n\n", pPrec->
alpha5);
1178 if(convention == 5 || convention == 7)
1239 XLAL_PRINT_WARNING(
"Very high mass, only merger in frequency band, multibanding not efficient, switching off for non-precessing modes and Euler angles.");
1245 XLAL_PRINT_WARNING(
"Multibanding may lead to pathological behaviour in this case. Disabling multibanding .\n");
1256 XLAL_PRINT_WARNING(
"Very high mass ratio, NNLO angles may become pathological, switching off multibanding for angles.\n");
1262 else if ( pWF->
q > 50 && pWF->
Mtot > 100 )
1276 XLAL_PRINT_WARNING(
"Very high mass ratio, possibility of numerical instabilities. Waveforms remain well behaved.\n");
1281 const REAL8 yphi = 0.0;
1372 if (PNRUseTunedCoprec && fsflag < 6) fsflag = 5;
1375 if (PNRUseInputCoprecDeviations) fsflag = 6;
1378 if( PNRUseTunedCoprec ){
1383 double chi1L = pPrec->
chi1z;
1384 double chi2L = pPrec->
chi2z;
1403 if( pflag == 220 || pflag == 221 || pflag == 222 || pflag == 223 || pflag == 224 )
1407 XLAL_PRINT_WARNING(
"Initialization of MSA system failed. Defaulting to final spin version 0.\n");
1415 sign = copysign(1, af_parallel);
1423 XLAL_PRINT_WARNING(
"Error: XLALSimInspiralWaveformParamsLookupPhenomXPFinalSpinMod version 3 requires PrecVersion 220, 221, 222, 223 or 224. Defaulting to version 0.\n");
1437 sign = copysign(1, cos(pWF->
betaRD) );
1466 sign = copysign(1, cos(pWF->
betaRD) );
1478 XLAL_ERROR(
XLAL_EDOM,
"Error: XLALSimInspiralWaveformParamsLookupPhenomXPFinalSpinMod version not recognized. Requires PhenomXPFinalSpinMod of 0, 1, 2, 3, or 5.\n");
1483 if( !PNRUseTunedCoprec ){
1495 printf(
"*** PNR Co-precessing model in use (l=m=2) ***\n\n");
1496 printf(
"PNR window : %e\n", pWF->
pnr_window);
1497 printf(
"pWF->afinal : %e\n",pWF->
afinal);
1498 printf(
"pWF->afinal_prec : %e\n",pWF->
afinal_prec);
1504 if( fabs(pWF->
afinal) > 1.0 )
1522 printf(
"afinal (prec) : %e\n",pWF->
afinal);
1523 printf(
"fring (prec) : %e\n",pWF->
fRING);
1524 printf(
"fdamp (prec) : %e\n\n",pWF->
fDAMP);
1535 if( APPLY_PNR_DEVIATIONS )
1563 printf(
"pflag : %i\n",pflag);
1564 printf(
"pWF->betaRD : %e\n",pWF->
betaRD);
1566 printf(
"fring22 (prec) : %e\n",fRING22_prec);
1567 printf(
"fRING : %e\n",pWF->
fRING);
1581 double omega_ref = pWF->
piM * pWF->
fRef * 2./mprime;
1586 if(pflag == 220 || pflag == 221 || pflag == 222 || pflag == 223 || pflag == 224)
1588 const double v = cbrt ( omega_ref );
1591 *alpha_offset = vangles.
x - pPrec->
alpha0;
1592 *epsilon_offset = vangles.
y - pPrec->
epsilon0;
1597 double logomega_ref = log(omega_ref);
1598 double omega_ref_cbrt = cbrt(omega_ref);
1599 double omega_ref_cbrt2 = omega_ref_cbrt * omega_ref_cbrt;
1602 pPrec->
alpha1 / omega_ref
1603 + pPrec->
alpha2 / omega_ref_cbrt2
1604 + pPrec->
alpha3 / omega_ref_cbrt
1605 + pPrec->
alpha4L * logomega_ref
1611 + pPrec->
epsilon2 / omega_ref_cbrt2
1644 const REAL8 sqx = sqrt(
x);
1653 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));
1664 const REAL8 eta2 = eta*eta;
1667 const REAL8 sqx = v;
1669 return (eta / sqx) * ( 1.0 +
x * (3/2. + eta/6.) + x2 * (27/8. - (19*eta)/8. + eta2/24.) );
1681 const REAL8 eta2 = eta*eta;
1686 const REAL8 sqx = v;
1688 return (eta/sqx) * (
1690 + (3/2. + eta/6.) *
x
1691 + (chi1L*(-5/3. - (5*
delta)/3. + (5*eta)/6.) + chi2L*(-5/3. + (5*
delta)/3. + (5*eta)/6.)) *
x * sqx
1692 + (27/8. - (19*eta)/8. + eta2/24.) * x2
1693 + ((-7*(chi1L*(72 +
delta*(72 - 31*eta) + eta*(-121 + 2*eta)) + chi2L*(72 + eta*(-121 + 2*eta) +
delta*(-72 + 31*eta))))/144.) * x2 * sqx
1694 + ((10935 + eta*(-62001 + eta*(1674 + 7*eta) + 2214*
LAL_TWOPI))/1296.) * x3
1711 const REAL8 sqx = sqrt(
x);
1712 const REAL8 logx = log(
x);
1714 return (eta/sqx) * (
1716 + ((9 + eta)/6.) *
x
1717 + ((5*chi1L*(-2 - 2*
delta + eta) + 5*chi2L*(-2 + 2*
delta + eta))/6.) *
x * sqx
1718 + ((81 + (-57 + eta)*eta)/24.) * x2
1719 + ((-7*(chi1L*(72 +
delta*(72 - 31*eta) + eta*(-121 + 2*eta)) + chi2L*(72 + eta*(-121 + 2*eta) +
delta*(-72 + 31*eta))))/144.) * x2 * sqx
1720 + ((10935 + eta*(-62001 + eta*(1674 + 7*eta) + 2214*
LAL_TWOPI))/1296.) * x3
1721 + ((chi2L*(-324 + eta*(1119 - 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta)))
1722 - chi1L*(324 + eta*(-1119 + 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta))))/32.) * x3 * sqx
1723 + (2835/128. - (eta*(-10677852 + 100*eta*(-640863 + eta*(774 + 11*eta)) + 26542080*
LAL_GAMMA
1724 + 675*(3873 + 3608*eta)*
LAL_TWOPI))/622080. - (64*eta*log(16.))/3.) * x4
1725 + (-64*eta/3.) * x4 * logx
1738 const REAL8 chi1L2 = chi1L * chi1L;
1739 const REAL8 chi2L2 = chi2L * chi2L;
1745 const REAL8 sqx = sqrt(
x);
1746 const REAL8 logx = log(
x);
1748 return (eta/sqx) * (
1750 + ((9 + eta)/6.) *
x
1751 + ((5*chi1L*(-2 - 2*
delta + eta) + 5*chi2L*(-2 + 2*
delta + eta))/6.) *
x * sqx
1752 + ((81 + (-57 + eta)*eta)/24.) * x2
1753 + ((-7*(chi1L*(72 +
delta*(72 - 31*eta) + eta*(-121 + 2*eta)) + chi2L*(72 + eta*(-121 + 2*eta) +
delta*(-72 + 31*eta))))/144.) * x2 * sqx
1754 + ((10935 + eta*(-62001 + eta*(1674 + 7*eta) + 2214*
LAL_TWOPI))/1296.) * x3
1755 + ((chi2L*(-324 + eta*(1119 - 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta)))
1756 - chi1L*(324 + eta*(-1119 + 2*eta*(172 + eta)) +
delta*(324 + eta*(-633 + 14*eta))))/32.) * x3 * sqx
1757 + (2835/128. - (eta*(-10677852 + 100*eta*(-640863 + eta*(774 + 11*eta)) + 26542080*
LAL_GAMMA
1758 + 675*(3873 + 3608*eta)*
LAL_TWOPI))/622080. - (64*eta*log(16.))/3.) * x4
1759 + (-64*eta/3.) * x4 * logx
1760 + ((chi1L2*(1 +
delta - 2*eta) + 4*chi1L*chi2L*eta - chi2L2*(-1 +
delta + 2*eta))/2.) * x2
1761 + ((3*(chi1L + chi2L)*eta*(chi1L2*(1 +
delta - 2*eta) + 4*chi1L*chi2L*eta - chi2L2*(-1 +
delta + 2*eta)))/4.) * x3
1785 const REAL8 logomega = log(omega);
1786 const REAL8 omega_cbrt = cbrt(omega);
1787 const REAL8 omega_cbrt2 = omega_cbrt*omega_cbrt;
1795 const REAL8 m1_2 = m1*m1;
1796 const REAL8 m1_3 = m1*m1_2;
1797 const REAL8 m1_4 = m1*m1_3;
1798 const REAL8 m1_5 = m1*m1_4;
1799 const REAL8 m1_6 = m1_3*m1_3;
1800 const REAL8 m1_8 = m1_4*m1_4;
1805 const REAL8 eta2 = eta*eta;
1806 const REAL8 eta3 = eta*eta2;
1807 const REAL8 eta4 = eta*eta3;
1808 const REAL8 eta5 = eta*eta4;
1809 const REAL8 eta6 = eta*eta5;
1811 const REAL8 chi_eff = m1*chi1L + m2*chi2L;
1812 const REAL8 chiL = (1.0 +
q) * chi_eff /
q;
1813 const REAL8 chiL2 = chiL*chiL;
1814 const REAL8 chip2 = chip*chip;
1816 const REAL8 alpha1 = (-35/192. - (5*
delta)/(64.*m1));
1817 const REAL8 alpha2 = (((-15*chiL*
delta*m1)/128. - (35*chiL*m1_2)/128.)/eta);
1818 const REAL8 alpha3 = (-5515/3072. + eta*(-515/384. - (15*delta2)/(256.*m1_2) - (175*
delta)/(256.*m1)) - (4555*
delta)/(7168.*m1)
1819 + ((-15*chip2*
delta*m1_3)/128. - (35*chip2*m1_4)/128.)/eta2);
1820 const REAL8 alpha4 = (((5*chiL*delta2)/16. + (5*chiL*
delta*m1)/3. + (2545*chiL*m1_2)/1152. + ((2035*chiL*
delta*m1)/21504.
1821 + (2995*chiL*m1_2)/9216.)/eta + ((-5*chiL*chip2*
delta*m1_5)/128.
1822 - (35*chiL*chip2*m1_6)/384.)/eta3 - (35*
LAL_PI)/48. - (5*
delta*
LAL_PI)/(16.*m1)));
1823 const REAL8 alpha5 = ((5*(190512*delta3*eta6 + 2268*delta2*eta3*m1*(eta2*(323 + 784*eta) + 336*(25*chiL2 + chip2)*m1_4)
1824 + 7*m1_3*(8024297*eta4 + 857412*eta5 + 3080448*eta6 + 143640*chip2*eta2*m1_4 - 127008*chip2*(-4*chiL2 + chip2)*m1_8
1825 + 6048*eta3*((2632*chiL2 + 115*chip2)*m1_4 - 672*chiL*m1_2*
LAL_PI)) + 3*
delta*m1_2*(5579177*eta4
1826 - 80136*eta5 + 3845520*eta6 - 146664*chip2*eta2*m1_4 - 127008*chip2*(-4*chiL2 + chip2)*m1_8
1827 + 42336*eta3*((726*chiL2 + 29*chip2)*m1_4 - 96*chiL*m1_2*
LAL_PI))))/(6.5028096e7*eta4*m1_3));
1829 return (alpha1/omega + alpha2/omega_cbrt2 + alpha3/omega_cbrt + alpha4*logomega + alpha5*omega_cbrt + alpha0);
1844 const REAL8 logomega = log(omega);
1845 const REAL8 omega_cbrt = cbrt(omega);
1846 const REAL8 omega_cbrt2 = omega_cbrt*omega_cbrt;
1854 const REAL8 m1_2 = m1*m1;
1855 const REAL8 m1_3 = m1*m1_2;
1856 const REAL8 m1_4 = m1*m1_3;
1857 const REAL8 m1_5 = m1*m1_4;
1858 const REAL8 m1_6 = m1_3*m1_3;
1859 const REAL8 m1_8 = m1_4*m1_4;
1864 const REAL8 eta2 = eta*eta;
1865 const REAL8 eta3 = eta*eta2;
1866 const REAL8 eta4 = eta*eta3;
1867 const REAL8 eta5 = eta*eta4;
1868 const REAL8 eta6 = eta*eta5;
1870 const REAL8 chi_eff = m1*chi1L + m2*chi2L;
1871 const REAL8 chiL = (1.0 +
q) * chi_eff /
q;
1872 const REAL8 chiL2 = chiL*chiL;
1873 const REAL8 chip2 = chip*chip;
1875 const REAL8 epsilon1 = (-35/192. - (5*
delta)/(64.*m1));
1876 const REAL8 epsilon2 = (((-15*chiL*
delta*m1)/128. - (35*chiL*m1_2)/128.)/eta);
1877 const REAL8 epsilon3 = (-5515/3072. + eta*(-515/384. - (15*delta2)/(256.*m1_2) - (175*
delta)/(256.*m1)) - (4555*
delta)/(7168.*m1)
1878 + ((-15*chip2*
delta*m1_3)/128. - (35*chip2*m1_4)/128.)/eta2);
1879 const REAL8 epsilon4L = (((5*chiL*delta2)/16. + (5*chiL*
delta*m1)/3. + (2545*chiL*m1_2)/1152. + ((2035*chiL*
delta*m1)/21504.
1880 + (2995*chiL*m1_2)/9216.)/eta + ((-5*chiL*chip2*
delta*m1_5)/128.
1881 - (35*chiL*chip2*m1_6)/384.)/eta3 - (35*
LAL_PI)/48. - (5*
delta*
LAL_PI)/(16.*m1)));
1882 const REAL8 epsilon5 = ((5*(190512*delta3*eta6 + 2268*delta2*eta3*m1*(eta2*(323 + 784*eta) + 336*(25*chiL2 + chip2)*m1_4)
1883 + 7*m1_3*(8024297*eta4 + 857412*eta5 + 3080448*eta6 + 143640*chip2*eta2*m1_4 - 127008*chip2*(-4*chiL2 + chip2)*m1_8
1884 + 6048*eta3*((2632*chiL2 + 115*chip2)*m1_4 - 672*chiL*m1_2*
LAL_PI)) + 3*
delta*m1_2*(5579177*eta4
1885 - 80136*eta5 + 3845520*eta6 - 146664*chip2*eta2*m1_4 - 127008*chip2*(-4*chiL2 + chip2)*m1_8
1886 + 42336*eta3*((726*chiL2 + 29*chip2)*m1_4 - 96*chiL*m1_2*
LAL_PI))))/(6.5028096e7*eta4*m1_3));
1888 return (epsilon1/omega + epsilon2/omega_cbrt2 + epsilon3/omega_cbrt + epsilon4L*logomega + epsilon5*omega_cbrt + epsilon0);
1896 const double omega_cbrt2,
1897 const double omega_cbrt,
1898 const double logomega
1906 + pPrec->
alpha2 / omega_cbrt2
1907 + pPrec->
alpha3 / omega_cbrt
1909 + pPrec->
alpha5 * omega_cbrt
1920 const double omega_cbrt2,
1921 const double omega_cbrt,
1922 const double logomega
1925 double epsilon = 0.0;
1955 double epsilon = 0.0;
1957 double cBetah = 0.0;
1958 double sBetah = 0.0;
1960 const double omega =
LAL_PI * Mf;
1961 const double logomega = log(omega);
1962 const double omega_cbrt = cbrt(omega);
1963 const double omega_cbrt2 = omega_cbrt * omega_cbrt;
1965 const double v = omega_cbrt;
1967 double s, s2, cos_beta;
1973 cos_beta = cos(pPrec->
betaPNR);
1988 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);
1994 s = pPrec->
Sperp / (L + pPrec->
SL);
1996 cos_beta = copysign(1.0, L + pPrec->
SL) / sqrt(1.0 + s2);
2006 vector vangles = {0.,0.,0.};
2013 cos_beta = vangles.
z;
2019 XLAL_ERROR(
XLAL_EINVAL,
"Error: IMRPhenomXPrecessionVersion not recognized. Recommended default is 223.\n");
2031 const REAL8 cBetah2 = cBetah * cBetah;
2032 const REAL8 cBetah3 = cBetah * cBetah2;
2033 const REAL8 cBetah4 = cBetah * cBetah3;
2034 const REAL8 sBetah2 = sBetah * sBetah;
2035 const REAL8 sBetah3 = sBetah * sBetah2;
2036 const REAL8 sBetah4 = sBetah * sBetah3;
2045 const COMPLEX16 d22[5] = {sBetah4, 2.0*cBetah*sBetah3, pPrec->
sqrt6*sBetah2*cBetah2, 2.0*cBetah3*sBetah, cBetah4};
2048 const COMPLEX16 d2m2[5] = {d22[4], -d22[3], d22[2], -d22[1], d22[0]};
2054 COMPLEX16 cexp_2i_alpha = cexp_i_alpha * cexp_i_alpha;
2055 COMPLEX16 cexp_mi_alpha = 1.0 / cexp_i_alpha;
2056 COMPLEX16 cexp_m2i_alpha = cexp_mi_alpha * cexp_mi_alpha;
2057 COMPLEX16 cexp_im_alpha_l2[5] = {cexp_m2i_alpha, cexp_mi_alpha, 1.0, cexp_i_alpha, cexp_2i_alpha};
2065 for(
int m=-2;
m<=2;
m++)
2068 COMPLEX16 A2m2emm = cexp_im_alpha_l2[-
m+2] * d2m2[
m+2] * Y2mA[
m+2];
2069 COMPLEX16 A22emmstar = cexp_im_alpha_l2[
m+2] * d22[
m+2] * conj(Y2mA[
m+2]);
2070 hp_sum += A2m2emm + polarizationSymmetry * A22emmstar;
2071 hc_sum += I*(A2m2emm - polarizationSymmetry * A22emmstar);
2075 COMPLEX16 eps_phase_hP = cexp(-2.0*I*epsilon) * hAS / 2.0;
2078 *hp = eps_phase_hP * hp_sum;
2079 *hc = eps_phase_hP * hc_sum;
2086 sprintf(fileSpec,
"angles_XP.dat");
2088 fileangle = fopen(fileSpec,
"a");
2101 REAL8 *cos_beta_half,
2102 REAL8 *sin_beta_half,
2103 const REAL8 cos_beta
2107 *cos_beta_half = + sqrt( fabs(1.0 + cos_beta) / 2.0 );
2108 *sin_beta_half = + sqrt( fabs(1.0 - cos_beta) / 2.0 );
2114 REAL8 *cos_beta_half,
2115 REAL8 *sin_beta_half,
2122 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);
2130 const REAL8 cos_beta = copysign(1.0, L + pPrec->
SL) / sqrt(1.0 + s2);
2132 *cos_beta_half = + sqrt( fabs(1.0 + cos_beta) / 2.0 );
2133 *sin_beta_half = + sqrt( fabs(1.0 - cos_beta) / 2.0 );
2150 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) );
2160 const REAL8 max_beta = 2.0 * acos(cBetah);
2168 if ((L_min + pPrec->
SL) < 0. && pPrec->
chi_p > 0.)
2170 XLAL_PRINT_WARNING(
"The maximum opening angle exceeds Pi/2.\nThe model may be pathological in this regime.");
2172 XLAL_PRINT_WARNING(
"Multibanding may lead to pathological behaviour in this case. Disabling multibanding.\n");
2180 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);
2204 vector vout = {0.,0.,0.};
2207 const double L_norm = pWF->
eta / v;
2210 double L_norm3PN = 0.0;
2219 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);
2231 pPrec->
S32 = vRoots.
x;
2232 pPrec->
Smi2 = vRoots.
y;
2233 pPrec->
Spl2 = vRoots.
z;
2237 pPrec->
Spl = sqrt(pPrec->
Spl2);
2238 pPrec->
Smi = sqrt(pPrec->
Smi2);
2244 vector vMSA = {0.,0.,0.};
2245 if(fabs(pPrec->
Smi2 - pPrec->
Spl2) > 1.e-5)
2251 const double phiz_MSA = vMSA.
x;
2252 const double zeta_MSA = vMSA.
y;
2258 vout.
x = phiz + phiz_MSA;
2259 vout.
y =
zeta + zeta_MSA;
2260 vout.
z = cos_theta_L;
2272 if(pflag != 220 && pflag != 221 && pflag != 222 && pflag != 223 && pflag != 224)
2274 XLAL_ERROR(
XLAL_EINVAL,
"Error: MSA system requires IMRPhenomXPrecVersion 220, 221, 222, 223 or 224.\n");
2284 const double eta = pPrec->
eta;
2285 const double eta2 = pPrec->
eta2;
2286 const double eta3 = pPrec->
eta3;
2287 const double eta4 = pPrec->
eta4;
2289 const double m1 = pWF->
m1;
2290 const double m2 = pWF->
m2;
2293 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.};
2294 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.};
2295 const double domegadt_constants_SS[4] = {-494./5.,-1442./5.,-233./5.,-719./5.};
2297 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.};
2298 const double L_csts_spinorbit[6] = {-14./6.,-3./2.,-11./2.,133./72.,-33./8.,7./4.};
2306 const double q = m2 / m1;
2307 const double invq = 1.0 /
q;
2309 pPrec->
invqq = invq;
2311 const double mu = (m1 * m2) / (m1 + m2);
2314 printf(
"m1 = %.6f\n\n",pWF->
m1);
2315 printf(
"m2 = %.6f\n\n",pWF->
m2);
2316 printf(
"q (<1) = %.6f\n\n",pPrec->
qq);
2320 pPrec->
delta_qq = (1.0 - pPrec->
qq) / (1.0 + pPrec->
qq);
2330 vector Lhat = {0.,0.,1.};
2370 printf(
"v_0 = %.6f\n\n",pPrec->
v_0);
2372 printf(
"chi1x = %.6f\n",pPrec->
chi1x);
2373 printf(
"chi1y = %.6f\n",pPrec->
chi1y);
2374 printf(
"chi1z = %.6f\n\n",pPrec->
chi1z);
2376 printf(
"chi2x = %.6f\n",pPrec->
chi2x);
2377 printf(
"chi2y = %.6f\n",pPrec->
chi2y);
2378 printf(
"chi2z = %.6f\n\n",pPrec->
chi2z);
2380 printf(
"S1_0.x = %.6f\n",pPrec->
S1_0.
x);
2381 printf(
"S1_0.y = %.6f\n",pPrec->
S1_0.
y);
2382 printf(
"S1_0.z = %.6f\n",pPrec->
S1_0.
z);
2383 printf(
"S1_0 = %.6f\n\n",S1_0_norm);
2385 printf(
"S2_0.x = %.6f\n",pPrec->
S2_0.
x);
2386 printf(
"S2_0.y = %.6f\n",pPrec->
S2_0.
y);
2387 printf(
"S2_0.z = %.6f\n",pPrec->
S2_0.
z);
2388 printf(
"S2_0 = %.6f\n\n",S2_0_norm);
2392 double dotS1L, dotS2L, dotS1Ln, dotS2Ln, dotS1S2;
2397 dotS1Ln = dotS1L / S1_0_norm;
2398 dotS2Ln = dotS2L / S2_0_norm;
2408 printf(
"Lhat_0.x = %.6f\n",Lhat.
x);
2409 printf(
"Lhat_0.y = %.6f\n",Lhat.
y);
2410 printf(
"Lhat_0.z = %.6f\n\n",Lhat.
z);
2412 printf(
"dotS1L = %.6f\n",pPrec->
dotS1L);
2413 printf(
"dotS2L = %.6f\n",pPrec->
dotS2L);
2414 printf(
"dotS1Ln = %.6f\n",pPrec->
dotS1Ln);
2415 printf(
"dotS2Ln = %.6f\n",pPrec->
dotS2Ln);
2416 printf(
"dotS1S2 = %.6f\n\n",pPrec->
dotS1S2);
2420 pPrec->
constants_L[0] = (L_csts_nonspin[0] + eta*L_csts_nonspin[1]);
2422 pPrec->
constants_L[2] = (L_csts_nonspin[2] + eta*L_csts_nonspin[3] + eta*eta*L_csts_nonspin[4]);
2424 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);
2427 const double Seff = (1.0 +
q) * pPrec->
dotS1L + (1 + (1.0/
q))*pPrec->
dotS2L;
2428 const double Seff2 = Seff * Seff;
2431 pPrec->
Seff2 = Seff2;
2434 printf(
"Seff = %.6f\n\n",pPrec->
Seff);
2445 printf(
"S_0_x = %.6f\n",pPrec->
S_0.
x);
2446 printf(
"S_0_y = %.6f\n",pPrec->
S_0.
y);
2447 printf(
"S_0_z = %.6f\n\n",pPrec->
S_0.
z);
2454 printf(
"J_0_x = %.6f\n",pPrec->
J_0.
x);
2455 printf(
"J_0_y = %.6f\n",pPrec->
J_0.
y);
2456 printf(
"J_0_z = %.6f\n\n",pPrec->
J_0.
z);
2467 const double L0norm = pPrec->
L_0_norm;
2468 const double J0norm = pPrec->
J_0_norm;
2471 printf(
"L_0_norm = %.6f\n",pPrec->
L_0_norm);
2472 printf(
"J_0_norm = %.6f\n\n",pPrec->
J_0_norm);
2485 printf(
"B = %.6f\n",vBCD.x);
2486 printf(
"C = %.6f\n",vBCD.y);
2487 printf(
"D = %.6f\n\n",vBCD.z);
2496 vector vRoots = {0.,0.,0.};
2501 pPrec->
Spl2 = vRoots.
z;
2502 pPrec->
Smi2 = vRoots.
y;
2503 pPrec->
S32 = vRoots.
x;
2512 pPrec->
Spl = sqrt(pPrec->
Spl2);
2513 pPrec->
Smi = sqrt(pPrec->
Smi2);
2517 pPrec->
SAv = sqrt(pPrec->
SAv2);
2522 printf(
"From vRoots... \n");
2523 printf(
"Spl2 = %.6f\n",pPrec->
Spl2);
2524 printf(
"Smi2 = %.6f\n",pPrec->
Smi2);
2525 printf(
"S32 = %.6f\n",pPrec->
S32);
2526 printf(
"SAv2 = %.6f\n",pPrec->
SAv2);
2527 printf(
"SAv = %.6f\n\n",pPrec->
SAv);
2531 const double c_1 = 0.5 * (J0norm*J0norm - L0norm*L0norm - pPrec->
SAv2) / pPrec->
L_0_norm * eta;
2532 const double c1_2 = c_1 * c_1;
2536 pPrec->
c12 = c_1 * c_1;
2540 const double omqsq = (1.0 -
q) * (1.0 -
q) + 1
e-16;
2541 const double omq2 = (1.0 -
q *
q) + 1
e-16;
2544 pPrec->
S1L_pav = (c_1 * (1.0 +
q) -
q * eta * Seff) / (eta * omq2);
2545 pPrec->
S2L_pav = -
q * (c_1 * (1.0 +
q) - eta * Seff) / (eta * omq2);
2552 pPrec->
beta3 = ( (113./12.) + (25./4.)*(m2/m1) )*pPrec->
S1L_pav + ( (113./12.) + (25./4.)*(m1/m2) )*pPrec->
S2L_pav;
2554 pPrec->
beta5 = ( ( (31319./1008.) - (1159./24.)*eta) + (m2/m1)*((809./84) - (281./8.)*eta) )*pPrec->
S1L_pav
2555 + ( ( (31319./1008.) - (1159./24.)*eta) + (m1/m2)*((809./84) - (281./8.)*eta) )*pPrec->
S2L_pav;
2557 pPrec->
beta6 =
LAL_PI * ( ( (75./2.) + (151./6.)*(m2/m1))*pPrec->
S1L_pav + ( (75./2.) + (151./6.)*(m1/m2))*pPrec->
S2L_pav );
2560 ( (130325./756) - (796069./2016)*eta + (100019./864.)*eta2 ) + (m2/m1)*( (1195759./18144) - (257023./1008.)*eta + (2903/32.)*eta2 ) * pPrec->
S1L_pav
2561 + ( (130325./756) - (796069./2016)*eta + (100019./864.)*eta2 ) + (m1/m2)*( (1195759./18144) - (257023./1008.)*eta + (2903/32.)*eta2 ) * pPrec->
S2L_pav
2569 pPrec->
a0 = 96.0 * eta / 5.0;
2572 pPrec->
a2 = -(743./336.) - (11.0/4.)*eta;
2574 pPrec->
a4 = (34103./18144.) + (13661./2016.)*eta + (59./18.)*eta2 - pPrec->
sigma4;
2577 + eta*( (451./48)*
LAL_PI*
LAL_PI - (56198689./217728.) ) + eta2*(541./896.) - eta3*(5605./2592.);
2581 pPrec->
a2 *= pPrec->
a0;
2582 pPrec->
a3 *= pPrec->
a0;
2583 pPrec->
a4 *= pPrec->
a0;
2584 pPrec->
a5 *= pPrec->
a0;
2585 pPrec->
a6 *= pPrec->
a0;
2586 pPrec->
a7 *= pPrec->
a0;
2589 printf(
"a0 = %.6f\n",pPrec->
a0);
2590 printf(
"a2 = %.6f\n",pPrec->
a2);
2591 printf(
"a3 = %.6f\n",pPrec->
a3);
2592 printf(
"a4 = %.6f\n",pPrec->
a4);
2593 printf(
"a5 = %.6f\n\n",pPrec->
a5);
2597 if(pflag == 222 || pflag == 223)
2599 pPrec->
a0 = eta*domegadt_constants_NS[0];
2600 pPrec->
a2 = eta*(domegadt_constants_NS[1] + eta*(domegadt_constants_NS[2]));
2601 pPrec->
a3 = eta*(domegadt_constants_NS[3] +
IMRPhenomX_Get_PN_beta(domegadt_constants_SO[0], domegadt_constants_SO[1], pPrec));
2602 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));
2603 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));
2608 printf(
"Using list of coefficients... \n");
2609 printf(
"a0 = %.6f\n",pPrec->
a0);
2610 printf(
"a2 = %.6f\n",pPrec->
a2);
2611 printf(
"a3 = %.6f\n",pPrec->
a3);
2612 printf(
"a4 = %.6f\n",pPrec->
a4);
2613 printf(
"a5 = %.6f\n\n",pPrec->
a5);
2625 pPrec->
g0 = 1. / pPrec->
a0;
2628 pPrec->
g2 = -(pPrec->
a2 / pPrec->
a0_2);
2631 pPrec->
g3 = -(pPrec->
a3/pPrec->
a0_2);
2637 pPrec->
g5 = -(pPrec->
a5*pPrec->
a0 - 2.0*pPrec->
a3*pPrec->
a2) / pPrec->
a0_3;
2640 printf(
"g0 = %.6f\n",pPrec->
g0);
2641 printf(
"g2 = %.6f\n",pPrec->
g2);
2642 printf(
"g3 = %.6f\n",pPrec->
g3);
2643 printf(
"g4 = %.6f\n",pPrec->
g4);
2644 printf(
"g5 = %.6f\n\n",pPrec->
g5);
2650 const double delta3 =
delta * delta2;
2651 const double delta4 =
delta * delta3;
2659 pPrec->
psi1 = 3.0 * (2.0 * eta2 * Seff - c_1) / (eta * delta2);
2662 double c_1_over_nu_2 = c_1_over_nu * c_1_over_nu;
2663 double one_p_q_sq = (1.+
q) * (1.+
q);
2664 double Seff_2 = Seff * Seff;
2666 double one_m_q_sq = (1.-
q)*(1.-
q);
2667 double one_m_q2_2 = (1. - q_2) * (1. - q_2);
2668 double one_m_q_4 = one_m_q_sq * one_m_q_sq;
2670 double term1, term2, term3, term4, term5, term6, term7, term8;
2675 if(pflag == 222 || pflag == 223)
2677 const double Del1 = 4. * c_1_over_nu_2 * one_p_q_sq;
2678 const double Del2 = 8. * c_1_over_nu *
q * (1. +
q) * Seff;
2679 const double Del3 = 4. * (one_m_q2_2 * pPrec->
S1_norm_2 - q_2 * Seff_2);
2680 const double Del4 = 4. * c_1_over_nu_2 * q_2 * one_p_q_sq;
2681 const double Del5 = 8. * c_1_over_nu * q_2 * (1. +
q) * Seff;
2682 const double Del6 = 4. * (one_m_q2_2 * pPrec->
S2_norm_2 - q_2 * Seff_2);
2683 pPrec->
Delta = sqrt( fabs( (Del1 - Del2 - Del3) * (Del4 - Del5 - Del6) ));
2688 term1 = c1_2 * eta / (
q * delta4);
2689 term2 = -2.0 * c_1 * eta3 * (1.0 +
q) * Seff / (
q * delta4);
2690 term3 = -eta2 * (delta2 * pPrec->
S1_norm_2 - eta2 * Seff2) / delta4;
2698 term4 = c1_2 * eta *
q / delta4;
2699 term5 = -2.0*c_1*eta3*(1.0 +
q)*Seff / delta4;
2700 term6 = -eta2 * (delta2*pPrec->
S2_norm_2 - eta2*Seff2) / delta4;
2703 pPrec->
Delta = sqrt( fabs( (term1 + term2 + term3) * (term4 + term5 + term6) ) );
2709 if(pflag == 222 || pflag == 223)
2711 const double u1 = 3. * pPrec->
g2 / pPrec->
g0;
2712 const double u2 = 0.75 * one_p_q_sq / one_m_q_4;
2713 const double u3 = -20. * c_1_over_nu_2 * q_2 * one_p_q_sq;
2715 const double u5 = 2. * q_2 * (7. + 6. *
q + 7. * q_2) * 2. * c_1_over_nu * Seff;
2716 const double u6 = 2. * q_2 * (3. + 4. *
q + 3. * q_2) * Seff_2;
2717 const double u7 =
q * pPrec->
Delta;
2725 term1 = 3.0 * pPrec->
g2 / pPrec->
g0;
2728 term2 = 3.0 *
q *
q / (2.0 * eta3);
2729 term3 = 2.0 * pPrec->
Delta;
2730 term4 = -2.0*eta2*pPrec->
SAv2 / delta2;
2731 term5 = -10.*eta*c1_2 / delta4;
2732 term6 = 2.0 * eta2 * (7.0 + 6.0*
q + 7.0*
q*
q) * c_1 * Seff / (omqsq * delta2);
2733 term7 = -eta3 * (3.0 + 4.0*
q + 3.0*
q*
q) * Seff2 / (omqsq * delta2);
2737 pPrec->
psi2 = term1 + term2 * (term3 + term4 + term5 + term6 + term7 + term8);
2741 printf(
"psi1 = %.6f\n",pPrec->
psi1);
2742 printf(
"psi2 = %.6f\n\n",pPrec->
psi2);
2746 const double Rm = pPrec->
Spl2 - pPrec->
Smi2;
2747 const double Rm_2 = Rm * Rm;
2750 const double cp = pPrec->
Spl2 * eta2 - c1_2;
2751 double cm = pPrec->
Smi2 * eta2 - c1_2;
2764 const double cpcm = fabs( cp * cm );
2765 const double sqrt_cpcm = sqrt(cpcm);
2768 const double a1dD = 0.5 + 0.75/eta;
2771 const double a2dD = -0.75*Seff/eta;
2774 const double D2RmSq = (cp - sqrt_cpcm) / eta2 ;
2777 const double D4RmSq = -0.5*Rm*sqrt_cpcm/eta2 - cp/eta4*(sqrt_cpcm - cp);
2782 double aw = (-3.*(1. +
q)/
q*(2.*(1. +
q)*eta2*Seff*c_1 - (1. +
q)*c1_2 + (1. -
q)*eta2*S0m));
2783 double cw = 3./32./eta*Rm_2;
2784 double dw = 4.0*cp - 4.0*D2RmSq*eta2;
2785 double hw = -2.0*(2.0*D2RmSq - Rm)*c_1;
2786 double fw = Rm*D2RmSq - D4RmSq - 0.25*Rm_2;
2788 const double adD = aw / dw;
2789 const double hdD = hw / dw;
2790 const double cdD = cw / dw;
2791 const double fdD = fw / dw;
2793 const double gw = 3./16./eta2/eta*Rm_2*(c_1 - eta2*Seff);
2794 const double gdD = gw / dw;
2797 const double hdD_2 = hdD * hdD;
2798 const double adDfdD = adD * fdD;
2799 const double adDfdDhdD = adDfdD * hdD;
2800 const double adDhdD_2 = adD * hdD_2;
2803 printf(
"\na1dD = %.6f\n",a1dD);
2804 printf(
"a2dD = %.6f\n",a2dD);
2805 printf(
"adD = %.6f\n",adD);
2806 printf(
"cdD = %.6f\n",cdD);
2807 printf(
"hdD = %.6f\n",hdD);
2808 printf(
"fdD = %.6f\n",fdD);
2809 printf(
"Rm = %.6f\n",Rm);
2810 printf(
"Delta = %.6f\n",pPrec->
Delta);
2811 printf(
"sqrt_cpcm = %.6f\n",sqrt_cpcm);
2812 printf(
"c1 = %.6f\n",pPrec->
c1);
2813 printf(
"gdD = %.6f\n\n",gdD);
2820 pPrec->
Omegaz1 = a2dD - adD*Seff - adD*hdD;
2823 pPrec->
Omegaz2 = adD*hdD*Seff + cdD - adD*fdD + adD*hdD_2;
2826 pPrec->
Omegaz3 = (adDfdD - cdD - adDhdD_2)*(Seff + hdD) + adDfdDhdD;
2829 pPrec->
Omegaz4 = (cdD + adDhdD_2 - 2.0*adDfdD)*(hdD*Seff + hdD_2 - fdD) - adD*fdD*fdD;
2832 pPrec->
Omegaz5 = (cdD - adDfdD + adDhdD_2) * fdD * (Seff + 2.0*hdD) - (cdD + adDhdD_2 - 2.0*adDfdD) * hdD_2 * (Seff + hdD) - adDfdD*fdD*hdD;
2835 printf(
"Omegaz0 = %.6f\n",pPrec->
Omegaz0);
2836 printf(
"Omegaz1 = %.6f\n",pPrec->
Omegaz1);
2837 printf(
"Omegaz2 = %.6f\n",pPrec->
Omegaz2);
2838 printf(
"Omegaz3 = %.6f\n",pPrec->
Omegaz3);
2839 printf(
"Omegaz4 = %.6f\n",pPrec->
Omegaz4);
2840 printf(
"Omegaz5 = %.6f\n\n",pPrec->
Omegaz5);
2847 if(fabs(pPrec->
Omegaz5) > 1000.0)
2850 XLAL_PRINT_WARNING(
"Warning, |Omegaz5| = %.16f, which is larger than expected and may be pathological. Triggering MSA failure.\n",pPrec->
Omegaz5);
2853 const double g0 = pPrec->
g0;
2864 const double c1oveta2 = c_1 / eta2;
2873 printf(
"Omegazeta0 = %.6f\n",pPrec->
Omegazeta0);
2874 printf(
"Omegazeta1 = %.6f\n",pPrec->
Omegazeta1);
2875 printf(
"Omegazeta2 = %.6f\n",pPrec->
Omegazeta2);
2876 printf(
"Omegazeta3 = %.6f\n",pPrec->
Omegazeta3);
2877 printf(
"Omegazeta4 = %.6f\n",pPrec->
Omegazeta4);
2878 printf(
"Omegazeta5 = %.6f\n\n",pPrec->
Omegazeta5);
2889 switch(ExpansionOrder)
2900 #if __GNUC__ >= 7 && !defined __INTEL_COMPILER
2909 #if __GNUC__ >= 7 && !defined __INTEL_COMPILER
2918 #if __GNUC__ >= 7 && !defined __INTEL_COMPILER
2927 #if __GNUC__ >= 7 && !defined __INTEL_COMPILER
2940 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);
2961 double psi_of_v0 = 0.0;
2964 double volume_element = 0.0;
2965 double vol_sign = 0.0;
2968 printf(
"psi1 = %.6f\n",pPrec->
psi1);
2969 printf(
"psi2 = %.6f\n\n",pPrec->
psi2);
2970 printf(
"S_0_norm = %.6f\n\n",pPrec->
S_0_norm);
2974 if( fabs(pPrec->
Smi2 - pPrec->
Spl2) < 1.0e-5)
2980 mm = sqrt( (pPrec->
Smi2 - pPrec->
Spl2) / (pPrec->
S32 - pPrec->
Spl2) );
2984 vol_sign = (volume_element > 0) - (volume_element < 0);
2988 if( tmpB < 0. || tmpB > 1. )
2990 if(tmpB > 1.0 && (tmpB - 1.) < 0.00001)
2992 pPrec->
psi0 = gsl_sf_ellint_F(asin(vol_sign*sqrt(1.)) , mm, GSL_PREC_DOUBLE ) - psi_of_v0;
2994 if(tmpB < 0.0 && tmpB > -0.00001)
2996 pPrec->
psi0 = gsl_sf_ellint_F(asin(vol_sign*sqrt(0.)), mm, GSL_PREC_DOUBLE ) - psi_of_v0;
3001 pPrec->
psi0 = gsl_sf_ellint_F(asin( vol_sign * sqrt(tmpB) ), mm, GSL_PREC_DOUBLE) - psi_of_v0;
3006 printf(
"psi0_of_v0 = %.6f\n",psi_of_v0);
3007 printf(
"tmpB = %.6f\n",tmpB);
3008 printf(
"psi0 = %.6f\n\n",pPrec->
psi0);
3011 vector vMSA = {0.,0.,0.};
3013 double phiz_0 = 0.0;
3014 UNUSED
double phiz_0_MSA = 0.0;
3016 double zeta_0 = 0.0;
3017 UNUSED
double zeta_0_MSA = 0.0;
3020 if( fabs(pPrec->
Spl2 - pPrec->
Smi2) > 1.e-5 )
3024 phiz_0_MSA = vMSA.
x;
3025 zeta_0_MSA = vMSA.
y;
3036 pPrec->
phiz_0 = - phiz_0 - vMSA.
x;
3037 pPrec->
zeta_0 = - zeta_0 - vMSA.
y;
3040 printf(
"v_0 = %.6f\n",pPrec->
v_0);
3041 printf(
"c1 = %.6f\n\n",pPrec->
c1);
3043 printf(
"eta = %.6f\n",pPrec->
eta);
3044 printf(
"eta2 = %.6f\n",pPrec->
eta2);
3045 printf(
"eta3 = %.6f\n",pPrec->
eta3);
3046 printf(
"eta4 = %.6f\n",pPrec->
eta4);
3047 printf(
"ieta = %.6f\n",pPrec->
inveta);
3048 printf(
"ieta2 = %.6f\n",pPrec->
inveta2);
3049 printf(
"ieta3 = %.6f\n\n",pPrec->
inveta3);
3051 printf(
"SAv = %.6f\n",pPrec->
SAv);
3052 printf(
"SAv2 = %.6f\n\n",pPrec->
SAv2);
3053 printf(
"invSAv2 = %.6f\n\n",pPrec->
invSAv2);
3054 printf(
"invSAv = %.6f\n\n",pPrec->
invSAv);
3056 printf(
"J_0_norm = %.6f\n",pPrec->
J_0_norm);
3057 printf(
"L_0_norm = %.6f\n\n",pPrec->
L_0_norm);
3059 printf(
"phiz_0 = %.6f\n",pPrec->
phiz_0);
3060 printf(
"zeta_0 = %.6f\n",pPrec->
zeta_0);
3061 printf(
"phiz_0_MSA = %.6f\n",phiz_0_MSA);
3062 printf(
"zeta_0_MSA = %.6f\n\n",zeta_0_MSA);
3071 return ( psi0 - 0.75*pPrec->
g0 * pPrec->
delta_qq * (1.0 + psi1*v + psi2*v2) / (v2*v) );
3097 const double B = vBCD.
x;
3098 const double C = vBCD.
y;
3099 const double D = vBCD.
z;
3101 const double S1Norm2 = pPrec->
S1_norm_2;
3102 const double S2Norm2 = pPrec->
S2_norm_2;
3106 const double B2 =
B *
B;
3107 const double B3 = B2 *
B;
3108 const double BC =
B * C;
3110 const double p = C - B2 / 3;
3111 const double qc = (2.0/27.0)*B3 - BC/3.0 + D;
3113 const double sqrtarg = sqrt(-
p/3.0);
3114 double acosarg = 1.5 * qc/
p/sqrtarg;
3125 const double theta = acos(acosarg) / 3.0;
3126 const double cos_theta = cos(
theta);
3128 const double dotS1Ln = pPrec->
dotS1Ln;
3129 const double dotS2Ln = pPrec->
dotS2Ln;
3131 double S32, Spl2, Smi2;
3136 if(
theta !=
theta || sqrtarg!=sqrtarg || dotS1Ln == 1 || dotS2Ln == 1 || dotS1Ln == -1 || dotS2Ln == -1 || S1Norm2 == 0
3156 tmp3 = 2.0*sqrtarg*cos_theta -
B/3.0;
3201 const double JNorm2 = (LNorm*LNorm + (2.0 * LNorm * pPrec->
c1_over_eta) + pPrec->
SAv2);
3202 return sqrt(JNorm2);
3214 double sn, cn, dn,
m, psi;
3221 if( fabs(pPrec->
Smi2 - pPrec->
Spl2) < 1.0e-5 )
3233 gsl_sf_elljac_e(psi,
m, &
sn, &cn, &dn);
3239 return sqrt(SNorm2);
3251 const double JNorm2 = JNorm * JNorm;
3254 const double LNorm2 = LNorm * LNorm;
3257 const double S1Norm2 = pPrec->
S1_norm_2;
3258 const double S2Norm2 = pPrec->
S2_norm_2;
3260 const double q = pPrec->
qq;
3261 const double eta = pPrec->
eta;
3263 const double J2mL2 = (JNorm2 - LNorm2);
3264 const double J2mL2Sq = J2mL2 * J2mL2;
3274 const double Seff = pPrec->
Seff;
3279 vout.
x = (LNorm2 + S1Norm2)*
q + 2.0*LNorm*Seff - 2.0*JNorm2 -
3280 S1Norm2 - S2Norm2 + (LNorm2 + S2Norm2)/
q;
3283 vout.
y = J2mL2Sq - 2.0*LNorm*Seff*J2mL2 - 2.0*((1.0 -
q)/
q)*LNorm2*(S1Norm2 -
q*S2Norm2) +
3284 4.0*eta*LNorm2*Seff*Seff - 2.0*
delta*(S1Norm2 - S2Norm2)*Seff*LNorm +
3285 2.0*((1.0 -
q)/
q)*(
q*S1Norm2 - S2Norm2)*JNorm2;
3288 vout.
z = ((1.0 -
q)/
q)*(S2Norm2 -
q*S1Norm2)*J2mL2Sq
3289 + deltaSq*(S1Norm2 - S2Norm2)*(S1Norm2 - S2Norm2)*LNorm2/eta
3290 + 2.0*
delta*LNorm*Seff*(S1Norm2 - S2Norm2)*J2mL2;
3305 const double v2 = v*v;
3306 const double v3 = v*v2;
3307 const double v4 = v2*v2;
3308 const double v6 = v3*v3;
3310 const double JNorm2 = JNorm * JNorm;
3312 vector vout = {0.,0.,0.};
3314 const double Seff = pPrec->
Seff;
3319 vout.
x = JNorm * ( 0.75*(1.0 - Seff*v) * v2 * (pPrec->
eta3 + 4.0*pPrec->
eta3*Seff*v
3321 - 4.0*pPrec->
eta*Seff*(JNorm2 - pPrec->
Spl2)*v3 + (JNorm2 - pPrec->
Spl2)*(JNorm2 - pPrec->
Spl2)*v4*pPrec->
inveta) );
3324 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 );
3327 vout.
z = JNorm * ( 0.75 * pPrec->
inveta * (pPrec->
Spl2 - pPrec->
Smi2)*(pPrec->
Spl2 - pPrec->
Smi2)*(1.0 - Seff * v)*v6 );
3335 double v_3 = v * v_2;
3336 double v_4 = v_2 * v_2;
3337 double v_6 = v_2 * v_4;
3338 double J_norm = JNorm;
3340 double eta = pPrec->
eta;
3341 double eta_2 = eta * eta;
3344 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;
3358 const double LNorm2 = LNorm * LNorm;
3359 const double JNorm2 = JNorm * JNorm;
3361 vector vout = {0.,0.,0.};
3363 vout.
x = -( JNorm2 - (LNorm + pPrec->
Spl)*(LNorm + pPrec->
Spl))
3364 * ( (JNorm2 - (LNorm - pPrec->
Spl)*(LNorm - pPrec->
Spl)) );
3365 vout.
y = -2.0*(pPrec->
Spl2 - pPrec->
Smi2)*(JNorm2 + LNorm2 - pPrec->
Spl2);
3379 double costhetaLJ = 0.5*(J_norm*J_norm + L_norm*L_norm - S_norm*S_norm)/(L_norm * J_norm);
3381 if (costhetaLJ > 1.0) costhetaLJ = +1.0;
3382 if (costhetaLJ < -1.0) costhetaLJ = -1.0;
3394 return ( -0.75 * pPrec->
g0 * pPrec->
delta_qq * (1.0 + pPrec->
psi1*v + pPrec->
psi2*v2) / (v2*v) );
3406 const double v2 = v*v;
3408 const double A_coeff = -1.5 * (v2 * v2 * v2) * (1.0 - v*pPrec->
Seff) * pPrec->
sqrt_inveta;
3409 const double psi_dot = 0.5 * A_coeff * sqrt(pPrec->
Spl2 - pPrec->
S32);
3420 const double invv = 1.0/v;
3421 const double invv2 = invv * invv;
3423 const double LNewt = (pPrec->
eta/v);
3425 const double c1 = pPrec->
c1;
3426 const double c12 =
c1 *
c1;
3428 const double SAv2 = pPrec->
SAv2;
3429 const double SAv = pPrec->
SAv;
3430 const double invSAv = pPrec->
invSAv;
3431 const double invSAv2 = pPrec->
invSAv2;
3434 const double log1 = log( fabs(
c1 + JNorm*pPrec->
eta + pPrec->
eta*LNewt) );
3435 const double log2 = log( fabs(
c1 + JNorm*SAv*v + SAv2*v) );
3438 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)
3443 const double phiz_1_coeff = - 0.5 * JNorm * pPrec->
inveta2 * (
c1 + pPrec->
eta * LNewt) + 0.5*pPrec->
inveta3*(c12 - pPrec->
eta2*SAv2)*log1;
3446 const double phiz_2_coeff = -JNorm + SAv*log2 -
c1*log1*pPrec->
inveta;
3449 const double phiz_3_coeff = JNorm*v - pPrec->
eta*log1 +
c1*log2*pPrec->
invSAv;
3452 const double phiz_4_coeff = (0.5*JNorm*invSAv2*v)*(
c1 + v*SAv2) - (0.5*invSAv2*invSAv)*(c12 - pPrec->
eta2*SAv2)*log2;
3455 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)
3456 + (0.5*
c1*invSAv2*invSAv2*invSAv)*(c12 - pPrec->
eta2*SAv2)*log2;
3474 if (phiz_out != phiz_out) phiz_out = 0;
3492 const double invv = 1.0/v;
3493 const double invv2 = invv*invv;
3494 const double invv3 = invv*invv2;
3495 const double v2 = v*v;
3496 const double logv = log(v);
3500 double zeta_out = pPrec->
eta * (
3510 if (zeta_out != zeta_out) zeta_out = 0;
3522 vector c_vec = {0.,0.,0.};
3523 vector d_vec = {0.,0.,0.};
3529 vector vMSA = {0.,0.,0.};
3537 const double c0 = c_vec.
x;
3538 const double c2 = c_vec.
y;
3539 const double c4 = c_vec.
z;
3541 const double d0 = d_vec.
x;
3542 const double d2 = d_vec.
y;
3543 const double d4 = d_vec.
z;
3546 const double two_d0 = 2.0 * d0;
3549 const double sd = sqrt( fabs(d2*d2 - 4.0*d0*d4) );
3552 const double A_theta_L = 0.5 * ( (JNorm/LNorm) + (LNorm/JNorm) - (pPrec->
Spl2 / (JNorm * LNorm)) );
3555 const double B_theta_L = 0.5 * pPrec->
Spl2mSmi2 / (JNorm * LNorm);
3558 const double nc_num = 2.0*(d0 + d2 + d4);
3559 const double nc_denom = two_d0 + d2 + sd;
3562 const double nc = nc_num / nc_denom;
3563 const double nd = nc_denom / two_d0;
3565 const double sqrt_nc = sqrt(fabs(nc));
3566 const double sqrt_nd = sqrt(fabs(nd));
3574 const double tan_psi = tan(psi);
3575 const double atan_psi = atan(tan_psi);
3577 double C1,
C2, C2num, C2den;
3580 C1 = -0.5 * (
c0/d0 - 2.0*(
c0+
c2+c4)/nc_num);
3583 C2num =
c0*( -2.0*d0*d4 + d2*d2 + d2*d4 ) -
c2*d0*( d2 + 2.0*d4 ) + c4*d0*( two_d0 + d2 );
3584 C2den = 2.0 * d0 * sd * (d0 + d2 + d4);
3592 double phiz_0_MSA_Cphi_term, phiz_0_MSA_Dphi_term;
3598 phiz_0_MSA_Cphi_term = 0.0;
3602 if(pflag == 222 || pflag == 223)
3605 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;
3610 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) ) );
3618 phiz_0_MSA_Dphi_term = 0.0;
3622 if(pflag == 222 || pflag == 223)
3625 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;
3630 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) ) );
3635 vMSA.
x = ( phiz_0_MSA_Cphi_term + phiz_0_MSA_Dphi_term );
3640 if(pflag == 222 || pflag == 223 || pflag == 224)
3646 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));
3651 vMSA.
y = ( ( A_theta_L * (Cphi + Dphi) ) + (2.0 * d0 * B_theta_L) * ( ( Cphi / (sd - d2) ) - ( Dphi / (sd + d2) ) ) ) / psi_dot;
3655 if (vMSA.
x != vMSA.
x) vMSA.
x = 0;
3656 if (vMSA.
y != vMSA.
y) vMSA.
y = 0;
3696 return (v1.
x*v2.
x) + (v1.
y*v2.
y) + (v1.
z*v2.
z);
3703 v3.
x = v1.
y*v2.
z - v1.
z*v2.
y;
3704 v3.
y = v1.
z*v2.
x - v1.
x*v2.
z;
3705 v3.
z = v1.
x*v2.
y - v1.
y*v2.
x;
3712 const double dot_product = (v1.
x*v1.
x) + (v1.
y*v1.
y) + (v1.
z*v1.
z);
3713 return sqrt(dot_product);
3747 const double rsinth = v1.
r * sin(v1.
theta);
3749 v2.
x = rsinth * cos(v1.
phi);
3750 v2.
y = rsinth * sin(v1.
phi);
3760 v2.
r = sqrt(v1.
x*v1.
x + v1.
y*v1.
y + v1.
z*v1.
z);
3772 v2.
x = v1.
x * cos(angle) - v1.
y * sin(angle);
3773 v2.
y = v1.
x * sin(angle) + v1.
y * cos(angle);
3784 v2.
x = + v1.
x * cos(angle) + v1.
z * sin(angle);
3786 v2.
z = - v1.
x * sin(angle) + v1.
z * cos(angle);
3799 REAL8 cosa=cos(angle), sina=sin(angle);
3802 REAL8 tmp2 = tmpx*sina + tmpy*cosa;
3816 REAL8 cosa=cos(angle), sina=sin(angle);
3819 REAL8 tmp2 = - tmpx*sina + tmpz*cosa;
3829 const REAL8 norm = sqrt(
x*
x +
y*
y + z*z);
3832 theta = acos(z / (norm + 1
e-16));
3850 const double rsintheta = mag * sin(
theta);
3852 v1.
x = rsintheta * cos(phi);
3853 v1.
y = rsintheta * sin(phi);
3866 memcpy(start->
data->
data + origlen -2,
end->data->data,
3867 (
end->data->length)*
sizeof(
REAL8));
3880 int success = GSL_SUCCESS;
3882 double ftrans = fmaxPN;
3883 double f1 = 0.97 *ftrans ;
3884 double f2 = 0.99 *ftrans ;
3885 double f1sq = f1*f1, f2sq = f2*f2;
3886 double f1cube = f1sq*f1;
3888 double alpha1, alpha2, dalpha1;
3890 success = gsl_spline_eval_e(&spline_alpha, f1, &accel_alpha,&alpha1);
3892 if(success != GSL_SUCCESS)
3898 success = success + gsl_spline_eval_deriv_e (&spline_alpha, f1, &accel_alpha,&dalpha1);
3900 if(success != GSL_SUCCESS)
3907 success = success + gsl_spline_eval_e (&spline_alpha, f2, &accel_alpha,&alpha2);
3909 if(success != GSL_SUCCESS)
3915 double aC=0., bC=0., cC=0.;
3917 if(success == GSL_SUCCESS){
3919 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));
3921 bC = (pow(f1,4)*f2sq*(f1*(f1 - f2)*(f1 + f2)*dalpha1 + 2*f2sq*(-alpha1 + alpha2)))/(2.*pow(f1sq - f2sq,2));
3923 cC = (f1sq*(f1*(-pow(f1,4) + pow(f2,4))*dalpha1 + 4*pow(f2,4)*(alpha1 - alpha2)))/(2.*pow(f1sq - f2sq,2));
3926 alpha_params->
aRD = aC;
3927 alpha_params->
bRD = bC;
3928 alpha_params->
cRD = cC;
3938 double Mf4 = Mf2*Mf2;
3939 double minalpha=alpha_params->
aRD + alpha_params->
bRD/Mf4 + alpha_params->
cRD/Mf2;
3948 double Mf3 = Mf2*Mf;
3949 double Mf5 = Mf2*Mf3;
3951 return (4.*alpha_params->
bRD/Mf5+2.*alpha_params->
cRD/Mf3);
3958 int success = GSL_SUCCESS;
3968 double f1 = 0.97 *fmaxPN ;
3969 double f2 = 0.98 *fmaxPN ;
3970 double f1sq = f1*f1, f2sq = f2*f2 ;
3971 double ef1 = exp(kappa*f1), ef2 = exp(kappa*f2);
3974 success = gsl_spline_eval_e(&spline_cosb, f1, &accel_cosb, &cosbeta1);
3977 success=gsl_spline_eval_deriv_e (&spline_cosb, f2, &accel_cosb,&dcosbeta2);
3980 success = gsl_spline_eval_e(&spline_cosb, f2, &accel_cosb,&cosbeta2);
3983 success = gsl_spline_eval_e(&spline_cosb, pPrec->
fmax_inspiral, &accel_cosb, &cosbetamax);
3987 if(fabs(cosbeta1)>1 || fabs(cosbeta2)>1 || fabs(cosbetamax)>1||success!=GSL_SUCCESS)
3995 success = GSL_SUCCESS;
4000 double beta1 = acos(cosbeta1);
4001 double beta2 = acos(cosbeta2);
4002 double sqrtarg = 1.-cosbeta2*cosbeta2;
4003 double dbeta2 = - dcosbeta2/sqrt((sqrtarg <= 0. ? 1. : sqrtarg));
4013 off = (cosbetamax < 0. ?
LAL_PI : 0.);
4016 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);
4018 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);
4020 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);
4054 double Mf3 = Mf2* Mf;
4055 beta = exp(-Mf*kappa)/Mf*(beta_params->
aRD/Mf+beta_params->
bRD/(Mf2)+beta_params->
cRD/Mf3)+beta_params->
dRD;
4072 double beta =
b0 +
b1*Mf +
b2*Mf*Mf + b3*Mf*Mf*Mf;
4084 REAL8 Mf_high = Mf+deltaMf;
4085 REAL8 alphadoti, Mf_aux, gammai;
4086 REAL8 step = (Mf_high-Mf)*0.25;
4088 double alphadotcosbeta[5], cosbeta_aux[5];
4090 int status_alpha=GSL_SUCCESS, status_beta=GSL_SUCCESS;
4092 if(Mf<=pPrec->ftrans_MRD)
4094 for(
UINT4 jdx=0; jdx<5; jdx++){
4099 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__);
4100 alphadotcosbeta[jdx]=cosbeta_aux[jdx]*alphadoti;
4107 for(
UINT4 jdx=0; jdx<5; jdx++){
4112 alphadotcosbeta[jdx]=cosbeta_aux[jdx]*alphadoti;
4116 gammai= -2.*step/45.*(7.*alphadotcosbeta[0]+32.*alphadotcosbeta[1]+12.*alphadotcosbeta[2]+32.*alphadotcosbeta[3]+7.*alphadotcosbeta[4]);
4119 return(status_beta+status_alpha);
4149 size_t output_length = freqsIN->
length;
4159 REAL8 alphamin=0., cosbetamin=0.;
4162 if(
status != GSL_SUCCESS)
4164 XLALPrintError(
"Error in %s: could not evaluate alpha(f_min). Got alpha=%.4f \n",__func__,alphamin);
4168 if (
status != GSL_SUCCESS)
4169 {
XLALPrintError(
"Error in %s: could not evaluate cosbeta(f_min). Got cosbeta=%.4f \n",__func__,cosbetamin);
4190 (*gammaFS)->data[0] = 0.;
4191 (*alphaFS)->data[0] = alphamin-pPrec->
alpha_ref+alphaOff;
4192 (*cosbetaFS)->data[0] = cosbetamin;
4195 REAL8 alphai=0., cosbetai=0., gammai=0.;
4199 for(
UINT4 i = 1;
i < output_length;
i++ ){
4204 if(Mf<pPrec->ftrans_MRD)
4213 (*cosbetaFS)->data[
i] = cosbetai;
4214 (*gammaFS)->
data[
i] = gammai;
4225 (*cosbetaFS)->data[
i]=cos(beta_MRD);
4226 REAL8 deltagamma = 0.;
4229 (*gammaFS) ->
data[
i] = (*gammaFS)->
data[
i-1]+deltagamma;
4230 else (*gammaFS) ->
data[
i] = (*gammaFS)->
data[
i-1];
4236 (*alphaFS)->data[
i]=(*alphaFS)->data[
i-1];
4237 (*cosbetaFS)->data[
i]=(*cosbetaFS)->
data[
i-1];
4238 (*gammaFS) ->
data[
i]=(*gammaFS)->
data[
i-1];
4315 size_t iStart = (size_t) (fmin / deltaF);
4316 size_t iStop = (size_t) (fmax / deltaF) + 1;
4317 size_t output_length = iStop-iStart;
4320 XLALPrintError(
"Error in %s: no. of points is insufficient for spline interpolation of gamma",__func__);
4327 frequencies->
data[0]=Mfmin;
4331 gamma_array->
data[0]=0.;
4333 int gamma_status=GSL_SUCCESS;
4335 for(
UINT4 i = 1;
i < output_length;
i++ )
4339 frequencies->
data[
i]=Mf;
4340 REAL8 deltagamma=0.;
4342 if(Mf<pPrec->ftrans_MRD){
4344 gamma_array->
data[
i]=gamma_array->
data[
i-1]+deltagamma;
4349 gamma_array->
data[
i]=gamma_array->
data[
i-1]+deltagamma;
4357 if(gamma_status!=GSL_SUCCESS)
status=gamma_status;
4363 pPrec->
gamma_acc = gsl_interp_accel_alloc();
4364 pPrec->
gamma_spline = gsl_spline_alloc(gsl_interp_cspline, output_length);
4372 gsl_interp_accel_free(pPrec->
alpha_acc);
4419 REAL8 fgw_Mf, fgw_Hz, Mfmax_PN=0.;
4422 REAL8 LNhatx_temp,LNhaty_temp,LNhatz_temp;
4440 alphaaux->
data[
i] = atan2(LNhaty_temp, LNhatx_temp);
4441 cosbeta->
data[
i] = LNhatz_temp;
4442 fgw->
data[
i] = fgw_Mf;
4453 REAL8 fmax_inspiral;
4455 fmax_inspiral = Mfmax_PN;
4457 fmax_inspiral = Mfmax_PN-pWF->
deltaMF;
4459 if(fmax_inspiral > pWF->
fRING-pWF->
fDAMP) fmax_inspiral = 1.020 * pWF->
fMECO;
4468 pPrec->
alpha_acc = gsl_interp_accel_alloc();
4469 pPrec->
alpha_spline = gsl_spline_alloc(gsl_interp_cspline, lenPN);
4473 if (
status != GSL_SUCCESS)
4475 XLALPrintError(
"Error in %s: error in computing gsl spline for alpha.\n",__func__);
4480 pPrec->
cosbeta_spline = gsl_spline_alloc(gsl_interp_cspline, lenPN);
4483 if (
status != GSL_SUCCESS)
4485 XLALPrintError(
"Error in %s: error in computing gsl spline for cos(beta).\n",__func__);
4491 if(
status != GSL_SUCCESS)
4493 XLALPrintError(
"Error in %s: error in computing cosbeta.\n",__func__);
4517 REAL8 chi_perp_norm = S_perp_norm *pow(m1 + m2,2)/pow(m1,2);
4560 if(
status != GSL_SUCCESS){
4564 gsl_interp_accel_free(pPrec->
alpha_acc);
4605 REAL8 s1x=chi1x, s1y=chi1y, s1z=chi1z;
4606 REAL8 s2x=chi2x, s2y=chi2y, s2z=chi2z;
4617 if (PrecVersion==311 || PrecVersion==321)
4630 if(lscorr!=0)
XLAL_PRINT_WARNING(
"IMRPhenomXP with SpinTaylor angles was only reviewed for lscorr=0.\n");
4656 REAL8 lnhatx,lnhaty,lnhatz, e1y,e1z,e1x;
4657 lnhatx = lnhaty = e1y = e1z = 0;
4662 if(approx_name==NULL)
4663 approx_name=
"SpinTaylorT4";
4671 if(fmin>fMECO_Hz &&(PrecVersion==320 || PrecVersion==321))
4683 REAL8 deltaT_coarse = 0.5*coarse_fac/(fCut);
4693 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);
4706 &S1x, &S1y, &S1z, &S2x, &S2y, &S2z,
4707 &LNhatx, &LNhaty, &LNhatz, &E1x, &E1y, &E1z,
4708 deltaT_coarse, m1_SI, m2_SI, fS, fE, s1x, s1y, s1z, s2x, s2y,
4709 s2z, lnhatx, lnhaty, lnhatz, e1x, e1y, e1z, lambda1, lambda2,
4710 quadparam1, quadparam2, spinO, tideO, phaseO, lscorr, approx);
4716 if(
V->data->length>1){
4718 REAL8TimeSeries *V2=NULL, *Phi2=NULL, *S1x2=NULL, *S1y2=NULL, *S1z2=NULL, *S2x2=NULL, *S2y2=NULL, *S2z2=NULL;
4719 REAL8TimeSeries *LNhatx2=NULL, *LNhaty2=NULL, *LNhatz2=NULL, *E1x2=NULL, *E1y2=NULL, *E1z2=NULL;
4726 &S1x2, &S1y2, &S1z2, &S2x2, &S2y2, &S2z2,
4727 &LNhatx2, &LNhaty2, &LNhatz2, &E1x2, &E1y2, &E1z2,
4728 deltaT_coarse, m1_SI, m2_SI, fS, fE, s1x, s1y, s1z, s2x, s2y,
4729 s2z, lnhatx, lnhaty, lnhatz, e1x, e1y, e1z, lambda1, lambda2,
4730 quadparam1, quadparam2, spinO, tideO, phaseO, lscorr, approx);
4744 LNhatx =
appendTS(LNhatx, LNhatx2);
4745 LNhaty =
appendTS(LNhaty, LNhaty2);
4746 LNhatz =
appendTS(LNhatz, LNhatz2);
4787 int lenLow=
V->data->length;
4788 int nbuffer=
MIN(9,lenLow-1);
4790 if(lenLow-1-nbuffer<0) nbuffer=lenLow-1;
4792 copyLength=lenLow-1-nbuffer;
4794 REAL8 vtrans =
V->data->data[lenLow-1-nbuffer];
4795 REAL8 ftrans = pow(vtrans,3.)/piGM;
4801 REAL8 E1x_trans, E1y_trans, E1z_trans;
4802 E1x_trans = E1x->
data->
data[lenLow-1-nbuffer];
4803 E1y_trans = E1y->
data->
data[lenLow-1-nbuffer];
4804 E1z_trans = E1z->
data->
data[lenLow-1-nbuffer];
4806 REAL8 S1x_trans, S1y_trans, S1z_trans, S2x_trans, S2y_trans, S2z_trans;
4807 S1x_trans = S1x->
data->
data[lenLow-1-nbuffer];
4808 S1y_trans = S1y->
data->
data[lenLow-1-nbuffer];
4809 S1z_trans = S1z->
data->
data[lenLow-1-nbuffer];
4811 S2x_trans = S2x->
data->
data[lenLow-1-nbuffer];
4812 S2y_trans = S2y->
data->
data[lenLow-1-nbuffer];
4813 S2z_trans = S2z->
data->
data[lenLow-1-nbuffer];
4819 XLAL_CHECK(fS > 0.,
XLAL_EFUNC,
"Error: Transition frequency in PN integration is not positive.\n");
4821 REAL8TimeSeries *Phi_PN=NULL, *E1x_PN=NULL, *E1y_PN=NULL, *E1z_PN=NULL;
4823 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);
4837 XLALPrintError(
"Error in %s: no. of points is insufficient for spline interpolation",__func__);
4857 copyLength=
V->data->length-1;
4858 if(copyLength < 4) {
4859 XLALPrintError(
"Error in %s: no. of points is insufficient for spline interpolation",__func__);
4946 fminAngles = (pWF->
fMin-buffer)*2./pPrec->
M_MAX;
4948 XLAL_CHECK(fminAngles > 0.,
XLAL_EFUNC,
"Error - %s: fMin is too low and numerical angles could not be computed.\n",__func__);
5005 if(fRef < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef must be positive or set to 0 to ignore.\n"); }
5011 if(fRef > 0.0 && fRef < fmin){
XLAL_ERROR(
XLAL_EDOM,
"fRef must be >= fmin or =0 to use fmin.\n"); }
5014 size_t iStart = (size_t) (fmin / deltaF);
5015 size_t iStop = (size_t) (fmax / deltaF) + 1;
5016 size_t output_length = iStop-iStart;
5024 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, s1z, s2z, deltaF, fRef, phiRef, fmin, fmax, 1e6*
LAL_PC_SI, 0., LALparams, 0);
5030 status =
IMRPhenomXGetAndSetPrecessionVariables(pWF,pPrec,m1_SI,m2_SI,s1x,s1y,s1z,s2x,s2y,s2z,LALparams,0);
5040 REAL8 alphamin=0., cosbetamin=0.;
5071 (*gammaFS)->data[0] = 0.;
5072 (*alphaFS)->data[0] = alphamin-pPrec->
alpha_ref+alphaOff;
5073 (*cosbetaFS)->data[0] = cosbetamin;
5076 REAL8 alphai=0., cosbetai=0., gammai=0.;
5080 frequencies->
data[0]=Mfmin;
5082 for(
UINT4 i = 1;
i < output_length;
i++ ){
5085 frequencies->
data[
i]=Mf;
5086 REAL8 deltagamma=0.;
5088 if(Mf<pPrec->ftrans_MRD)
5098 gammai=(*gammaFS)->data[
i-1]+deltagamma;
5101 (*cosbetaFS)->data[
i] = cosbetai;
5102 (*gammaFS)->
data[
i] = gammai;
5114 (*cosbetaFS)->data[
i]=cos(beta_MRD);
5118 gammai=(*gammaFS)->data[
i-1]+deltagamma;
5119 (*gammaFS)->
data[
i] =gammai;
5126 (*alphaFS)->data[
i]=(*alphaFS)->data[
i-1];
5127 (*cosbetaFS)->data[
i]=(*cosbetaFS)->
data[
i-1];
5128 (*gammaFS) ->
data[
i]=(*gammaFS)->
data[
i-1];
5136 pPrec->
gamma_acc = gsl_interp_accel_alloc();
5137 pPrec->
gamma_spline = gsl_spline_alloc(gsl_interp_cspline, output_length);
5147 gsl_interp_accel_free(pPrec->
alpha_acc);
5153 gsl_interp_accel_free(pPrec->
gamma_acc);
5178 if(Mf<pPrec->ftrans_MRD){
5181 XLAL_CHECK(
status == GSL_SUCCESS,
XLAL_EFUNC,
"%s: error in alpha interpolation at f=%.12f, when fmin_integration=%.12f, with input parameters q=%.12f, Mtot=%.12f MSUN, chi1=[%.12f,%.12f,%.12f], chi2=[%.12f,%.12f,%.12f].\n",__func__,
XLALSimIMRPhenomXUtilsMftoHz(Mf,pWF->
Mtot),pPrec->
fmin_integration,pWF->
q, pWF->
Mtot, pPrec->
chi1x,pPrec->
chi1y,pPrec->
chi1z,pPrec->
chi2x,pPrec->
chi2y,pPrec->
chi2z);
5195 XLAL_CHECK(
status == GSL_SUCCESS,
XLAL_EFUNC,
"%s: error in alpha interpolation at f=%.12f, when fmin_integration=%.12f, with input parameters q=%.12f, Mtot=%.12f MSUN, chi1=[%.12f,%.12f,%.12f], chi2=[%.12f,%.12f,%.12f].\n",__func__,
XLALSimIMRPhenomXUtilsMftoHz(Mf,pWF->
Mtot),pPrec->
fmin_integration,pWF->
q, pWF->
Mtot, pPrec->
chi1x,pPrec->
chi1y,pPrec->
chi1z,pPrec->
chi2x,pPrec->
chi2y,pPrec->
chi2z);
5240 XLAL_CHECK(
status == GSL_SUCCESS,
XLAL_EFUNC,
"%s: error in beta interpolation at f=%.12f, when fmin_integration=%.12f, with input parameters q=%.12f, Mtot=%.12f MSUN, chi1=[%.12f,%.12f,%.12f], chi2=[%.12f,%.12f,%.12f].\n",__func__,
XLALSimIMRPhenomXUtilsMftoHz(Mf,pWF->
Mtot),pPrec->
fmin_integration,pWF->
q, pWF->
Mtot, pPrec->
chi1x,pPrec->
chi1y,pPrec->
chi1z,pPrec->
chi2x,pPrec->
chi2y,pPrec->
chi2z);
5241 cosbeta =
MAX(-1,
MIN(1, cosbeta));
5255 XLAL_CHECK(
status == GSL_SUCCESS,
XLAL_EFUNC,
"%s: error in beta interpolation at f=%.12f, when fmin_integration=%.12f, with input parameters q=%.12f, Mtot=%.12f MSUN, chi1=[%.12f,%.12f,%.12f], chi2=[%.12f,%.12f,%.12f].\n",__func__,
XLALSimIMRPhenomXUtilsMftoHz(Mf,pWF->
Mtot),pPrec->
fmin_integration,pWF->
q,pWF->
Mtot, pPrec->
chi1x,pPrec->
chi1y,pPrec->
chi1z,pPrec->
chi2x,pPrec->
chi2y,pPrec->
chi2z);
5256 cosbeta =
MAX(-1,
MIN(1, cosbeta));
5282 XLAL_ERROR(
XLAL_EDOM,
"Precessing version %d is not supported by PhenomX with SpinTaylor angles.\n",pflag);
5299 int nmodes=modeseq->
length/2;
5300 float M_MAX=1., M_MIN=4.;
5301 for(
int jj=0; jj<nmodes; jj++)
5303 if(abs(modeseq->
data[2*jj+1])>M_MAX) M_MAX=(float)abs(modeseq->
data[2*jj+1]);
5304 if(abs(modeseq->
data[2*jj+1])<M_MIN) M_MIN=(
float)abs(modeseq->
data[2*jj+1]);
5317 REAL8 deltaFv1= 1./
MAX(4.,pow(2, ceil(log(seglen)/log(2))));
5340 double cBetah = 0.0;
5341 double sBetah = 0.0;
5352 const REAL8 cBetah2 = cBetah * cBetah;
5353 const REAL8 cBetah3 = cBetah * cBetah2;
5354 const REAL8 cBetah4 = cBetah * cBetah3;
5355 const REAL8 sBetah2 = sBetah * sBetah;
5356 const REAL8 sBetah3 = sBetah * sBetah2;
5357 const REAL8 sBetah4 = sBetah * sBetah3;
5365 const COMPLEX16 d22[5] = {sBetah4, 2.0*cBetah*sBetah3, pPrec->
sqrt6*sBetah2*cBetah2, 2.0*cBetah3*sBetah, cBetah4};
5368 const COMPLEX16 d2m2[5] = {d22[4], -d22[3], d22[2], -d22[1], d22[0]};
5374 COMPLEX16 cexp_2i_alpha = cexp_i_alpha * cexp_i_alpha;
5375 COMPLEX16 cexp_mi_alpha = 1.0 / cexp_i_alpha;
5376 COMPLEX16 cexp_m2i_alpha = cexp_mi_alpha * cexp_mi_alpha;
5377 COMPLEX16 cexp_im_alpha_l2[5] = {cexp_m2i_alpha, cexp_mi_alpha, 1.0, cexp_i_alpha, cexp_2i_alpha};
5383 for(
int m=-2;
m<=2;
m++)
5386 COMPLEX16 A2m2emm = cexp_im_alpha_l2[-
m+2] * d2m2[
m+2] * Y2mA[
m+2];
5387 COMPLEX16 A22emmstar = cexp_im_alpha_l2[
m+2] * d22[
m+2] * conj(Y2mA[
m+2]);
5388 hp_sum += A2m2emm + A22emmstar;
5389 hc_sum += I*(A2m2emm - A22emmstar);
5393 COMPLEX16 eps_phase_hP = cexp(-2.0*I*epsilon) * hAS / 2.0;
5396 *hp = eps_phase_hP * hp_sum;
5397 *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
int IMRPhenomX_PNR_precompute_alpha_coefficients(IMRPhenomX_PNR_alpha_parameters *alphaParams, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
This function evaluates the coefficients outlined in Sec 7A of arXiv:2107.08876 for alpha.
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...
int IMRPhenomX_PNR_precompute_beta_coefficients(IMRPhenomX_PNR_beta_parameters *betaParams, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
This function evaluates the Ansatz coefficients of beta outlined in Eq.
int IMRPhenomX_PNR_BetaConnectionFrequencies(IMRPhenomX_PNR_beta_parameters *betaParams)
Here we work through the construction of the connection frequency for beta, outlined in Sec.
INT4 IMRPhenomX_PNR_GetAndSetCoPrecParams(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, LALDict *lalParams)
REAL8 IMRPhenomX_PNR_HMInterpolationDeltaF(REAL8 f_min, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
Here we compute an appropriate deltaF to be used when generating the (2,2) angle interpolants and map...
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:
REAL8 beta_SpinTaylor_IMR(REAL8 Mf, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, const IMRPhenomX_PNR_beta_parameters *betaParams)
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 beta_connection(double Mf, const IMRPhenomX_PNR_beta_parameters *betaParams)
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 IMRPhenomXPCheckMaxOpeningAngle(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, LALDict *lalParams)
Helper function to check if maximum opening angle > pi/2 or pi/4 and issues a warning.
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 get_deltaF_from_wfstruct(IMRPhenomXWaveformStruct *pWF)
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.
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...
int IMRPhenomX_InspiralAngles_SpinTaylor(PhenomXPInspiralArrays *arrays, double *fmin_PN, 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...
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.
static REAL8TimeSeries * appendTS(REAL8TimeSeries *start, REAL8TimeSeries *end)
used in numerical evaluation of Euler angles
REAL8 XLALSimIMRPhenomXPNEulerepsilonNNLO(REAL8 f, REAL8 eta, REAL8 chi1L, REAL8 chi2L, REAL8 chip, REAL8 epsilon0)
External wrapper to NNLO PN epsilon angle.
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)
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)
REAL8 alpha_SpinTaylor_IMR(REAL8 Mf, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
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)
REAL8 IMRPhenomXHM_GenerateRingdownFrequency(UINT4 ell, UINT4 emm, IMRPhenomXWaveformStruct *wf22)
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)
void XLALDestroyREAL8TimeSeries(REAL8TimeSeries *series)
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)
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 A4
MR Ansatz coefficient.
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 .
REAL8 chi2y_evolved
y-component of spin on secondary at end of SpinTaylor evolution
PhenomXPbetaMRD * beta_params
Parameters needed for analytical MRD continuation of cosbeta.
REAL8 Mfmin_integration
Minimum frequency covered by the integration of PN spin-precessing equations for SpinTaylor models
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.
REAL8 chi2x_evolved
x-component of spin on secondary at end of SpinTaylor evolution
INT4 IMRPhenomXReturnCoPrec
REAL8 psi1
as defined in Eq.
REAL8 alpha_offset_4
offset passed to modes.
vector S1_0
Initial value for .
REAL8 chi1x_evolved
x-component of spin on primary at end of SpinTaylor evolution
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 chi1y_evolved
y-component of spin on primary at end of SpinTaylor evolution
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 gamma_ref
Record value of gamma at f_ref.
REAL8 fmin_integration
Minimum frequency covered by the integration of PN spin-precessing equations for SpinTaylor models
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 .
UINT4 conditionalPrecMBand
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.
REAL8 chi2z_evolved
z-component of spin on secondary at end of SpinTaylor evolution
REAL8 chi1z_evolved
z-component of spin on primary at end of SpinTaylor evolution
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 integration_buffer
Buffer region for integration of SpinTaylor equations: added so that interpolated angles cover the fr...
REAL8 alpha_ref
Record value of alpha at f_ref.
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]