21#include <lal/Sequence.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>
49#define PHENOMXPDEBUG 0
53#define PHENOMXPDEBUG 1
198 printf(
"fRef_In : %e\n",fRef_In);
199 printf(
"m1_SI : %e\n",m1_SI);
200 printf(
"m2_SI : %e\n",m2_SI);
201 printf(
"chi1L : %e\n",chi1L);
202 printf(
"chi2L : %e\n\n",chi2L);
203 printf(
"Performing sanity checks...\n");
208 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
214 if(distance < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"Distance must be positive and greater than 0.\n"); }
227 mass_ratio = m1_SI / m2_SI;
231 mass_ratio = m2_SI / m1_SI;
233 if(mass_ratio > 20.0 ) {
XLAL_PRINT_INFO(
"Warning: Extrapolating outside of Numerical Relativity calibration domain."); }
234 if(mass_ratio > 1000. && fabs(mass_ratio - 1000) > 1
e-12) {
XLAL_ERROR(
XLAL_EDOM,
"ERROR: Model not valid at mass ratios beyond 1000."); }
235 if(fabs(chi1L) > 0.99 || fabs(chi2L) > 0.99) {
XLAL_PRINT_INFO(
"Warning: Extrapolating to extremal spins, model is not trusted."); }
238 REAL8 fRef = (fRef_In == 0.0) ?
f_min : fRef_In;
243 printf(
"\n\n **** Initializing waveform struct... **** \n\n");
254 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phi0,
f_min,
f_max, distance, 0.0, lalParams, debug);
268 printf(
"\n\n **** Calling IMRPhenomXASGenerateFD... **** \n\n");
277 printf(
"\n\n **** Call to IMRPhenomXASGenerateFD complete. **** \n\n");
291 lastfreq = pWF->
fMax;
298 size_t n = (*htilde22)->data->length;
302 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 );
333 INT4 return_code = 0;
337 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
340 if(distance < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"Distance must be positive and greater than 0.\n"); }
353 mass_ratio = m1_SI / m2_SI;
357 mass_ratio = m2_SI / m1_SI;
359 if(mass_ratio > 20.0 ) {
XLAL_PRINT_INFO(
"Warning: Extrapolating outside of Numerical Relativity calibration domain."); }
362 if(mass_ratio > 1000. && fabs(mass_ratio - 1000) > 1
e-12) {
XLAL_ERROR(
XLAL_EDOM,
"ERROR: Model not valid at mass ratios beyond 1000."); }
363 if(fabs(chi1L) > 0.99 || fabs(chi2L) > 0.99) {
XLAL_PRINT_INFO(
"Warning: Extrapolating to extremal spins, model is not trusted."); }
366 REAL8 fRef = (fRef_In == 0.0) ? freqs->
data[0] : fRef_In;
385 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);
420 if(fabs(chi1L) > 1.0) {
XLAL_ERROR(
XLAL_EDOM,
"Unphysical chi_1 requested: must obey the Kerr bound [-1,1].\n"); }
421 if(fabs(chi2L) > 1.0) {
XLAL_ERROR(
XLAL_EDOM,
"Unphysical chi_2 requested: must obey the Kerr bound [-1,1].\n"); }
436 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, 0, f_start, f_start, 0, 0, 1.0, 0.0, lal_dict, debug);
465 double dphi_start = 0.0;
466 double dphi_end = 0.0;
469 double Mf_start = f_start * M_sec;
525 printf(
"\n **** Now in IMRPhenomXASGenerateFD... **** \n");
562 REAL8 pfaN = 3./(128.*X_A*X_B);
573 printf(
"npts = %zu\n",npts);
574 printf(
"fMin = %.4f\n",
f_min);
575 printf(
"fMax = %.4f\n",
f_max);
576 printf(
"dF = %.4f\n",pWF->
deltaF);
592 "minimum freq index %zu and maximum freq index %zu do not fulfill 0<=ind_min<=ind_max<=htilde->data>length=%zu.", iStart, iStop, npts);
602 for (
UINT4 i = iStart;
i < iStop;
i++)
614 XLAL_CHECK (*htilde22,
XLAL_ENOMEM,
"Failed to allocated waveform COMPLEX16FrequencySeries of length %zu from sequence.", npts);
632 memset((*htilde22)->data->data, 0, npts *
sizeof(
COMPLEX16));
636 INT4 lalParams_In = 0;
637 if(lalParams == NULL)
645 printf(
"\n\n **** Initializing amplitude struct... **** \n\n");
656 printf(
"\n\n **** Amplitude struct initialized. **** \n\n");
657 printf(
"\n\n **** Initializing phase struct... **** \n\n");
670 printf(
"\n\n **** Phase struct initialized. **** \n\n");
693 if ( APPLY_PNR_DEVIATIONS && PNRForceXHMAlignment ) {
711 double phiTfRef = 0.;
720 switch (NRTidal_version) {
728 f_merger = f_merger_tmp;
738 REAL8 tshift = -dphi_fmerger;
773 printf(
"\n\n **** Phase struct initialized. **** \n\n");
774 printf(
"C1IM = %.4f\n",C1IM);
775 printf(
"C2IM = %.4f\n",C2IM);
776 printf(
"C1RD = %.4f\n",C1RD);
777 printf(
"C2RD = %.4f\n",C2RD);
778 printf(
"fIN = %.4f\n",fPhaseIN);
779 printf(
"fIM = %.4f\n",fPhaseIM);
787 if (NRTidal_version!=
NoNRT_V) {
794 ret =
XLALSimNRTunedTidesFDTidalPhaseFrequencySeries(phi_tidal, amp_tidal, planck_taper, freqs, pWF->
m1_SI, pWF->
m2_SI, lambda1, lambda2, pWF->
chi1L, pWF->
chi2L, NRTidal_version);
799 #pragma omp parallel for
802 double Mf = Msec * freqs->
data[idx];
803 UINT4 jdx = idx + offset;
815 XLALPrintError(
"IMRPhenomX_Initialize_Powers failed for Mf, initial_status=%d",initial_status);
829 else if(Mf > fPhaseIM)
840 phi += linb*Mf + lina + phifRef;
865 ((*htilde22)->data->data)[jdx] = phi;
869 if (NRTidal_version!=
NoNRT_V) {
872 double ampTidal = amp_tidal->
data[idx];
873 double window = planck_taper->
data[idx];
891 else if (NRTidal_version ==
NoNRT_V) {
893 ((*htilde22)->data->data)[jdx] = Amp0 * powers_of_Mf.
m_seven_sixths * amp * cexp(I * phi);
896 XLAL_PRINT_INFO(
"Warning: Only NRTidal, NRTidalv2, NRTidalv3, and NoNRT NRTidal_version values allowed and NRTidal is not implemented completely in IMRPhenomX*.");
905 ((*htilde22)->data->data)[jdx] = 0.0 + I*0.0;
920 if(lalParams_In == 1)
938 if( (frequencies->
length == 2) && (df > 0.) )
1063 const REAL8 distance,
1064 const REAL8 inclination,
1081 const REAL8 m1_SI_init = m1_SI;
1082 const REAL8 m2_SI_init = m2_SI;
1083 const REAL8 chi1z_init = chi1z;
1084 const REAL8 chi2z_init = chi2z;
1089 #if PHENOMXPDEBUG == 1
1090 printf(
"fRef_In : %e\n",fRef_In);
1091 printf(
"m1_SI : %e\n",m1_SI);
1092 printf(
"m2_SI : %e\n",m2_SI);
1093 printf(
"chi1z : %e\n",chi1z);
1094 printf(
"chi2z : %e\n",chi2z);
1095 printf(
"phiRef : %e\n",phiRef);
1097 printf(
"Performing sanity checks...\n");
1103 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
1109 if(distance <= 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"Distance must be positive and greater than 0.\n"); }
1123 mass_ratio = m1_SI / m2_SI;
1127 mass_ratio = m2_SI / m1_SI;
1129 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"); }
1130 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"); }
1131 if(fabs(chi1z) > 0.99 || fabs(chi2z) > 0.99) {
XLAL_PRINT_WARNING(
"Warning: Extrapolating to extremal spins, aligned spin model is not trusted.\n"); }
1134 const REAL8 fRef = (fRef_In == 0.0) ?
f_min : fRef_In;
1137 LALDict *lalParams_aux;
1139 if (lalParams == NULL)
1147 #if PHENOMXPDEBUG == 1
1148 printf(
"\n\n **** Initializing waveform struct... **** \n\n");
1159 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);
1173 (fRef >= pWF->
fMin)&&(fRef <= pWF->f_max_prime),
1175 "Error: f_min = %.2f <= fRef = %.2f < f_max = %.2f required when using tuned angles.\n",pWF->
fMin,fRef,pWF->
f_max_prime);
1178 #if PHENOMXPDEBUG == 1
1179 printf(
"\n\n **** Initializing precession struct... **** \n\n");
1189 if(pflag==310||pflag==311||pflag==320||pflag==321||pflag==330)
1208 #if PHENOMXPDEBUG == 1
1209 printf(
"\n\n **** Calling IMRPhenomXPGenerateFD... **** \n\n");
1216 #if PHENOMXPDEBUG == 1
1217 printf(
"\n\n **** Call to IMRPhenomXPGenerateFD complete. **** \n\n");
1228 lastfreq = pWF->
fMax;
1236 size_t n = (*hptilde)->data->length;
1240 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 );
1244 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 );
1281 const REAL8 distance,
1282 const REAL8 inclination,
1290 const REAL8 m1_SI_init = m1_SI;
1291 const REAL8 m2_SI_init = m2_SI;
1292 const REAL8 chi1z_init = chi1z;
1293 const REAL8 chi2z_init = chi2z;
1304 XLAL_CHECK(freqs != NULL,
XLAL_EFAULT,
"Error: XLALSimIMRPhenomXPFrequencySequence *freqs is null.\n");
1309 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
1312 if(distance < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"Distance must be positive and greater than 0.\n"); }
1325 mass_ratio = m1_SI / m2_SI;
1329 mass_ratio = m2_SI / m1_SI;
1331 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"); }
1332 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"); }
1333 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"); }
1336 const REAL8 fRef = (fRef_In == 0.0) ? freqs->
data[0] : fRef_In;
1343 (fRef >= f_min_In)&&(fRef <= f_max_In),
1345 "Error: f_min = %.2f <= fRef = %.2f < f_max = %.2f required when using tuned angles.\n",f_min_In,fRef,f_max_In);
1349 LALDict *lalParams_aux;
1351 if (lalParams == NULL)
1369 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);
1378 if(pflag==310||pflag==311||pflag==320||pflag==321||pflag==330)
1438 REAL8 *zeta_polarization,
1461 XLAL_CHECK(f_ref > 0,
XLAL_EDOM,
"Error in XLALSimIMRPhenomXPCalculateModelParametersFromSourceFrame: Reference frequency must be positive.\n");
1462 XLAL_CHECK(m1_SI > 0,
XLAL_EDOM,
"Error in XLALSimIMRPhenomXPCalculateModelParametersFromSourceFrame: m1 must be positive.\n");
1463 XLAL_CHECK(m2_SI > 0,
XLAL_EDOM,
"Error in XLALSimIMRPhenomXPCalculateModelParametersFromSourceFrame: m2 must be positive.\n");
1464 XLAL_CHECK(fabs(chi1x*chi1x + chi1y*chi1y + chi1z*chi1z) <= 1.0,
XLAL_EDOM,
"Error in XLALSimIMRPhenomXPCalculateModelParametersFromSourceFrame: |S1/m1^2| must be <= 1.\n");
1465 XLAL_CHECK(fabs(chi2x*chi2x + chi2y*chi2y + chi2z*chi2z) <= 1.0,
XLAL_EDOM,
"Error in XLALSimIMRPhenomXPCalculateModelParametersFromSourceFrame: |S2/m2^2| must be <= 1.\n");
1468 LALDict *lalParams_aux;
1470 if (lalParams == NULL)
1490 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1z, chi2z, 0.125, f_ref, phiRef, 30., 1024., 1e6*
LAL_PC_SI, incl, lalParams_aux,
PHENOMXDEBUG);
1532 "Error: IMRPhenomX_PNR_PopulateStructs failed!\n");
1534 REAL8 betaPNR_ref = 0.0;
1543 if ((q <= pPrec->PNR_q_window_lower) && (chi <= pPrec->PNR_chi_window_lower))
1556 else if ((q <= pPrec->PNR_q_window_upper) && (chi <= pPrec->PNR_chi_window_upper))
1578 "Error: IMRPhenomX_PNR_RemapThetaJSF failed in IMRPhenomX_PNR_GeneratePNRAngles.");
1592 *chi_p = pPrec->
chi_p;
1644 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
1653 const REAL8 fRef = (fRef_In == 0.0) ? freqs->
data[0] : fRef_In;
1659 LALDict *lalParams_aux;
1661 if (lalParams == NULL)
1673 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);
1682 if (pflag == 300) pflag = 223;
1684 if(pflag != 220 && pflag != 221 && pflag != 222 && pflag != 223 && pflag != 224)
1686 XLAL_ERROR(
XLAL_EDOM,
"Error: MSA system currently only supported for IMRPhenomXPrecVersion 220, 221, 222, 223 or 224.\n");
1706 vector vangles = {0.,0.,0.};
1715 v = cbrt( freqs->
data[
i] * pPrec->
piGM * (2.0 / mprime) );
1720 (*cosbeta_of_f)->data[
i] = vangles.
z;
1764 #if PHENOMXPDEBUG == 1
1765 printf(
"\nm1 : %.6f\n",m1_SI);
1766 printf(
"m2 : %.6f\n",m2_SI);
1767 printf(
"chi1x : %.6f\n",chi1x);
1768 printf(
"chi1y : %.6f\n",chi1y);
1769 printf(
"chi1z : %.6f\n",chi1z);
1770 printf(
"chi2x : %.6f\n",chi2x);
1771 printf(
"chi2y : %.6f\n",chi2y);
1772 printf(
"chi2z : %.6f\n\n",chi2z);
1776 if(fRef_In < 0.0) {
XLAL_ERROR(
XLAL_EDOM,
"fRef_In must be positive or set to 0 to ignore.\n"); }
1785 const REAL8 fRef = (fRef_In == 0.0) ? freqs->
data[0] : fRef_In;
1791 LALDict *lalParams_aux;
1793 if (lalParams == NULL)
1805 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);
1838 REAL8 v, omega, logomega, omega_cbrt, omega_cbrt2;
1850 omega = freqs->
data[
i] * pPrec->
piGM * (2.0 / mprime);
1851 logomega = log(omega);
1852 omega_cbrt = cbrt(omega);
1853 omega_cbrt2 = omega_cbrt * omega_cbrt;
1856 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);
1863 s = pPrec->
Sperp / (L + pPrec->
SL);
1866 (*cosbeta_of_f)->data[
i] = copysign(1.0, L + pPrec->
SL) / sqrt(1.0 + s2);
1896 #if PHENOMXPDEBUG == 1
1897 printf(
"\n **** Now in IMRPhenomXPGenerateFD... **** \n");
1936 REAL8 pfaN = 3./(128.*X_A*X_B);
1945 #if PHENOMXPDEBUG == 1
1946 printf(
"npts = %zu\n",npts);
1947 printf(
"fMin = %.4f\n",
f_min);
1948 printf(
"fMax = %.4f\n",
f_max);
1949 printf(
"dF = %.4f\n",pWF->
deltaF);
1965 size_t iStop = (size_t) (
f_max / pWF->
deltaF) + 1;
1968 "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);
1978 for (
UINT4 i = iStart;
i < iStop;
i++)
1991 XLAL_CHECK (*hptilde,
XLAL_ENOMEM,
"Failed to allocated waveform COMPLEX16FrequencySeries h_+ of length %zu from sequence.\n", npts);
1992 XLAL_CHECK (*hctilde,
XLAL_ENOMEM,
"Failed to allocated waveform COMPLEX16FrequencySeries h_x of length %zu from sequence.\n", npts);
2010 memset((*hptilde)->data->data, 0, npts *
sizeof(
COMPLEX16));
2013 memset((*hctilde)->data->data, 0, npts *
sizeof(
COMPLEX16));
2017 UNUSED
INT4 lalParams_In = 0;
2018 if(lalParams == NULL)
2024 #if PHENOMXPDEBUG == 1
2025 printf(
"\n\n **** Initializing amplitude struct... **** \n\n");
2047 #if PHENOMXPDEBUG == 1
2048 printf(
"\n\n **** Amplitude struct initialized. **** \n\n");
2049 printf(
"\n\n **** Initializing phase struct... **** \n\n");
2059 #if PHENOMXPDEBUG == 1
2060 printf(
"\n\n **** Phase struct initialized. **** \n\n");
2084 double phiTfRef = 0.;
2092 switch (NRTidal_version) {
2101 f_merger = f_merger_tmp;
2102 if(f_merger<f_final)
2110 REAL8 tshift = -dphi_fmerger;
2145 if(PNRUseTunedAngles)
2164 alphaPNR, betaPNR, gammaPNR,
2173 sprintf(fileSpec2,
"angles_PNR.dat");
2175 printf(
"\nOutput angle file: %s\r\n", fileSpec2);
2176 fileangle2 = fopen(fileSpec2,
"w");
2179 fprintf(fileangle2,
"#fHz alpha beta gamma\n");
2183 fprintf(fileangle2,
"%.16e %.16e %.16e %.16e\n", freqs->
data[idx], alphaPNR->data[idx], betaPNR->data[idx], gammaPNR->data[idx]);
2189 #if PHENOMXPDEBUG == 1
2190 printf(
"\n\n **** Phase struct initialized. **** \n\n");
2191 printf(
"C1IM = %.4f\n",C1IM);
2192 printf(
"C2IM = %.4f\n",C2IM);
2193 printf(
"C1RD = %.4f\n",C1RD);
2194 printf(
"C2RD = %.4f\n",C2RD);
2195 printf(
"fIN = %.4f\n",fPhaseIN);
2196 printf(
"fIM = %.4f\n",fPhaseIM);
2197 printf(
"thetaJN = %.4f\n",pPrec->
thetaJN);
2218 XLALPrintError(
"IMRPhenomX_Initialize_Powers failed for fmax, initial_status=%d",initial_status);
2225 sprintf(fileSpec,
"angles_XP.dat");
2227 printf(
"\nOutput angle file: %s\r\n", fileSpec);
2228 fileangle = fopen(fileSpec,
"w");
2231 fprintf(fileangle,
"#fHz cexp_i_alpha(re im) cexp_i_epsilon(re im) cexp_i_betah(re im)\n");
2243 ret =
XLALSimNRTunedTidesFDTidalPhaseFrequencySeries(phi_tidal, amp_tidal, planck_taper, freqs, pWF->
m1_SI, pWF->
m2_SI, lambda1, lambda2, pWF->
chi1L, pWF->
chi2L, NRTidal_version);
2256 REAL8 phi_antiSym = 0.0;
2257 REAL8 amp_antiSym = 0.0;
2258 double MfT = 0.85 * pWF->
fRING;
2260 if(AntisymmetricWaveform)
2262 if (!PNRUseTunedAngles)
2264 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");
2271 XLAL_ERROR(
XLAL_EFUNC,
"antisymmetric waveform amplitude ratio array allocation failed in LALSimIMRPhenomX.c");
2277 &A0, &phi_A0, &phi_B0, MfT, lina, linb, inveta, pWF,pPrec,pPhase22);
2283 #pragma omp parallel for
2286 double Mf = pWF->
M_sec * freqs->
data[idx];
2287 UINT4 jdx = idx + offset;
2303 XLALPrintError(
"IMRPhenomX_Initialize_Powers failed for Mf, initial_status=%d\n",initial_status);
2321 else if(Mf > fPhaseIM)
2331 phi += linb*Mf + lina + pWF->
phifRef;
2338 else if(Mf > fAmpIM)
2351 REAL8 phaseTidal = phi_tidal->
data[idx];
2352 double ampTidal = amp_tidal->
data[idx];
2353 double window = planck_taper->
data[idx];
2371 else if (NRTidal_version ==
NoNRT_V) {
2373 hcoprec = Amp0 * powers_of_Mf.
m_seven_sixths * amp * cexp(I * phi);
2377 XLAL_PRINT_INFO(
"Warning: Only NRTidal, NRTidalv2, NRTidalv3, and NoNRT NRTidal_version values allowed and NRTidal is not implemented completely in IMRPhenomX*.");
2385 hplus = 0.5 * (hcoprec);
2386 hcross = -0.5 * I * (hcoprec);
2392 if(PNRUseTunedAngles)
2394 pPrec->
alphaPNR = alphaPNR->data[idx];
2395 pPrec->
betaPNR = betaPNR->data[idx];
2396 pPrec->
gammaPNR = gammaPNR->data[idx];
2409 if(AntisymmetricWaveform && PNRUseTunedAngles)
2414 phi_antiSym = phi/2 + alphaPNR->data[idx] + A0 *Mf + phi_A0;
2418 phi_antiSym = phi + phi_B0;
2423 amp_antiSym = cabs(hcoprec)*kappa->
data[idx];
2424 hcoprec_antiSym = amp_antiSym* cexp(I * phi_antiSym);
2428 hplus += hplus_antiSym;
2429 hcross += hcross_antiSym;
2435 ((*hptilde)->data->data)[jdx] = hplus;
2436 ((*hctilde)->data->data)[jdx] = hcross;
2442 ((*hptilde)->data->data)[jdx] = 0.0 + I*0.0;
2443 ((*hctilde)->data->data)[jdx] = 0.0 + I*0.0;
2461 gsl_interp_accel_free(pPrec->
alpha_acc);
2462 gsl_interp_accel_free(pPrec->
gamma_acc);
2476 REAL8 cosPolFac, sinPolFac;
2484 for (
UINT4 i = 0;
i < (*hptilde)->data->length;
i++)
2486 PhPpolp = (*hptilde)->data->data[
i];
2487 PhPpolc = (*hctilde)->data->data[
i];
2489 (*hptilde)->data->data[
i] = (cosPolFac * PhPpolp) + (sinPolFac * PhPpolc);
2490 (*hctilde)->data->data[
i] = (cosPolFac * PhPpolc) - (sinPolFac * PhPpolp);
2504 if(PNRUseTunedAngles){
2510 if(AntisymmetricWaveform){
2514 if(lalParams_In == 1)
2535 LALDict *lalParams_aux;
2537 if (lalParams == NULL)
2546 const REAL8 chi1L = chi1z;
2547 const REAL8 chi2L = chi2z;
2549 const REAL8 deltaF = 0.0001;
2552 const REAL8 distance = 1.0;
2553 const REAL8 inclination = 0.0;
2555 const REAL8 phiRef = 0.0;
2564 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phiRef,
f_min,
f_max, distance, inclination, lalParams_aux, 0);
2597 return fRING22_prec;
2614 LALDict *lalParams_aux;
2616 if (lalParams == NULL)
2625 const REAL8 chi1L = chi1z;
2626 const REAL8 chi2L = chi2z;
2628 const REAL8 deltaF = 0.0001;
2631 const REAL8 distance = 1.0;
2632 const REAL8 inclination = 0.0;
2634 const REAL8 phiRef = 0.0;
2643 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phiRef,
f_min,
f_max, distance, inclination, lalParams_aux, 0);
2675 return fRINGEffShiftDividedByEmm;
2694 LALDict *lalParams_aux;
2696 if (lalParams == NULL)
2705 const REAL8 chi1L = chi1z;
2706 const REAL8 chi2L = chi2z;
2708 const REAL8 deltaF = 0.0001;
2711 const REAL8 distance = 1.0;
2712 const REAL8 inclination = 0.0;
2714 const REAL8 phiRef = 0.0;
2723 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phiRef,
f_min,
f_max, distance, inclination, lalParams_aux, 0);
2775 LALDict *lalParams_aux;
2777 if (lalParams == NULL)
2786 const REAL8 chi1L = chi1z;
2787 const REAL8 chi2L = chi2z;
2789 const REAL8 deltaF = 0.0001;
2792 const REAL8 distance = 1.0;
2793 const REAL8 inclination = 0.0;
2795 const REAL8 phiRef = 0.0;
2804 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phiRef,
f_min,
f_max, distance, inclination, lalParams_aux, 0);
2856 LALDict *lalParams_aux;
2858 if (lalParams == NULL)
2867 const REAL8 chi1L = chi1z;
2868 const REAL8 chi2L = chi2z;
2870 const REAL8 deltaF = 0.0001;
2873 const REAL8 distance = 1.0;
2874 const REAL8 inclination = 0.0;
2876 const REAL8 phiRef = 0.0;
2885 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phiRef,
f_min,
f_max, distance, inclination, lalParams_aux, 0);
2917 return afinal_nonprec;
2939 LALDict *lalParams_aux;
2941 if (lalParams == NULL)
2950 const REAL8 chi1L = chi1z;
2951 const REAL8 chi2L = chi2z;
2953 const REAL8 deltaF = 0.0001;
2956 const REAL8 distance = 1.0;
2957 const REAL8 inclination = 0.0;
2959 const REAL8 phiRef = 0.0;
2968 status =
IMRPhenomXSetWaveformVariables(pWF, m1_SI, m2_SI, chi1L, chi2L, deltaF, fRef, phiRef,
f_min,
f_max, distance, inclination, lalParams_aux, 0);
3019 LALDict *lalParams_aux;
3021 if (lalParams == NULL)
3030 const REAL8 chi1L = chi1z;
3031 const REAL8 chi2L = chi2z;
3033 const REAL8 deltaF = 0.0001;
3036 const REAL8 distance = 1.0;
3037 const REAL8 inclination = 0.0;
3039 const REAL8 phiRef = 0.0;
3048 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(const LALDict *orig)
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, REAL8 chi1, REAL8 chi2, NRTidal_version_type NRTidal_version)
Function to call the frequency domain tidal correction over an array of input frequencies.
double XLALSimNRTunedTidesMergerFrequency_v3(const REAL8 mtot_MSUN, const REAL8 lambda1, const REAL8 lambda2, const REAL8 q, const REAL8 chi1_AS, const REAL8 chi2_AS)
compute the merger frequency of a BNS system for NRTidalv3 (https://arxiv.org/pdf/2311....
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)
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.
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 * XLALCreateCOMPLEX16FrequencySeries(const CHAR *name, const LIGOTimeGPS *epoch, REAL8 f0, REAL8 deltaF, const LALUnit *sampleUnits, size_t length)
COMPLEX16FrequencySeries * XLALResizeCOMPLEX16FrequencySeries(COMPLEX16FrequencySeries *series, int first, size_t length)
void * XLALMalloc(size_t n)
@ NRTidalv3_V
version NRTidalv3
@ 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 IMRPhenomX_PNR_GenerateAntisymmetricPhaseCoefficients(REAL8 *A0, REAL8 *phi_A0, REAL8 *phi_B0, const double MfT, double lina, double linb, double inveta, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec, IMRPhenomXPhaseCoefficients *pPhase22)
Anti-symmetric phase coefficients/offsets.
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 IMRPhenomX_PNR_GenerateAntisymmetricAmpRatio(REAL8Sequence *kappa, const REAL8Sequence *freqs, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
GENERATE Antisymmetric amplitude ratio.
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.