30#include <lal/LALStdlib.h>
31#include <lal/LALConstants.h>
32#include <lal/LALDatatypes.h>
33#include <lal/XLALError.h>
66 if (Mf <= Mf_beta_lower)
85 if (Mf >= Mf_beta_upper)
115 waveform_beta = pn_waveform_beta;
134 double msa_window = 1-pnr_window;
139 if (Mf <= Mf_beta_lower)
143 REAL8 pnr_beta, pn_beta;
148 pnr_beta = rescaled_beta;
149 pn_beta = beta_waveform;
159 pnr_beta = rescaled_beta1;
160 pn_beta = beta_waveform2;
165 if (Mf >= Mf_beta_upper)
229 const double omega =
LAL_PI * Mf;
230 const double omega_cbrt = cbrt(omega);
240 REAL8 L =
XLALSimIMRPhenomXLPNAnsatz(omega_cbrt, pWF->
eta / omega_cbrt, pPrec->
L0, pPrec->
L1, pPrec->
L2, pPrec->
L3, pPrec->
L4, pPrec->
L5, pPrec->
L6, pPrec->
L7, pPrec->
L8, pPrec->
L8L);
249 beta = acos(copysign(1.0, L + pPrec->
SL) / sqrt(1.0 + s2));
259 vector vangles = {0., 0., 0.};
264 REAL8 beta_full = acos(vangles.
z);
274 REAL8 beta_SingleSpin = acos(vangles_SingleSpin.
z);
277 if (Mf <= Mf_beta_lower)
280 REAL8 oscillations = beta_full - beta_SingleSpin;
281 REAL8 envelope = cos(2.0 *
LAL_PI * Mf / (4.0 * Mf_beta_lower)) * cos(2.0 *
LAL_PI * Mf / (4.0 * Mf_beta_lower));
282 beta = (beta_SingleSpin + oscillations * envelope);
286 beta = beta_SingleSpin;
300 if(isnan(beta_full) || isinf(beta_full))
XLAL_ERROR(
XLAL_EINVAL,
"Error in %s: beta_SpinTaylor_IMR returned invalid value.\n",__func__);
311 REAL8 beta_SingleSpin = acos(vangles_SingleSpin.
z);
314 if (Mf <= Mf_beta_lower)
317 REAL8 oscillations = beta_full - beta_SingleSpin;
318 REAL8 envelope = cos(2.0 *
LAL_PI * Mf / (4.0 * Mf_beta_lower)) * cos(2.0 *
LAL_PI * Mf / (4.0 * Mf_beta_lower));
319 beta = (beta_SingleSpin + oscillations * envelope);
323 beta = beta_SingleSpin;
335 XLAL_ERROR(
XLAL_EINVAL,
"Error: IMRPhenomXPrecessionVersion not recognized in IMRPhenomX_PNR_GetPNBetaAtFreq.\n");
359 const double omega =
LAL_PI * Mf;
360 const double omega_cbrt = cbrt(omega);
371 const REAL8 L =
XLALSimIMRPhenomXLPNAnsatz(omega_cbrt, pWF->
eta / omega_cbrt, pPrec->
L0, pPrec->
L1, pPrec->
L2, pPrec->
L3, pPrec->
L4, pPrec->
L5, pPrec->
L6, pPrec->
L7, pPrec->
L8, pPrec->
L8L);
379 beta = acos(copysign(1.0, L + pPrec->
SL) / sqrt(1.0 + s2));
389 vector vangles = {0., 0., 0.};
394 beta = acos(vangles.
z);
409 XLAL_ERROR(
XLAL_EINVAL,
"Error: IMRPhenomXPrecessionVersion not recognized in IMRPhenomX_PNR_GetPNBetaAtFreq_fulltwospin.\n");
440 REAL8 chi_parr = (m1 + m2) * chi_eff / m1;
445 REAL8 L_3PN =
M*
M*
XLALSimIMRPhenomXLPNAnsatz(v, L_norm, pPrec->
L0, pPrec->
L1, pPrec->
L2, pPrec->
L3, pPrec->
L4, pPrec->
L5, pPrec->
L6, pPrec->
L7, pPrec->
L8, pPrec->
L8L);
449 REAL8 costheta_temp = chi_parr / chi_temp;
473 REAL8 S_perp = (J0 - (L0 - L)) * sin(
beta);
474 REAL8 chi_p = S_perp / (m1 * m1);
477 REAL8 chi = sqrt(chi_parr * chi_parr + chi_p * chi_p);
502 REAL8 nu = (m1 * m2) / (
M *
M);
510 REAL8 v = pow(w_orb, 1.0 / 3.0);
515 REAL8 cos_iota = cos(iota);
516 REAL8 sin_iota = sin(iota);
518 REAL8 cos_half_iota = cos(iota / 2.0);
519 REAL8 sin_half_iota = sin(iota / 2.0);
525 REAL8 N0 = 84.0 * sin_iota;
526 REAL8 N2 = 2.0 * (55.0 * nu - 107.0) * sin_iota;
527 REAL8 N3 = -7.0 * (5.0 * nu + 6.0 *
delta + 6.0) * chi * (2.0 * cos_iota - 1.0) * sin_theta + 56.0 * (3.0 *
LAL_PI - (1.0 +
delta - nu) * chi * cos_theta) * sin_iota;
529 REAL8 N = (N0 + N2 * v2 + N3 * v3) / cos_half_iota;
532 REAL8 D0 = 84.0 * cos_half_iota;
533 REAL8 D2 = 2.0 * (55.0 * nu - 107.0) * cos_half_iota;
534 REAL8 D3 = 14.0 * 4.0 * (3.0 *
LAL_PI + (nu - 1.0 -
delta) * chi * cos_theta) * cos_half_iota + 14.0 * (6.0 + 6.0 *
delta + 5.0 * nu) * chi * sin_theta * sin_half_iota;
564 eta = ( pWF->
eta >= 0.09 ) ? pPrec->
eta : 0.09;
569 REAL8 chiboundary = 0.80 - 0.20 * exp( -pow((pWF->
q - 6.0)/1.5, 8) );
618 REAL8 D = beta1 * beta1 * Mf;
619 REAL8 N = -2.0 * beta1 * (beta2 - beta1) + (beta1 * dbeta2 - beta2 * dbeta1) * Mf;
633 REAL8 D = (beta1 * Mf) * (beta1 * Mf);
634 REAL8 N = beta1 * (beta2 - beta1) - (beta1 * dbeta2 - beta2 * dbeta1) * Mf;
648 return 1.0 +
b1 * Mf +
b2 * Mf * Mf;
674 return B0 + (B1 + B2 * Mf + B3 * Mf * Mf) / (1.0 + B4 * (Mf + B5) * (Mf + B5));
692 return ((2.0 * B3 * B4 * B5 - B2 * B4) * Mf * Mf + (2.0 * B3 - 2.0 * B1 * B4 + 2.0 * B3 * B4 * B5 * B5) * Mf + (B2 - 2.0 * B1 * B4 * B5 + B2 * B4 * B5 * B5)) / pow((1.0 + B4 * (Mf + B5) * (Mf + B5)), 2);
710 REAL8 a = B2 * B4 * B4 - 2.0 * B3 * B4 * B4 * B5;
711 REAL8 b = -3.0 * B3 * B4 + 3.0 * B1 * B4 * B4 - 3.0 * B3 * B4 * B4 * B5 * B5;
712 REAL8 c = -3.0 * B2 * B4 + 6.0 * B1 * B4 * B4 * B5 - 3.0 * B2 * B4 * B4 * B5 * B5;
713 REAL8 d = B3 - B1 * B4 - 2.0 * B2 * B4 * B5 + 2.0 * B3 * B4 * B5 * B5 + 3.0 * B1 * B4 * B4 * B5 * B5 - 2.0 * B2 * B4 * B4 * B5 * B5 * B5 + B3 * B4 * B4 * B5 * B5 * B5 * B5;
715 return 2.0 * (
a * Mf * Mf * Mf + b * Mf * Mf +
c * Mf +
d) / pow((1.0 + B4 * (B5 + Mf) * (B5 + Mf)), 3);
733 REAL8 a = -B2 * B4 * B4 + 2.0 * B3 * B4 * B4 * B5;
734 REAL8 b = 4.0 * B3 * B4 - 4.0 * B1 * B4 * B4 + 4.0 * B3 * B4 * B4 * B5 * B5;
735 REAL8 c = 6.0 * B2 * B4 - 12.0 * B1 * B4 * B4 * B5 + 6.0 * B2 * B4 * B4 * B5 * B5;
736 REAL8 d = -4.0 * B3 + 4.0 * B1 * B4 + 8.0 * B2 * B4 * B5 - 8.0 * B3 * B4 * B5 * B5 - 12.0 * B1 * B4 * B4 * B5 * B5 + 8.0 * B2 * B4 * B4 * B5 * B5 * B5 - 4.0 * B3 * B4 * B4 * B5 * B5 * B5 * B5;
737 REAL8 e = -B2 - 2.0 * B3 * B5 + 4.0 * B1 * B4 * B5 + 2.0 * B2 * B4 * B5 * B5 - 4.0 * B3 * B4 * B5 * B5 * B5 - 4.0 * B1 * B4 * B4 * B5 * B5 * B5 + 3.0 * B2 * B4 * B4 * B5 * B5 * B5 * B5 - 2.0 * B3 * B4 * B4 * B5 * B5 * B5 * B5 * B5;
739 return 6.0 * B4 * (
a * Mf * Mf * Mf * Mf + b * Mf * Mf * Mf +
c * Mf * Mf +
d * Mf +
e) / pow((1.0 + B4 * (B5 + Mf) * (B5 + Mf)), 4);
771 REAL8 ddbeta_Mf_plus;
779 REAL8 dbeta_inflection;
793 root_term = B4 * (B2 - 2.0 * B3 * B5) * (B2 - 2.0 * B1 * B4 * B5 + B2 * B4 * B5 * B5) + (B3 - B1 * B4 + B3 * B4 * B5 * B5) * (B3 - B1 * B4 + B3 * B4 * B5 * B5);
795 Mf_plus = ((B3 - B1 * B4 + B3 * B4 * B5 * B5) + sqrt(root_term)) / (B4 * (B2 - 2.0 * B3 * B5));
796 Mf_minus = ((B3 - B1 * B4 + B3 * B4 * B5 * B5) - sqrt(root_term)) / (B4 * (B2 - 2.0 * B3 * B5));
801 if (ddbeta_Mf_plus > 0.0)
804 Mf_at_minimum = Mf_plus;
805 Mf_at_maximum = Mf_minus;
810 Mf_at_minimum = Mf_minus;
811 Mf_at_maximum = Mf_plus;
821 if (dbeta_inflection > 0.0)
830 chosen_dbeta = sign * ((dbeta_inflection / 100.0) * (dbeta_inflection / 100.0)) * 25.0;
833 d1 = 1.0 / dddbeta * (-ddbeta + sqrt(ddbeta * ddbeta + 2.0 * dddbeta * chosen_dbeta));
834 d2 = 1.0 / dddbeta * (-ddbeta - sqrt(ddbeta * ddbeta + 2.0 * dddbeta * chosen_dbeta));
845 delta = (d1 < d2) ? d1 : d2;
860 if (Mf_inflection >= 0.06)
862 Mf_low = Mf_inflection - 0.03;
866 Mf_low = 3.0 * Mf_inflection / 5.0;
875 if ((Mf_at_minimum > Mf_at_maximum) || (Mf_inflection > Mf_at_maximum))
879 if (Mf_at_maximum >= Mf_low)
881 Mf_IM = Mf_at_maximum +
delta;
891 if (Mf_at_minimum > 0.06)
893 Mf_IM = Mf_at_minimum - 0.03;
897 Mf_IM = 3.0 * Mf_at_minimum / 5.0;
905 if (Mf_at_minimum > Mf_inflection)
907 Mf_MR = Mf_at_minimum;
915 if ((Mf_IM < 0.0) || isnan(Mf_IM))
955 a = 2 * (B2 * B4 * B4 - 2 * B3 * B4 * B4 * B5);
956 b = 6 * (-B3 * B4 + B1 * B4 * B4 - B3 * B4 * B4 * B5 * B5);
957 c = 6 * (-B2 * B4 + 2 * B1 * B4 * B4 * B5 - B2 * B4 * B4 * B5 * B5);
958 d = 2 * (B3 - B1 * B4 - 2 * B2 * B4 * B5 + 2 * B3 * B4 * B5 * B5 + 3 * B1 * B4 * B4 * B5 * B5 - 2 * B2 * B4 * B4 * B5 * B5 * B5 + B3 * B4 * B4 * B5 * B5 * B5 * B5);
961 r = (3 *
a *
c - b * b) / (3 *
a *
a);
962 s = (2 * b * b * b - 9 *
a * b *
c + 27 *
a *
a *
d) / (27 *
a *
a *
a);
964 phi = acos(((3 *
s) / (2 *
r)) * csqrt(-3 /
r));
966 for (
int n = 0; n < 3; n++)
968 f[n] = 2 * csqrt(-
r / 3) * cos((phi - 2 * n *
LAL_PI) / 3) - b / (3 *
a);
997 b = 6 * (-B3 * B4 + B1 * B4 * B4 - B3 * B4 * B4 * B5 * B5);
998 c = 6 * (-B2 * B4 + 2 * B1 * B4 * B4 * B5 - B2 * B4 * B4 * B5 * B5);
999 d = 2 * (B3 - B1 * B4 - 2 * B2 * B4 * B5 + 2 * B3 * B4 * B5 * B5 + 3 * B1 * B4 * B4 * B5 * B5 - 2 * B2 * B4 * B4 * B5 * B5 * B5 + B3 * B4 * B4 * B5 * B5 * B5 * B5);
1001 f[0] = (1 / (2 * b)) * (-
c + csqrt(
c *
c - 4 * b *
d));
1002 f[1] = (1 / (2 * b)) * (-
c - csqrt(
c *
c - 4 * b *
d));
1034 REAL8 f_inflection = 0.0;
1037 a = 2.0 * (B2 * B4 * B4 - 2.0 * B3 * B4 * B4 * B5);
1038 b = 6.0 * (-B3 * B4 + B1 * B4 * B4 - B3 * B4 * B4 * B5 * B5);
1039 c = 6.0 * (-B2 * B4 + 2.0 * B1 * B4 * B4 * B5 - B2 * B4 * B4 * B5 * B5);
1040 d = 2.0 * (B3 - B1 * B4 - 2.0 * B2 * B4 * B5 + 2.0 * B3 * B4 * B5 * B5 + 3.0 * B1 * B4 * B4 * B5 * B5 - 2.0 * B2 * B4 * B4 * B5 * B5 * B5 + B3 * B4 * B4 * B5 * B5 * B5 * B5);
1043 if (fabs(
a) < 1
e-10)
1046 if (fabs(b) < 2
e-10)
1049 f_inflection = -
d /
c;
1059 for (
i = 0;
i < 2;
i++)
1064 f_inflection = f_inf[
i];
1081 for (
i = 0;
i < 3;
i++)
1083 f_IM = cimag(f_inf[
i]);
1087 f_temp = creal(f_inf[
i]);
1093 f_inflection = f_temp;
1101 f_inflection = creal(f_inf[1]);
1106 if (b / (3.0 *
a) > B5 / 2.0 - (2141.0 / 90988.0))
1108 f_inflection = creal(f_inf[0]);
1112 f_inflection = creal(f_inf[2]);
1118 return f_inflection;
1168 REAL8 derivative_beta_lower = (b3 -
b1) / (2.0 * dMf);
1169 REAL8 derivative_beta_upper = (b6 - b4) / (2.0 * dMf);
1175 beta_rescale_1 = isnan(beta_rescale_1) ? 0.0 : beta_rescale_1;
1176 beta_rescale_2 = isnan(beta_rescale_2) ? 0.0 : beta_rescale_2;
1215 REAL8 MfA = ( ftrans-dMf < pPrec->Mfmin_integration + 2.*dMf ? pPrec->
Mfmin_integration + 2*dMf : ftrans - dMf );
1223 XLAL_CHECK(
status ==
XLAL_SUCCESS,
XLAL_EFUNC,
"%s: error in beta interpolation for q=%.12f, Mtot=%.12f and chi1=[%.12f, %.12f,%.12f], chi2=[%.12f, %.12f,%.12f]\n",__func__,pWF->
q,pWF->
M, pPrec->
chi1x,pPrec->
chi1y,pPrec->
chi1z,pPrec->
chi2x,pPrec->
chi2y,pPrec->
chi2z);
1227 XLAL_CHECK(
status ==
XLAL_SUCCESS,
XLAL_EFUNC,
"%s: error in beta interpolation for q=%.12f, Mtot=%.12f and chi1=[%.12f, %.12f,%.12f], chi2=[%.12f, %.12f,%.12f]\n",__func__,pWF->
q,pWF->
M, pPrec->
chi1x,pPrec->
chi1y,pPrec->
chi1z,pPrec->
chi2x,pPrec->
chi2y,pPrec->
chi2z);
1231 XLAL_CHECK(
status ==
XLAL_SUCCESS,
XLAL_EFUNC,
"%s: error in beta interpolation for q=%.12f, Mtot=%.12f and chi1=[%.12f, %.12f,%.12f], chi2=[%.12f, %.12f,%.12f]\n",__func__,pWF->
q,pWF->
M, pPrec->
chi1x,pPrec->
chi1y,pPrec->
chi1z,pPrec->
chi2x,pPrec->
chi2y,pPrec->
chi2z);
1235 const double omega =
LAL_PI * MfB;
1236 const double domega =
LAL_PI * dMf;
1242 bB1 = acos(vangles_SingleSpin1.
z);
1245 bB = acos(vangles_SingleSpin2.
z);
1248 bB2 = acos(vangles_SingleSpin3.
z);
1258 bB1 = acos(vangles_SingleSpin1.
z);
1261 bB = acos(vangles_SingleSpin2.
z);
1264 bB2 = acos(vangles_SingleSpin3.
z);
1268 REAL8 dbA = (bA2-bA1)/(2.0*dMf);
1269 REAL8 dbB = (bB2-bB1)/(2.0*dMf);
1297 REAL8 dbC = (bC2 - bC1) / (2.0 * dMf);
1298 REAL8 dbD = (bD2 - bD1) / (2.0 * dMf);
1304 beta_rescale_1 = isnan(beta_rescale_1) ? 0.0 : beta_rescale_1;
1305 beta_rescale_2 = isnan(beta_rescale_2) ? 0.0 : beta_rescale_2;
1338 REAL8 Mf1_2 = Mf1*Mf1;
1339 REAL8 Mf1_3 = Mf1_2*Mf1;
1341 REAL8 Mf2_2 = Mf2*Mf2;
1342 REAL8 Mf2_3 = Mf2_2*Mf2;
1344 REAL8 N = -beta2*Mf1_3 + 3*beta2*Mf1_2*Mf2 + dbeta2*Mf1_3*Mf2 - 3*beta1*Mf1*Mf2_2 + dbeta1*Mf1_2*Mf2_2 - dbeta2*Mf1_2*Mf2_2 + beta1*Mf2_3 - dbeta1*Mf1*Mf2_3;
1345 REAL8 D = (Mf1-Mf2)*(Mf1-Mf2)*(Mf1-Mf2);
1359 REAL8 Mf1_2 = Mf1*Mf1;
1360 REAL8 Mf1_3 = Mf1_2*Mf1;
1362 REAL8 Mf2_2 = Mf2*Mf2;
1363 REAL8 Mf2_3 = Mf2_2*Mf2;
1365 REAL8 N = -dbeta2*Mf1_3 + 6*beta1*Mf1*Mf2 - 6*beta2*Mf1*Mf2 - 2*dbeta1*Mf1_2*Mf2 - dbeta2*Mf1_2*Mf2 + dbeta1*Mf1*Mf2_2 + 2*dbeta2*Mf1*Mf2_2 + dbeta1*Mf2_3;
1366 REAL8 D = (Mf1-Mf2)*(Mf1-Mf2)*(Mf1-Mf2);
1380 REAL8 Mf1_2 = Mf1*Mf1;
1381 REAL8 Mf2_2 = Mf2*Mf2;
1383 REAL8 N = -3*(beta1 - beta2)*(Mf1 + Mf2) + (dbeta1 + 2*dbeta2)*Mf1_2 + (dbeta1 - dbeta2)*Mf1*Mf2 - (2*dbeta1 + dbeta2)*Mf2_2;
1384 REAL8 D = (Mf1-Mf2)*(Mf1-Mf2)*(Mf1-Mf2);
1399 REAL8 N = 2*(beta1-beta2) - (dbeta1+dbeta2)*(Mf1-Mf2);
1400 REAL8 D = (Mf1-Mf2)*(Mf1-Mf2)*(Mf1-Mf2);
1415 REAL8 window_border = 0.01;
1422 REAL8 PI_by_2 = 1.570796326794897;
1423 REAL8 PI_by_2_1mp = 1.569378278348018;
1424 REAL8 PI_by_2_1oq = 7.308338225719002e97;
1425 REAL8 sign = (
beta < PI_by_2) ? -1.0 : 1.0;
1427 return sign * PI_by_2_1mp * pow(atan2(pow(
beta - PI_by_2, 1.0 /
p), PI_by_2_1oq),
p) + PI_by_2;
#define MAX_TOL_ATAN
Tolerance used below which numbers are treated as zero for the calculation of atan2.
static double double delta
REAL8 IMRPhenomX_PNR_GetPNBetaAtFreq_fulltwospin(REAL8 Mf, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, const IMRPhenomX_PNR_beta_parameters *betaParams)
A wrapper to produce either the NNLO or MSA beta depending on the IMRPhenomXPrecVersion.
REAL8 IMRPhenomX_PNR_MR_dbeta_expression(REAL8 Mf, const IMRPhenomX_PNR_beta_parameters *betaParams)
expression for first derivative of beta in merger-ringdown regime
REAL8 IMRPhenomX_PNR_GeneratePNRBetaNoMR(REAL8 Mf, const IMRPhenomX_PNR_beta_parameters *betaParams, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
This function evaluates only the rescaled inspiral beta given in Eq.
UINT4 IMRPhenomX_PNR_AttachMRBeta(const IMRPhenomX_PNR_beta_parameters *betaParams)
Determine whether to attach the MR contributions to beta.
COMPLEX16 * IMRPhenomX_PNR_three_inflection_points(const IMRPhenomX_PNR_beta_parameters *betaParams)
Compute the three roots of a depressed cubic given by Eq.
REAL8 IMRPhenomX_PNR_MR_ddbeta_expression(REAL8 Mf, const IMRPhenomX_PNR_beta_parameters *betaParams)
expression for second derivative of beta in merger-ringdown regime
COMPLEX16 * IMRPhenomX_PNR_two_inflection_points(const IMRPhenomX_PNR_beta_parameters *betaParams)
Compute the two roots of a depressed cubic given by Eq.
REAL8 IMRPhenomX_PNR_MR_dddbeta_expression(REAL8 Mf, const IMRPhenomX_PNR_beta_parameters *betaParams)
expression for third derivative of beta in merger-ringdown regime
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...
REAL8 IMRPhenomX_PNR_GetPNBetaAtFreq(REAL8 Mf, const IMRPhenomX_PNR_beta_parameters *betaParams, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, IMRPhenomXWaveformStruct *pWF_SingleSpin, IMRPhenomXPrecessionStruct *pPrec_SingleSpin)
A wrapper to produce either the NNLO or MSA beta depending on the IMRPhenomXPrecVersion.
REAL8 IMRPhenomX_ST_PNR_beta_coeffs_1(REAL8 Mf1, REAL8 Mf2, REAL8 beta1, REAL8 beta2, REAL8 dbeta1, REAL8 dbeta2)
REAL8 IMRPhenomX_PNR_arctan_window(REAL8 beta)
Utility function to compute the arctan windowing described in Eq.
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.
REAL8 IMRPhenomX_ST_PNR_beta_coeffs_2(REAL8 Mf1, REAL8 Mf2, REAL8 beta1, REAL8 beta2, REAL8 dbeta1, REAL8 dbeta2)
REAL8 IMRPhenomX_PNR_PNWaveformBetaWrapper(REAL8 Mf, REAL8 pn_beta, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
A wrapper to generate the "waveform" PN beta from Eq.
REAL8 IMRPhenomX_PNR_MR_beta_expression(REAL8 Mf, const IMRPhenomX_PNR_beta_parameters *betaParams)
These four functions produce the MR Ansatz of beta described in Sec.
REAL8 IMRPhenomX_PNR_beta_rescaling_2(REAL8 Mf, REAL8 beta1, REAL8 beta2, REAL8 dbeta1, REAL8 dbeta2)
REAL8 IMRPhenomX_ST_PNR_beta_coeffs_3(REAL8 Mf1, REAL8 Mf2, REAL8 beta1, REAL8 beta2, REAL8 dbeta1, REAL8 dbeta2)
REAL8 IMRPhenomX_PNR_GenerateMergedPNRBetaAtMf(REAL8 Mf, const IMRPhenomX_PNR_beta_parameters *betaParams, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, IMRPhenomXWaveformStruct *pWF_SingleSpin, IMRPhenomXPrecessionStruct *pPrec_SingleSpin)
This function generates beta with the tuned angles and PN expressions blended during merger-ringdown.
REAL8 IMRPhenomX_PNR_chi_calc(REAL8 m1, REAL8 L, REAL8 J0, REAL8 L0, REAL8 chi_parr, REAL8 beta)
The magnitude of the effective total spin is computed from the total and orbital angular momenta,...
int IMRPhenomX_PNR_BetaConnectionFrequencies(IMRPhenomX_PNR_beta_parameters *betaParams)
Here we work through the construction of the connection frequency for beta, outlined in Sec.
int IMRPhenomX_PNR_beta_connection_parameters(IMRPhenomX_PNR_beta_parameters *betaParams, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, IMRPhenomXWaveformStruct *pWF_SingleSpin, IMRPhenomXPrecessionStruct *pPrec_SingleSpin)
This function combines several functions together to compute the connection frequencies and the inspi...
REAL8 IMRPhenomX_PNR_rescale_beta_expression(REAL8 Mf, const IMRPhenomX_PNR_beta_parameters *betaParams)
REAL8 IMRPhenomX_PNR_GeneratePNRBetaAtMf(REAL8 Mf, const IMRPhenomX_PNR_beta_parameters *betaParams, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, IMRPhenomXWaveformStruct *pWF_SingleSpin, IMRPhenomXPrecessionStruct *pPrec_SingleSpin)
This function evaluates Eqs.
REAL8 IMRPhenomX_PNR_beta_rescaling_1(REAL8 Mf, REAL8 beta1, REAL8 beta2, REAL8 dbeta1, REAL8 dbeta2)
These three functions produce the inspiral rescaling of beta described in Sec.
REAL8 IMRPhenomX_PNR_PNWaveformBeta(REAL8 Mf, REAL8 iota, REAL8 m1, REAL8 m2, REAL8 chi, REAL8 costheta)
The "waveform" PN beta from Eq.
int IMRPhenomX_ST_PNR_beta_connection_parameters(IMRPhenomX_PNR_beta_parameters *betaParams, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, IMRPhenomXWaveformStruct *pWF_SingleSpin, IMRPhenomXPrecessionStruct *pPrec_SingleSpin)
Function to calculate beta and first derivative at connection frequency between SpinTaylor and PNR an...
REAL8 IMRPhenomX_ST_PNR_beta_coeffs_0(REAL8 Mf1, REAL8 Mf2, REAL8 beta1, REAL8 beta2, REAL8 dbeta1, REAL8 dbeta2)
Series of functions to calculation co-efficients in beta interpolation function These expressions com...
REAL8 IMRPhenomX_PNR_single_inflection_point(const IMRPhenomX_PNR_beta_parameters *betaParams)
Compute the roots of a depressed cubic given by Eq.
REAL8 IMRPhenomX_PNR_beta_B4_coefficient(REAL8 eta, REAL8 chi, REAL8 costheta)
REAL8 IMRPhenomX_PNR_beta_B1_coefficient(REAL8 eta, REAL8 chi, REAL8 costheta)
REAL8 IMRPhenomX_PNR_beta_B5_coefficient(REAL8 eta, REAL8 chi, REAL8 costheta)
REAL8 IMRPhenomX_PNR_beta_B3_coefficient(REAL8 eta, REAL8 chi, REAL8 costheta)
REAL8 IMRPhenomX_PNR_beta_B2_coefficient(REAL8 eta, REAL8 chi, REAL8 costheta)
REAL8 IMRPhenomX_PNR_beta_Bf_coefficient(REAL8 eta, REAL8 chi, REAL8 costheta)
REAL8 IMRPhenomX_PNR_beta_B0_coefficient(REAL8 eta, REAL8 chi, REAL8 costheta)
expressions for each of the co-efficients that appear in the merger-ringdown expression for beta
REAL8 IMRPhenomX_PNR_AnglesWindow(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
INT4 IMRPhenomX_PNR_CheckTwoSpin(IMRPhenomXPrecessionStruct *pPrec)
This function quickly checks to see if we expect two-spin effects to be present in the inspiral prece...
REAL8 beta_SpinTaylor_IMR(REAL8 Mf, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, const IMRPhenomX_PNR_beta_parameters *betaParams)
int IMRPhenomX_Initialize_MSA_System(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, int ExpansionOrder)
This function initializes all the core variables required for the MSA system.
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.
vector IMRPhenomX_Return_phi_zeta_costhetaL_MSA(const double v, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
Wrapper to generate , and at a given frequency.
REAL8 XLALSimIMRPhenomXatan2tol(REAL8 a, REAL8 b, REAL8 tol)
INT4 D0(REAL8 *f, REAL8 dx, INT4 n, REAL8 *df)
XLALWignerdMatrix, XLALWignerDMatrix in <lal/SphericalHarmonics.h>
INT4 D2(REAL8 *f, REAL8 dx, INT4 n, REAL8 *d2f)
static vector d(const double L_norm, const double J_norm, const vector roots)
Internal function that returns the coefficients "d_0", "d_2" and "d_4" from 1703.03967 corresponding ...
static double beta(const double a, const double b, const sysq *system)
Internal function that computes the spin-orbit couplings.
#define XLAL_CHECK(assertion,...)
REAL8 derivative_beta_lower
REAL8 derivative_beta_upper
REAL8 Mfmin_integration
Minimum frequency covered by the integration of PN spin-precessing equations for SpinTaylor models
INT4 ExpansionOrder
Flag to control expansion order of MSA system of equations.
REAL8 costheta_singleSpin
Polar angle of effective single spin, Eq.
INT4 IMRPhenomXPrecVersion
Flag to set version of Euler angles used.
REAL8 chi_singleSpin
Magnitude of effective single spin used for tapering two-spin angles, Eq.
gsl_interp_accel * cosbeta_acc
gsl_spline * cosbeta_spline
REAL8 costheta_final_singleSpin
Polar angle of approximate final spin, see technical document FIXME: add reference.