21 #include <lal/Sequence.h>
23 #include <lal/Units.h>
24 #include <lal/XLALError.h>
27 #include <lal/LALDatatypes.h>
28 #include <lal/LALStdlib.h>
29 #include <lal/LALConstants.h>
32 #include <lal/TimeSeries.h>
33 #include <lal/TimeFreqFFT.h>
34 #include <lal/SphericalHarmonics.h>
35 #include <lal/FrequencySeries.h>
38 #include <lal/LALSimIMR.h>
39 #include <lal/LALSimInspiral.h>
46 #ifndef PHENOMXHMDEBUG
48 #define PHENOMXDEBUG 0
49 #define PHENOMXPDEBUG 0
52 #define PHENOMXDEBUG 1
53 #define PHENOMXPDEBUG 1
197 printf(
"fRef_In : %e\n",fRef_In);
198 printf(
"m1_SI : %e\n",m1_SI);
199 printf(
"m2_SI : %e\n",m2_SI);
200 printf(
"chi1L : %e\n",chi1L);
201 printf(
"chi2L : %e\n\n",chi2L);
202 printf(
"Performing sanity checks...\n");
207 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
213 if(distance < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"Distance must be positive and greater than 0.\n"); }
226 mass_ratio = m1_SI / m2_SI;
230 mass_ratio = m2_SI / m1_SI;
232 if(mass_ratio > 20.0 ) {
XLAL_PRINT_INFO(
"Warning: Extrapolating outside of Numerical Relativity calibration domain."); }
233 if(mass_ratio > 1000. && fabs(mass_ratio - 1000) > 1
e-12) {
XLAL_ERROR(
XLAL_EDOM,
"ERROR: Model not valid at mass ratios beyond 1000."); }
234 if(fabs(chi1L) > 0.99 || fabs(chi2L) > 0.99) {
XLAL_PRINT_INFO(
"Warning: Extrapolating to extremal spins, model is not trusted."); }
237 REAL8 fRef = (fRef_In == 0.0) ?
f_min : fRef_In;
242 printf(
"\n\n **** Initializing waveform struct... **** \n\n");
253 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phi0,
f_min,
f_max, distance, 0.0, lalParams, debug);
267 printf(
"\n\n **** Calling IMRPhenomXASGenerateFD... **** \n\n");
276 printf(
"\n\n **** Call to IMRPhenomXASGenerateFD complete. **** \n\n");
290 lastfreq = pWF->
fMax;
297 size_t n = (*htilde22)->data->length;
301 XLAL_CHECK (*htilde22,
XLAL_ENOMEM,
"Failed to resize waveform COMPLEX16FrequencySeries of length %zu (for internal fCut=%f) to new length %zu (for user-requested f_max=%f).", n, pWF->
fCut, n_full, pWF->
fMax );
332 INT4 return_code = 0;
336 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
339 if(distance < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"Distance must be positive and greater than 0.\n"); }
352 mass_ratio = m1_SI / m2_SI;
356 mass_ratio = m2_SI / m1_SI;
358 if(mass_ratio > 20.0 ) {
XLAL_PRINT_INFO(
"Warning: Extrapolating outside of Numerical Relativity calibration domain."); }
361 if(mass_ratio > 1000. && fabs(mass_ratio - 1000) > 1
e-12) {
XLAL_ERROR(
XLAL_EDOM,
"ERROR: Model not valid at mass ratios beyond 1000."); }
362 if(fabs(chi1L) > 0.99 || fabs(chi2L) > 0.99) {
XLAL_PRINT_INFO(
"Warning: Extrapolating to extremal spins, model is not trusted."); }
365 REAL8 fRef = (fRef_In == 0.0) ? freqs->
data[0] : fRef_In;
384 return_code =
IMRPhenomXSetWaveformVariables(pWF,m1_SI, m2_SI, chi1L, chi2L, 0.0, fRef, phi0, f_min_In, f_max_In, distance, 0.0, lalParams, 0);
419 if(fabs(chi1L) > 1.0) {
XLAL_ERROR(
XLAL_EDOM,
"Unphysical chi_1 requested: must obey the Kerr bound [-1,1].\n"); }
420 if(fabs(chi2L) > 1.0) {
XLAL_ERROR(
XLAL_EDOM,
"Unphysical chi_2 requested: must obey the Kerr bound [-1,1].\n"); }
435 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, 0, f_start, f_start, 0, 0, 1.0, 0.0, lal_dict, debug);
464 double dphi_start = 0.0;
465 double dphi_end = 0.0;
468 double Mf_start = f_start * M_sec;
524 printf(
"\n **** Now in IMRPhenomXASGenerateFD... **** \n");
561 REAL8 pfaN = 3./(128.*X_A*X_B);
572 printf(
"npts = %zu\n",npts);
573 printf(
"fMin = %.4f\n",
f_min);
574 printf(
"fMax = %.4f\n",
f_max);
575 printf(
"dF = %.4f\n",pWF->
deltaF);
591 "minimum freq index %zu and maximum freq index %zu do not fulfill 0<=ind_min<=ind_max<=htilde->data>length=%zu.", iStart, iStop, npts);
601 for (
UINT4 i = iStart;
i < iStop;
i++)
613 XLAL_CHECK (*htilde22,
XLAL_ENOMEM,
"Failed to allocated waveform COMPLEX16FrequencySeries of length %zu from sequence.", npts);
631 memset((*htilde22)->data->data, 0, npts *
sizeof(
COMPLEX16));
635 INT4 lalParams_In = 0;
636 if(lalParams == NULL)
644 printf(
"\n\n **** Initializing amplitude struct... **** \n\n");
655 printf(
"\n\n **** Amplitude struct initialized. **** \n\n");
656 printf(
"\n\n **** Initializing phase struct... **** \n\n");
669 printf(
"\n\n **** Phase struct initialized. **** \n\n");
692 if ( APPLY_PNR_DEVIATIONS && PNRForceXHMAlignment ) {
710 double phiTfRef = 0.;
726 REAL8 tshift = -dphi_fmerger;
762 printf(
"\n\n **** Phase struct initialized. **** \n\n");
763 printf(
"C1IM = %.4f\n",C1IM);
764 printf(
"C2IM = %.4f\n",C2IM);
765 printf(
"C1RD = %.4f\n",C1RD);
766 printf(
"C2RD = %.4f\n",C2RD);
767 printf(
"fIN = %.4f\n",fPhaseIN);
768 printf(
"fIM = %.4f\n",fPhaseIM);
776 if (NRTidal_version!=
NoNRT_V) {
788 #pragma omp parallel for
791 double Mf = Msec * freqs->
data[idx];
792 UINT4 jdx = idx + offset;
804 XLALPrintError(
"IMRPhenomX_Initialize_Powers failed for Mf, initial_status=%d",initial_status);
818 else if(Mf > fPhaseIM)
829 phi += linb*Mf + lina + phifRef;
854 ((*htilde22)->data->data)[jdx] = phi;
858 if (NRTidal_version!=
NoNRT_V) {
861 double ampTidal = amp_tidal->
data[idx];
862 double window = planck_taper->
data[idx];
880 else if (NRTidal_version ==
NoNRT_V) {
882 ((*htilde22)->data->data)[jdx] = Amp0 * powers_of_Mf.
m_seven_sixths * amp * cexp(I * phi);
885 XLAL_PRINT_INFO(
"Warning: Only NRTidal, NRTidalv2, and NoNRT NRTidal_version values allowed and NRTidal is not implemented completely in IMRPhenomX*.");
894 ((*htilde22)->data->data)[jdx] = 0.0 + I*0.0;
909 if(lalParams_In == 1)
927 if( (frequencies->
length == 2) && (df > 0.) )
1049 const REAL8 distance,
1050 const REAL8 inclination,
1067 const REAL8 m1_SI_init = m1_SI;
1068 const REAL8 m2_SI_init = m2_SI;
1069 const REAL8 chi1z_init = chi1z;
1070 const REAL8 chi2z_init = chi2z;
1075 #if PHENOMXPDEBUG == 1
1076 printf(
"fRef_In : %e\n",fRef_In);
1077 printf(
"m1_SI : %e\n",m1_SI);
1078 printf(
"m2_SI : %e\n",m2_SI);
1079 printf(
"chi1z : %e\n",chi1z);
1080 printf(
"chi2z : %e\n",chi2z);
1081 printf(
"phiRef : %e\n",phiRef);
1083 printf(
"Performing sanity checks...\n");
1089 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
1095 if(distance <= 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"Distance must be positive and greater than 0.\n"); }
1109 mass_ratio = m1_SI / m2_SI;
1113 mass_ratio = m2_SI / m1_SI;
1115 if(mass_ratio > 20.0 ) {
XLAL_PRINT_WARNING(
"Warning: Extrapolating outside of Numerical Relativity calibration domain. NNLO angles may become pathological at large mass ratios.\n"); }
1116 if(mass_ratio > 1000. && fabs(mass_ratio - 1000) > 1
e-12) {
XLAL_ERROR(
XLAL_EDOM,
"ERROR: Model not valid at mass ratios beyond 1000.\n"); }
1117 if(fabs(chi1z) > 0.99 || fabs(chi2z) > 0.99) {
XLAL_PRINT_WARNING(
"Warning: Extrapolating to extremal spins, aligned spin model is not trusted.\n"); }
1120 const REAL8 fRef = (fRef_In == 0.0) ?
f_min : fRef_In;
1123 LALDict *lalParams_aux;
1125 if (lalParams == NULL)
1133 #if PHENOMXPDEBUG == 1
1134 printf(
"\n\n **** Initializing waveform struct... **** \n\n");
1145 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI_init, m2_SI_init, chi1z_init, chi2z_init, deltaF, fRef, phiRef,
f_min,
f_max, distance, inclination, lalParams_aux, debug);
1159 (fRef >= pWF->
fMin)&&(fRef <= pWF->f_max_prime),
1161 "Error: f_min = %.2f <= fRef = %.2f < f_max = %.2f required when using tuned angles.\n",pWF->
fMin,fRef,pWF->
f_max_prime);
1164 #if PHENOMXPDEBUG == 1
1165 printf(
"\n\n **** Initializing precession struct... **** \n\n");
1175 if(pflag==310||pflag==311||pflag==320||pflag==321)
1194 #if PHENOMXPDEBUG == 1
1195 printf(
"\n\n **** Calling IMRPhenomXPGenerateFD... **** \n\n");
1202 #if PHENOMXPDEBUG == 1
1203 printf(
"\n\n **** Call to IMRPhenomXPGenerateFD complete. **** \n\n");
1214 lastfreq = pWF->
fMax;
1222 size_t n = (*hptilde)->data->length;
1226 XLAL_CHECK (*hptilde,
XLAL_ENOMEM,
"Failed to resize h_+ COMPLEX16FrequencySeries of length %zu (for internal fCut=%f) to new length %zu (for user-requested f_max=%f).\n", n, pWF->
fCut, n_full, pWF->
fMax );
1230 XLAL_CHECK (*hctilde,
XLAL_ENOMEM,
"Failed to resize h_x COMPLEX16FrequencySeries of length %zu (for internal fCut=%f) to new length %zu (for user-requested f_max=%f).\n", n, pWF->
fCut, n_full, pWF->
fMax );
1267 const REAL8 distance,
1268 const REAL8 inclination,
1276 const REAL8 m1_SI_init = m1_SI;
1277 const REAL8 m2_SI_init = m2_SI;
1278 const REAL8 chi1z_init = chi1z;
1279 const REAL8 chi2z_init = chi2z;
1290 XLAL_CHECK(freqs != NULL,
XLAL_EFAULT,
"Error: XLALSimIMRPhenomXPFrequencySequence *freqs is null.\n");
1295 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
1298 if(distance < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"Distance must be positive and greater than 0.\n"); }
1311 mass_ratio = m1_SI / m2_SI;
1315 mass_ratio = m2_SI / m1_SI;
1317 if(mass_ratio > 20.0 ) {
XLAL_PRINT_WARNING(
"Warning: Extrapolating outside of Numerical Relativity calibration domain. NNLO angles may become pathological at large mass ratios.\n"); }
1318 if(mass_ratio > 1000. && fabs(mass_ratio - 1000) > 1
e-12) {
XLAL_ERROR(
XLAL_EDOM,
"ERROR: Model not valid at mass ratios beyond 1000.\n"); }
1319 if(sqrt(chi1x*chi1x + chi1y*chi1y + chi1z*chi1z) > 0.99 || sqrt(chi2x*chi2x + chi2y*chi2y + chi2z*chi2z) > 0.99) {
XLAL_PRINT_WARNING(
"Warning: Extrapolating to extremal spins, model is not trusted.\n"); }
1322 const REAL8 fRef = (fRef_In == 0.0) ? freqs->
data[0] : fRef_In;
1329 (fRef >= f_min_In)&&(fRef <= f_max_In),
1331 "Error: f_min = %.2f <= fRef = %.2f < f_max = %.2f required when using tuned angles.\n",f_min_In,fRef,f_max_In);
1335 LALDict *lalParams_aux;
1337 if (lalParams == NULL)
1355 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI_init, m2_SI_init, chi1z_init, chi2z_init, 0.0, fRef, phiRef, f_min_In, f_max_In, distance, inclination, lalParams_aux, 0);
1364 if(pflag==310||pflag==311||pflag==320||pflag==321)
1424 REAL8 *zeta_polarization,
1447 XLAL_CHECK(f_ref > 0,
XLAL_EDOM,
"Error in XLALSimIMRPhenomXPCalculateModelParametersFromSourceFrame: Reference frequency must be positive.\n");
1448 XLAL_CHECK(m1_SI > 0,
XLAL_EDOM,
"Error in XLALSimIMRPhenomXPCalculateModelParametersFromSourceFrame: m1 must be positive.\n");
1449 XLAL_CHECK(m2_SI > 0,
XLAL_EDOM,
"Error in XLALSimIMRPhenomXPCalculateModelParametersFromSourceFrame: m2 must be positive.\n");
1450 XLAL_CHECK(fabs(chi1x*chi1x + chi1y*chi1y + chi1z*chi1z) <= 1.0,
XLAL_EDOM,
"Error in XLALSimIMRPhenomXPCalculateModelParametersFromSourceFrame: |S1/m1^2| must be <= 1.\n");
1451 XLAL_CHECK(fabs(chi2x*chi2x + chi2y*chi2y + chi2z*chi2z) <= 1.0,
XLAL_EDOM,
"Error in XLALSimIMRPhenomXPCalculateModelParametersFromSourceFrame: |S2/m2^2| must be <= 1.\n");
1454 LALDict *lalParams_aux;
1456 if (lalParams == NULL)
1476 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1z, chi2z, 0.125, f_ref, phiRef, 30., 1024., 1e6*
LAL_PC_SI, incl, lalParams_aux,
PHENOMXDEBUG);
1518 "Error: IMRPhenomX_PNR_PopulateStructs failed!\n");
1520 REAL8 betaPNR_ref = 0.0;
1529 if ((q <= pPrec->PNR_q_window_lower) && (chi <= pPrec->PNR_chi_window_lower))
1542 else if ((q <= pPrec->PNR_q_window_upper) && (chi <= pPrec->PNR_chi_window_upper))
1564 "Error: IMRPhenomX_PNR_RemapThetaJSF failed in IMRPhenomX_PNR_GeneratePNRAngles.");
1578 *chi_p = pPrec->
chi_p;
1630 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
1639 const REAL8 fRef = (fRef_In == 0.0) ? freqs->
data[0] : fRef_In;
1645 LALDict *lalParams_aux;
1647 if (lalParams == NULL)
1659 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, 0.0, fRef, 0.0, freqs->
data[0], freqs->
data[freqs->
length-1], 1.0, inclination, lalParams_aux, 0);
1668 if (pflag == 300) pflag = 223;
1670 if(pflag != 220 && pflag != 221 && pflag != 222 && pflag != 223 && pflag != 224)
1672 XLAL_ERROR(
XLAL_EDOM,
"Error: MSA system currently only supported for IMRPhenomXPrecVersion 220, 221, 222, 223 or 224.\n");
1692 vector vangles = {0.,0.,0.};
1701 v = cbrt( freqs->
data[
i] * pPrec->
piGM * (2.0 / mprime) );
1706 (*cosbeta_of_f)->data[
i] = vangles.
z;
1750 #if PHENOMXPDEBUG == 1
1751 printf(
"\nm1 : %.6f\n",m1_SI);
1752 printf(
"m2 : %.6f\n",m2_SI);
1753 printf(
"chi1x : %.6f\n",chi1x);
1754 printf(
"chi1y : %.6f\n",chi1y);
1755 printf(
"chi1z : %.6f\n",chi1z);
1756 printf(
"chi2x : %.6f\n",chi2x);
1757 printf(
"chi2y : %.6f\n",chi2y);
1758 printf(
"chi2z : %.6f\n\n",chi2z);
1762 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
1771 const REAL8 fRef = (fRef_In == 0.0) ? freqs->
data[0] : fRef_In;
1777 LALDict *lalParams_aux;
1779 if (lalParams == NULL)
1791 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, 0.0, fRef, 0.0, freqs->
data[0], freqs->
data[freqs->
length-1], 1.0, inclination, lalParams_aux, 0);
1824 REAL8 v, omega, logomega, omega_cbrt, omega_cbrt2;
1836 omega = freqs->
data[
i] * pPrec->
piGM * (2.0 / mprime);
1837 logomega = log(omega);
1838 omega_cbrt = cbrt(omega);
1839 omega_cbrt2 = omega_cbrt * omega_cbrt;
1842 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);
1849 s = pPrec->
Sperp / (L + pPrec->
SL);
1852 (*cosbeta_of_f)->data[
i] = copysign(1.0, L + pPrec->
SL) / sqrt(1.0 + s2);
1882 #if PHENOMXPDEBUG == 1
1883 printf(
"\n **** Now in IMRPhenomXPGenerateFD... **** \n");
1922 REAL8 pfaN = 3./(128.*X_A*X_B);
1931 #if PHENOMXPDEBUG == 1
1932 printf(
"npts = %zu\n",npts);
1933 printf(
"fMin = %.4f\n",
f_min);
1934 printf(
"fMax = %.4f\n",
f_max);
1935 printf(
"dF = %.4f\n",pWF->
deltaF);
1951 size_t iStop = (size_t) (
f_max / pWF->
deltaF) + 1;
1954 "minimum freq index %zu and maximum freq index %zu do not fulfill 0<=ind_min<=ind_max<=htilde->data>length=%zu.\n", iStart, iStop, npts);
1964 for (
UINT4 i = iStart;
i < iStop;
i++)
1977 XLAL_CHECK (*hptilde,
XLAL_ENOMEM,
"Failed to allocated waveform COMPLEX16FrequencySeries h_+ of length %zu from sequence.\n", npts);
1978 XLAL_CHECK (*hctilde,
XLAL_ENOMEM,
"Failed to allocated waveform COMPLEX16FrequencySeries h_x of length %zu from sequence.\n", npts);
1996 memset((*hptilde)->data->data, 0, npts *
sizeof(
COMPLEX16));
1999 memset((*hctilde)->data->data, 0, npts *
sizeof(
COMPLEX16));
2003 UNUSED
INT4 lalParams_In = 0;
2004 if(lalParams == NULL)
2010 #if PHENOMXPDEBUG == 1
2011 printf(
"\n\n **** Initializing amplitude struct... **** \n\n");
2033 #if PHENOMXPDEBUG == 1
2034 printf(
"\n\n **** Amplitude struct initialized. **** \n\n");
2035 printf(
"\n\n **** Initializing phase struct... **** \n\n");
2045 #if PHENOMXPDEBUG == 1
2046 printf(
"\n\n **** Phase struct initialized. **** \n\n");
2070 double phiTfRef = 0.;
2077 if(f_merger<f_final)
2085 REAL8 tshift = -dphi_fmerger;
2120 if(PNRUseTunedAngles)
2139 alphaPNR, betaPNR, gammaPNR,
2148 sprintf(fileSpec2,
"angles_PNR.dat");
2150 printf(
"\nOutput angle file: %s\r\n", fileSpec2);
2151 fileangle2 = fopen(fileSpec2,
"w");
2154 fprintf(fileangle2,
"#fHz alpha beta gamma\n");
2158 fprintf(fileangle2,
"%.16e %.16e %.16e %.16e\n", freqs->
data[idx], alphaPNR->data[idx], betaPNR->data[idx], gammaPNR->data[idx]);
2164 #if PHENOMXPDEBUG == 1
2165 printf(
"\n\n **** Phase struct initialized. **** \n\n");
2166 printf(
"C1IM = %.4f\n",C1IM);
2167 printf(
"C2IM = %.4f\n",C2IM);
2168 printf(
"C1RD = %.4f\n",C1RD);
2169 printf(
"C2RD = %.4f\n",C2RD);
2170 printf(
"fIN = %.4f\n",fPhaseIN);
2171 printf(
"fIM = %.4f\n",fPhaseIM);
2172 printf(
"thetaJN = %.4f\n",pPrec->
thetaJN);
2193 XLALPrintError(
"IMRPhenomX_Initialize_Powers failed for fmax, initial_status=%d",initial_status);
2200 sprintf(fileSpec,
"angles_XP.dat");
2202 printf(
"\nOutput angle file: %s\r\n", fileSpec);
2203 fileangle = fopen(fileSpec,
"w");
2206 fprintf(fileangle,
"#fHz cexp_i_alpha(re im) cexp_i_epsilon(re im) cexp_i_betah(re im)\n");
2231 REAL8 phi_antiSym = 0.0;
2232 REAL8 amp_antiSym = 0.0;
2233 double MfT = 0.85 * pWF->
fRING;
2235 if(AntisymmetricWaveform)
2237 if (!PNRUseTunedAngles)
2239 XLAL_ERROR(
XLAL_EFUNC,
"Error: Antisymmetric waveform generation not supported without PNR angles, please turn on PNR angles to produce waveform with asymmetries in the (2,2) and (2,-2) modes\n");
2246 XLAL_ERROR(
XLAL_EFUNC,
"antisymmetric waveform amplitude ratio array allocation failed in LALSimIMRPhenomX.c");
2252 &A0, &phi_A0, &phi_B0, MfT, lina, linb, inveta, pWF,pPrec,pPhase22);
2258 #pragma omp parallel for
2261 double Mf = pWF->
M_sec * freqs->
data[idx];
2262 UINT4 jdx = idx + offset;
2278 XLALPrintError(
"IMRPhenomX_Initialize_Powers failed for Mf, initial_status=%d\n",initial_status);
2296 else if(Mf > fPhaseIM)
2306 phi += linb*Mf + lina + pWF->
phifRef;
2313 else if(Mf > fAmpIM)
2326 REAL8 phaseTidal = phi_tidal->
data[idx];
2327 double ampTidal = amp_tidal->
data[idx];
2328 double window = planck_taper->
data[idx];
2346 else if (NRTidal_version ==
NoNRT_V) {
2348 hcoprec = Amp0 * powers_of_Mf.
m_seven_sixths * amp * cexp(I * phi);
2352 XLAL_PRINT_INFO(
"Warning: Only NRTidal, NRTidalv2, and NoNRT NRTidal_version values allowed and NRTidal is not implemented completely in IMRPhenomX*.");
2360 hplus = 0.5 * (hcoprec);
2361 hcross = -0.5 * I * (hcoprec);
2367 if(PNRUseTunedAngles)
2369 pPrec->
alphaPNR = alphaPNR->data[idx];
2370 pPrec->
betaPNR = betaPNR->data[idx];
2371 pPrec->
gammaPNR = gammaPNR->data[idx];
2384 if(AntisymmetricWaveform && PNRUseTunedAngles)
2389 phi_antiSym = phi/2 + alphaPNR->data[idx] + A0 *Mf + phi_A0;
2393 phi_antiSym = phi + phi_B0;
2398 amp_antiSym = cabs(hcoprec)*kappa->
data[idx];
2399 hcoprec_antiSym = amp_antiSym* cexp(I * phi_antiSym);
2403 hplus += hplus_antiSym;
2404 hcross += hcross_antiSym;
2410 ((*hptilde)->data->data)[jdx] = hplus;
2411 ((*hctilde)->data->data)[jdx] = hcross;
2417 ((*hptilde)->data->data)[jdx] = 0.0 + I*0.0;
2418 ((*hctilde)->data->data)[jdx] = 0.0 + I*0.0;
2436 gsl_interp_accel_free(pPrec->
alpha_acc);
2437 gsl_interp_accel_free(pPrec->
gamma_acc);
2451 REAL8 cosPolFac, sinPolFac;
2459 for (
UINT4 i = 0;
i < (*hptilde)->data->length;
i++)
2461 PhPpolp = (*hptilde)->data->data[
i];
2462 PhPpolc = (*hctilde)->data->data[
i];
2464 (*hptilde)->data->data[
i] = (cosPolFac * PhPpolp) + (sinPolFac * PhPpolc);
2465 (*hctilde)->data->data[
i] = (cosPolFac * PhPpolc) - (sinPolFac * PhPpolp);
2479 if(PNRUseTunedAngles){
2485 if(AntisymmetricWaveform){
2489 if(lalParams_In == 1)
2510 LALDict *lalParams_aux;
2512 if (lalParams == NULL)
2521 const REAL8 chi1L = chi1z;
2522 const REAL8 chi2L = chi2z;
2524 const REAL8 deltaF = 0.0001;
2527 const REAL8 distance = 1.0;
2528 const REAL8 inclination = 0.0;
2530 const REAL8 phiRef = 0.0;
2539 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phiRef,
f_min,
f_max, distance, inclination, lalParams_aux, 0);
2572 return fRING22_prec;
2589 LALDict *lalParams_aux;
2591 if (lalParams == NULL)
2600 const REAL8 chi1L = chi1z;
2601 const REAL8 chi2L = chi2z;
2603 const REAL8 deltaF = 0.0001;
2606 const REAL8 distance = 1.0;
2607 const REAL8 inclination = 0.0;
2609 const REAL8 phiRef = 0.0;
2618 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phiRef,
f_min,
f_max, distance, inclination, lalParams_aux, 0);
2650 return fRINGEffShiftDividedByEmm;
2669 LALDict *lalParams_aux;
2671 if (lalParams == NULL)
2680 const REAL8 chi1L = chi1z;
2681 const REAL8 chi2L = chi2z;
2683 const REAL8 deltaF = 0.0001;
2686 const REAL8 distance = 1.0;
2687 const REAL8 inclination = 0.0;
2689 const REAL8 phiRef = 0.0;
2698 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phiRef,
f_min,
f_max, distance, inclination, lalParams_aux, 0);
2750 LALDict *lalParams_aux;
2752 if (lalParams == NULL)
2761 const REAL8 chi1L = chi1z;
2762 const REAL8 chi2L = chi2z;
2764 const REAL8 deltaF = 0.0001;
2767 const REAL8 distance = 1.0;
2768 const REAL8 inclination = 0.0;
2770 const REAL8 phiRef = 0.0;
2779 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phiRef,
f_min,
f_max, distance, inclination, lalParams_aux, 0);
2831 LALDict *lalParams_aux;
2833 if (lalParams == NULL)
2842 const REAL8 chi1L = chi1z;
2843 const REAL8 chi2L = chi2z;
2845 const REAL8 deltaF = 0.0001;
2848 const REAL8 distance = 1.0;
2849 const REAL8 inclination = 0.0;
2851 const REAL8 phiRef = 0.0;
2860 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phiRef,
f_min,
f_max, distance, inclination, lalParams_aux, 0);
2892 return afinal_nonprec;
2914 LALDict *lalParams_aux;
2916 if (lalParams == NULL)
2925 const REAL8 chi1L = chi1z;
2926 const REAL8 chi2L = chi2z;
2928 const REAL8 deltaF = 0.0001;
2931 const REAL8 distance = 1.0;
2932 const REAL8 inclination = 0.0;
2934 const REAL8 phiRef = 0.0;
2943 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phiRef,
f_min,
f_max, distance, inclination, lalParams_aux, 0);
2994 LALDict *lalParams_aux;
2996 if (lalParams == NULL)
3005 const REAL8 chi1L = chi1z;
3006 const REAL8 chi2L = chi2z;
3008 const REAL8 deltaF = 0.0001;
3011 const REAL8 distance = 1.0;
3012 const REAL8 inclination = 0.0;
3014 const REAL8 phiRef = 0.0;
3023 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phiRef,
f_min,
f_max, distance, inclination, lalParams_aux, 0);
void XLALDestroyDict(LALDict *dict)
LALDict * XLALDictDuplicate(LALDict *old)
LALDict * XLALCreateDict(void)
int XLALSimNRTunedTidesFDTidalPhaseFrequencySeries(const REAL8Sequence *phi_tidal, const REAL8Sequence *amp_tidal, const REAL8Sequence *planck_taper, const REAL8Sequence *fHz, REAL8 m1_SI, REAL8 m2_SI, REAL8 lambda1, REAL8 lambda2, NRTidal_version_type NRTidal_version)
Function to call the frequency domain tidal correction over an array of input frequencies.
double XLALSimNRTunedTidesMergerFrequency(const REAL8 mtot_MSUN, const REAL8 kappa2T, const REAL8 q)
compute the merger frequency of a BNS system.
static size_t NextPow2(const size_t n)
REAL8 XLALSimPhenomPNRafinal_nonprec(REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, LALDict *lalParams)
REAL8 XLALSimPhenomPNRwindow(REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, LALDict *lalParams)
IMRPhenomX_UsefulPowers powers_of_lalpi
int IMRPhenomXASGenerateFD(COMPLEX16FrequencySeries **htilde22, const REAL8Sequence *freqs_In, IMRPhenomXWaveformStruct *pWF, LALDict *lalParams)
int IMRPhenomXPGenerateFD(COMPLEX16FrequencySeries **hptilde, COMPLEX16FrequencySeries **hctilde, const REAL8Sequence *freqs_In, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, LALDict *lalParams)
REAL8 XLALSimPhenomPNRafinal(REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, LALDict *lalParams)
REAL8 XLALSimPhenomPNRbetaRD(REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, LALDict *lalParams)
REAL8 XLALSimPhenomPNRfRingEff(REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, LALDict *lalParams)
int IMRPhenomXCheckForUniformFrequencies(REAL8Sequence *frequencies, REAL8 df)
REAL8 XLALSimPhenomPNRafinal_prec(REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, LALDict *lalParams)
REAL8 XLALSimPhenomPNRfRINGEffShiftDividedByEmm(REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, LALDict *lalParams)
UINT4 IMRPhenomX_PNR_AttachMRBeta(const IMRPhenomX_PNR_beta_parameters *betaParams)
Determine whether to attach the MR contributions to beta.
REAL8 IMRPhenomX_PNR_GeneratePNRBetaNoMR(REAL8 Mf, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
This function evaluates only the rescaled inspiral beta given in Eq.
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_GeneratePNRBetaAtMf(REAL8 Mf, const IMRPhenomX_PNR_beta_parameters *betaParams, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, IMRPhenomXWaveformStruct *pWF_SingleSpin, IMRPhenomXPrecessionStruct *pPrec_SingleSpin)
This function evaluates Eqs.
void IMRPhenomX_PNR_FreeStructs(IMRPhenomXWaveformStruct **pWF_SingleSpin, IMRPhenomXPrecessionStruct **pPrec_SingleSpin, IMRPhenomX_PNR_alpha_parameters **alphaParams, IMRPhenomX_PNR_beta_parameters **betaParams)
INT4 IMRPhenomX_PNR_PopulateStructs(IMRPhenomXWaveformStruct **pWF_SingleSpin, IMRPhenomXPrecessionStruct **pPrec_SingleSpin, IMRPhenomX_PNR_alpha_parameters **alphaParams, IMRPhenomX_PNR_beta_parameters **betaParams, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, LALDict *lalParams)
These two functions create and populate the required parameter structs for PNR.
void IMRPhenomX_PNR_EnforceXASPhaseAlignment(double *linb, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPhaseCoefficients *pPhase)
INT4 IMRPhenomX_PNR_RemapThetaJSF(REAL8 beta_ref, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, LALDict *lalParams)
This code recomputes the skymapped locations in the J-frame using the new value of beta computed from...
static double IMRPhenomX_Inspiral_Phase_22_AnsatzInt(double Mf, IMRPhenomX_UsefulPowers *powers_of_Mf, IMRPhenomXPhaseCoefficients *pPhase)
Ansatz for the inspiral phase.
static double IMRPhenomX_Inspiral_Amp_22_Ansatz(double Mf, IMRPhenomX_UsefulPowers *powers_of_Mf, IMRPhenomXWaveformStruct *pWF, IMRPhenomXAmpCoefficients *pAmp)
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)
NRTidal_version_type IMRPhenomX_SetTidalVersion(LALDict *lalParams)
double IMRPhenomX_TimeShift_22(IMRPhenomXPhaseCoefficients *pPhase, IMRPhenomXWaveformStruct *pWF)
REAL8 IMRPhenomX_TidalPhaseDerivative(IMRPhenomX_UsefulPowers *powers_of_Mf, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPhaseCoefficients *pPhase, NRTidal_version_type NRTidal_version)
void IMRPhenomX_Phase_22_ConnectionCoefficients(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPhaseCoefficients *pPhase)
int IMRPhenomXGetAmplitudeCoefficients(IMRPhenomXWaveformStruct *pWF, IMRPhenomXAmpCoefficients *pAmp)
int IMRPhenomX_Initialize_Powers(IMRPhenomX_UsefulPowers *p, REAL8 number)
double IMRPhenomX_Phase_22(double ff, IMRPhenomX_UsefulPowers *powers_of_f, IMRPhenomXPhaseCoefficients *pPhase, IMRPhenomXWaveformStruct *pWF)
void IMRPhenomXGetTidalPhaseCoefficients(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPhaseCoefficients *pPhase, NRTidal_version_type NRTidal_version)
REAL8 IMRPhenomX_TidalPhase(IMRPhenomX_UsefulPowers *powers_of_Mf, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPhaseCoefficients *pPhase, NRTidal_version_type NRTidal_version)
int IMRPhenomXGetPhaseCoefficients(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPhaseCoefficients *pPhase)
double IMRPhenomX_dPhase_22(double ff, IMRPhenomX_UsefulPowers *powers_of_f, IMRPhenomXPhaseCoefficients *pPhase, IMRPhenomXWaveformStruct *pWF)
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 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.
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.
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_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.
vector IMRPhenomX_Return_phi_zeta_costhetaL_MSA(const double v, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
Wrapper to generate , and at a given frequency.
int IMRPhenomXPTwistUp22_NumericalAngles(const COMPLEX16 hAS, REAL8 alpha, REAL8 cos_beta, REAL8 gamma, IMRPhenomXPrecessionStruct *pPrec, COMPLEX16 *hp, COMPLEX16 *hc)
Core twisting up routine for SpinTaylor angles.
int 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:
static double IMRPhenomX_Ringdown_Phase_22_AnsatzInt(double ff, IMRPhenomX_UsefulPowers *powers_of_f, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPhaseCoefficients *pPhase)
static double IMRPhenomX_Ringdown_Amp_22_Ansatz(double ff, IMRPhenomXWaveformStruct *pWF, IMRPhenomXAmpCoefficients *pAmp)
INT4 XLALIMRPhenomXPCheckMassesAndSpins(REAL8 *m1, REAL8 *m2, REAL8 *chi1x, REAL8 *chi1y, REAL8 *chi1z, REAL8 *chi2x, REAL8 *chi2y, REAL8 *chi2z)
Check if m1 > m2.
COMPLEX16FrequencySeries * XLALResizeCOMPLEX16FrequencySeries(COMPLEX16FrequencySeries *series, int first, size_t length)
COMPLEX16FrequencySeries * XLALCreateCOMPLEX16FrequencySeries(const CHAR *name, const LIGOTimeGPS *epoch, REAL8 f0, REAL8 deltaF, const LALUnit *sampleUnits, size_t length)
void * XLALMalloc(size_t n)
@ NRTidal_V
version NRTidal: based on https://arxiv.org/pdf/1706.02969.pdf
@ NoNRT_V
special case for PhenomPv2 BBH baseline
@ NRTidalv2_V
version NRTidalv2: https://arxiv.org/abs/1905.06011
double XLALSimIMRPhenomXASDuration(const REAL8 m1_SI, const REAL8 m2_SI, const REAL8 chi1L, const REAL8 chi2L, const REAL8 f_start)
Compute the duration of IMRPhenomXAS using the approximate SPA relation .
int XLALSimIMRPhenomXASGenerateFD(COMPLEX16FrequencySeries **htilde22, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1L, REAL8 chi2L, REAL8 distance, REAL8 f_min, REAL8 f_max, REAL8 deltaF, REAL8 phi0, REAL8 fRef_In, LALDict *lalParams)
Driver routine to calculate an IMRPhenomX aligned-spin, inspiral-merger-ringdown phenomenological wav...
int XLALSimIMRPhenomXASFrequencySequence(COMPLEX16FrequencySeries **htilde22, const REAL8Sequence *freqs, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1L, REAL8 chi2L, REAL8 distance, REAL8 phi0, REAL8 fRef_In, LALDict *lalParams)
Compute waveform in LAL format at specified frequencies for the IMRPhenomX model.
int XLALSimIMRPhenomXPMSAAngles(REAL8Sequence **alpha_of_f, REAL8Sequence **gamma_of_f, REAL8Sequence **cosbeta_of_f, const REAL8Sequence *freqs, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, REAL8 inclination, REAL8 fRef_In, INT4 mprime, LALDict *lalParams)
int XLALSimIMRPhenomXPGenerateFD(COMPLEX16FrequencySeries **hptilde, COMPLEX16FrequencySeries **hctilde, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, const REAL8 distance, const REAL8 inclination, const REAL8 phiRef, REAL8 f_min, REAL8 f_max, const REAL8 deltaF, REAL8 fRef_In, LALDict *lalParams)
int XLALSimIMRPhenomXPFrequencySequence(COMPLEX16FrequencySeries **hptilde, COMPLEX16FrequencySeries **hctilde, const REAL8Sequence *freqs, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, const REAL8 distance, const REAL8 inclination, const REAL8 phiRef, REAL8 fRef_In, LALDict *lalParams)
Compute waveform in LAL format at specified frequencies for the IMRPhenomXP model.
int IMRPhenomX_PNR_GeneratePNRAngles(REAL8Sequence *alphaPNR, REAL8Sequence *betaPNR, REAL8Sequence *gammaPNR, const REAL8Sequence *freqs, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, LALDict *lalParams)
Generate the tuned precession angles outlined in arXiv:2107.08876.
int XLALSimIMRPhenomXPCalculateModelParametersFromSourceFrame(REAL8 *chi1L, REAL8 *chi2L, REAL8 *chi_p, REAL8 *thetaJN, REAL8 *alpha0, REAL8 *phi_aligned, REAL8 *zeta_polarization, REAL8 m1_SI, REAL8 m2_SI, REAL8 f_ref, REAL8 phiRef, REAL8 incl, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, LALDict *lalParams)
int XLALSimIMRPhenomXPPNAngles(REAL8Sequence **alpha_of_f, REAL8Sequence **gamma_of_f, REAL8Sequence **cosbeta_of_f, const REAL8Sequence *freqs, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, REAL8 inclination, REAL8 fRef_In, INT4 mprime, LALDict *lalParams)
void XLALDestroyREAL8Sequence(REAL8Sequence *sequence)
REAL8Sequence * XLALCreateREAL8Sequence(size_t length)
const LALUnit lalStrainUnit
const LALUnit lalSecondUnit
LALUnit * XLALUnitMultiply(LALUnit *output, const LALUnit *unit1, const LALUnit *unit2)
#define XLAL_PRINT_INFO(...)
#define XLAL_CHECK(assertion,...)
#define XLAL_PRINT_WARNING(...)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
LIGOTimeGPS * XLALGPSAdd(LIGOTimeGPS *epoch, REAL8 dt)
gsl_interp_accel * gamma_acc
PhenomXPbetaMRD * beta_params
Parameters needed for analytical MRD continuation of cosbeta.
gsl_spline * gamma_spline
REAL8 zeta_polarization
Angle to rotate the polarizations.
REAL8 thetaJN
Angle between J0 and line of sight (z-direction)
INT4 IMRPhenomXPNRUseTunedAngles
IMRPhenomXWaveformStruct * pWF22AS
REAL8 epsilon_offset
Offset for .
gsl_interp_accel * alpha_acc
REAL8 alpha_offset
Offset for .
REAL8 alpha0
Coefficient of .
INT4 IMRPhenomXAntisymmetricWaveform
PhenomXPalphaMRD * alpha_params
Parameters needed for analytical MRD continuation of alpha.
gsl_spline * alpha_spline
REAL8 chi_singleSpin
Magnitude of effective single spin used for tapering two-spin angles, Eq.
REAL8 PolarizationSymmetry
gsl_interp_accel * cosbeta_acc
gsl_spline * cosbeta_spline
REAL8 phi0_aligned
Initial phase to feed the underlying aligned-spin model.