19 #include <gsl/gsl_spline.h>
23 #include <lal/FrequencySeries.h>
24 #include <lal/LALConstants.h>
25 #include <lal/LALDatatypes.h>
26 #include <lal/LALSimInspiral.h>
27 #include <lal/LALSimInspiralTestingGRCorrections.h>
28 #include <lal/Sequence.h>
30 #include <lal/LALSimIMR.h>
41 res = 0.5626787200433265 + (-0.08706198756945482 +
42 0.0017434519312586804 * chi) *
43 log (10.26207326082448 -
44 chi * (7.629921628648589 -
45 72.75949266353584 * (-0.25 + eta)) -
46 62.353217004599784 * (-0.25 + eta));
59 const REAL8 f_window_div_f_Peak,
60 const REAL8 NCyclesStep,
65 if (LALpars==NULL)
return 0;
71 const REAL8 mt = m1 + m2;
73 const REAL8 eta = m1 * m2 / (mt * mt);
77 XLALPrintError(
"XLAL Error - %s: fRef is smaller than the starting frequency of the waveform, f_low. Please pass in the starting GW frequency instead.\n", __func__);
92 if(lambda1 == 0.0 && lambda2 == 0.0){
93 f22Peak =
Get22PeakAngFreq(eta, 0.5*(chi1z + chi2z) + 0.5*(chi1z - chi2z)*(m1 - m2)/(m1 + m2)/(1. - 2.*eta)) / (2.*
LAL_PI * m_sec);
96 else if(lambda1 != 0.0 && lambda2 != 0.0)
98 const REAL8 q = fmax(m1 / m2, m2 / m1);
103 f22Peak =
Get22PeakAngFreq(eta, 0.5*(chi1z + chi2z) + 0.5*(chi1z - chi2z)*(m1 - m2)/(m1 + m2)/(1. - 2.*eta)) / (2.*
LAL_PI * m_sec);
110 INT4 iStart, iStartFinal, iRef, iPeak;
111 iStart = (
UINT4) ceil((f_low/2.-f0) / deltaF);
112 iStartFinal = (
UINT4) ceil((f_low-f0) / deltaF);
113 iRef = (
UINT4) ceil((f_ref*
m/2.-f0) / deltaF);
114 iPeak = (
UINT4) fmin(ceil((f22Peak - f0) / deltaF),n-1);
122 for (
i = 0;
i < n;
i++)
124 freqs->
data[
i] = f0 +
i * deltaF;
128 const REAL8 qm_def1 = 1.;
129 const REAL8 qm_def2 = 1.;
131 XLALSimInspiralPNCorrections(&pfa, m1, m2, chi1z, chi2z, chi1z*chi1z, chi2z*chi2z, chi1z*chi2z, qm_def1, qm_def2, LALpars);
132 XLALSimInspiralPhaseCorrectionsPhasing(htilde,freqs,
m,iStart,iRef,iPeak,pfa,m_sec,eta,f_window_div_f_Peak,iStartFinal,NCyclesStep);
153 const REAL8 chi1dotchi2,
159 const REAL8 mtot = m1 + m2;
160 const REAL8 eta = m1*m2/mtot/mtot;
161 const REAL8 pfaN = 3.L/(128.L * eta);
162 const REAL8 d = (m1 - m2) / (m1 + m2);
163 const REAL8 m1M = m1/mtot;
164 const REAL8 m2M = m2/mtot;
165 const REAL8 SL = m1M*m1M*chi1L + m2M*m2M*chi2L;
166 const REAL8 dSigmaL =
d*(m2M*chi2L - m1M*chi1L);
167 REAL8 pn_sigma = eta * (721.L/48.L*chi1L*chi2L - 247.L/48.L*chi1dotchi2);
168 pn_sigma += (720.L*qm_def1 - 1.L)/96.0L * m1M * m1M * chi1L * chi1L;
169 pn_sigma += (720.L*qm_def2 - 1.L)/96.0L * m2M * m2M * chi2L * chi2L;
170 pn_sigma -= (240.L*qm_def1 - 7.L)/96.0L * m1M * m1M * chi1sq;
171 pn_sigma -= (240.L*qm_def2 - 7.L)/96.0L * m2M * m2M * chi2sq;
172 REAL8 pn_ss3 = (326.75L/1.12L + 557.5L/1.8L*eta)*eta*chi1L*chi2L;
173 pn_ss3 += ((4703.5L/8.4L+2935.L/6.L*m1M-120.L*m1M*m1M)*qm_def1 + (-4108.25L/6.72L-108.5L/1.2L*m1M+125.5L/3.6L*m1M*m1M)) *m1M*m1M * chi1sq;
174 pn_ss3 += ((4703.5L/8.4L+2935.L/6.L*m2M-120.L*m2M*m2M)*qm_def2 + (-4108.25L/6.72L-108.5L/1.2L*m2M+125.5L/3.6L*m2M*m2M)) *m2M*m2M * chi2sq;
175 const REAL8 pn_gamma = (554345.L/1134.L + 110.L*eta/9.L)*SL + (13915.L/84.L - 10.L*eta/3.L)*dSigmaL;
178 const REAL8 chiS = 0.5L * (chi1L + chi2L);
179 const REAL8 chiA = 0.5L * (chi1L - chi2L);
180 const REAL8 siqm_2pn_kappaS = 50.L * (2.L*eta - 1.L) * (chiS*chiS + chiA*chiA) -100.L *
d * chiA * chiS;
181 const REAL8 siqm_2pn_kappaA = -50.L *
d * (chiS*chiS + chiA*chiA) + 100.L * (2.L*eta - 1.L) * chiA * chiS;
182 const REAL8 siqm_3pn_kappaS = (chiS*chiS + chiA*chiA) * (26015.L/28.L - 44255.L/21.L * eta - 240.L * eta*eta) + chiA * chiS *
d * (26015.L/14.L - 1495.L/3. * eta);
183 const REAL8 siqm_3pn_kappaA = (26015.L/28.L - 1495.L/6.L * eta) *
d * (chiS*chiS + chiA*chiA) + (26015.L/14.L - 88510.L/21.L *eta - 480.L *eta*eta) * chiS * chiA;
197 pfa->
v[2] = 5.L*(743.L/84.L + 11.L * eta)/9.L;
204 pfa->
v[3] += 188.L*SL/3.L + 25.L*dSigmaL;
214 pfa->
v[4] = 5.L*(3058.673L/7.056L + 5429.L/7.L * eta + 617.L * eta*eta)/72.L;
215 pfa->
v[4] += -10.L * pn_sigma;
229 pfa->
v[5] = 5.L/9.L * (7729.L/84.L - 13.L * eta) *
LAL_PI;
230 pfa->
v[5] += -1.L * pn_gamma;
240 pfa->
vlogv[5] = 5.L/3.L * (7729.L/84.L - 13.L * eta) *
LAL_PI;
241 pfa->
vlogv[5] += -3.L * pn_gamma;
251 pfa->
v[6] = (11583.231236531L/4.694215680L - 640.L/3.L *
LAL_PI *
LAL_PI - 6848.L/21.L*
LAL_GAMMA) + eta * (-15737.765635L/3.048192L + 2255./12. *
LAL_PI *
LAL_PI) + eta*eta * 76055.L/1728.L - eta*eta*eta * 127825.L/1296.L;
252 pfa->
v[6] += (-6848.L/21.L)*log(4.);
253 pfa->
v[6] +=
LAL_PI * (3760.L*SL + 1490.L*dSigmaL)/3.L + pn_ss3;
267 pfa->
vlogv[6] = -6848.L/21.L;
273 pfa->
v[7] =
LAL_PI * ( 77096675.L/254016.L + 378515.L/1512.L * eta - 74045.L/756.L * eta*eta);
274 pfa->
v[7] += (-8980424995.L/762048.L + 6586595.L*eta/756.L - 305.L*eta*eta/36.L)*SL - (170978035.L/48384.L - 2876425.L*eta/672.L - 4735.L*eta*eta/144.L) * dSigmaL;
286 pfa->
vlogv[ii] *= pfaN;
288 pfa->
vneg[ii] *= pfaN;
305 const REAL8 f_window_div_f_Peak,
306 const REAL8 iStartFinal,
307 const REAL8 NCyclesStep
312 const REAL8 pfaN0 = 3.L/(128.L * eta);
315 const REAL8 vWindow = cbrt(2*piM * f_window_div_f_Peak * freqs->
data[iPeak]/2);
316 const REAL8 width = (NCyclesStep *
LAL_PI * vWindow * vWindow * vWindow * vWindow * vWindow * vWindow)/(50. * pfaN0);
325 for (
i = iStart;
i < freqs->
length;
i++)
334 REAL8Sequence *dphasenonGRdfTapered = NULL, *phasenonGRTapered = NULL;
338 gsl_spline *splineTemp = NULL;
339 gsl_interp_accel *acc = NULL;
340 splineTemp = gsl_spline_alloc (gsl_interp_linear, freqs->
length);
341 gsl_spline_init(splineTemp, freqs->
data, d2phasenonGRdf2Tapered->
data, freqs->
length);
343 dphasenonGRdfTapered->
data[iRef] = 0.0;
344 for (
i = iRef;
i-- > iStart; )
345 dphasenonGRdfTapered->
data[
i] = dphasenonGRdfTapered->
data[
i+1] - gsl_spline_eval_integ(splineTemp, freqs->
data[
i], freqs->
data[
i+1], acc);
346 for (
i = iRef+1;
i < freqs->
length;
i++ )
347 dphasenonGRdfTapered->
data[
i] = dphasenonGRdfTapered->
data[
i-1] + gsl_spline_eval_integ(splineTemp, freqs->
data[
i-1], freqs->
data[
i], acc);
349 gsl_spline_init(splineTemp, freqs->
data, dphasenonGRdfTapered->
data, freqs->
length);
350 phasenonGRTapered->data[iRef] = 0.0;
351 for (
i = iRef;
i-- > iStart; )
352 phasenonGRTapered->data[
i] = phasenonGRTapered->data[
i+1] - gsl_spline_eval_integ(splineTemp, freqs->
data[
i], freqs->
data[
i+1], acc);
353 for (
i = iRef+1;
i < freqs->
length;
i++ )
354 phasenonGRTapered->data[
i] = phasenonGRTapered->data[
i-1] + gsl_spline_eval_integ(splineTemp, freqs->
data[
i-1], freqs->
data[
i], acc);
363 REAL8 PNPhaseRefDerivative = dphasenonGRdfTapered->
data[iPeak];
366 for (
i = iStartFinal;
i < freqs->
length;
i++ ) {
367 REAL8 phasing = phasenonGRTapered->data[
i] - PNPhaseRefDerivative * (freqs->
data[
i]-freqs->
data[iRef]) ;
368 htilde->
data->
data[
i] *= cexp(phasing * 1.j);
371 gsl_spline_free(splineTemp);
372 gsl_interp_accel_free(acc);
386 const REAL8 pfa7 = pfa.
v[7];
387 const REAL8 pfa6 = pfa.
v[6];
389 const REAL8 pfa5 = pfa.
v[5];
391 const REAL8 pfa4 = pfa.
v[4];
392 const REAL8 pfa3 = pfa.
v[3];
393 const REAL8 pfa2 = pfa.
v[2];
394 const REAL8 pfa1 = pfa.
v[1];
395 const REAL8 pfaN = pfa.
v[0];
399 const REAL8 v = cbrt(2*piM*f/
m);
400 const REAL8 logv = log(v);
401 const REAL8 v2 = v * v;
402 const REAL8 v3 = v * v2;
403 const REAL8 v4 = v * v3;
404 const REAL8 v5 = v * v4;
405 const REAL8 v6 = v * v5;
406 const REAL8 v7 = v * v6;
409 phasing += pfa7 * v7;
410 phasing += (pfa6 + pfl6 * logv) * v6;
411 phasing += (pfa5 + pfl5 * logv) * v5;
412 phasing += pfa4 * v4;
413 phasing += pfa3 * v3;
414 phasing += pfa2 * v2;
417 phasing += pfaMinus1 / v;
418 phasing += pfaMinus2 /v2;
439 const REAL8 pfa7 = pfa.
v[7];
440 const REAL8 pfa6 = pfa.
v[6];
444 const REAL8 pfa4 = pfa.
v[4];
445 const REAL8 pfa3 = pfa.
v[3];
446 const REAL8 pfa2 = pfa.
v[2];
447 const REAL8 pfa1 = pfa.
v[1];
448 const REAL8 pfaN = pfa.
v[0];
452 const REAL8 v = cbrt(2*piM*f/
m);
453 const REAL8 logv = log(v);
454 const REAL8 v2 = v * v;
455 const REAL8 v3 = v * v2;
456 const REAL8 v4 = v * v3;
457 const REAL8 v5 = v * v4;
462 phasing += 2. * pfa7 * v4;
463 phasing += (1. * pfa6 + 1. * pfl6 + 1. * pfl6 * logv) * v3;
464 phasing += 1. * pfl5 * v2;
465 phasing += -1. * pfa4 * v;
466 phasing += -2. * pfa3;
467 phasing += -3. * pfa2 / v;
468 phasing += -4. * pfa1 / v2;
469 phasing += -5. * pfaN / v3;
470 phasing += -6. * pfaMinus1 / v4;
471 phasing += -7. * pfaMinus2 /v5;
493 const REAL8 pfa7 = pfa.
v[7];
494 const REAL8 pfa6 = pfa.
v[6];
498 const REAL8 pfa4 = pfa.
v[4];
499 const REAL8 pfa3 = pfa.
v[3];
500 const REAL8 pfa2 = pfa.
v[2];
501 const REAL8 pfa1 = pfa.
v[1];
502 const REAL8 pfaN = pfa.
v[0];
506 const REAL8 v = cbrt(2*piM*f/
m);
507 const REAL8 logv = log(v);
508 const REAL8 v2 = v * v;
509 const REAL8 v3 = v * v2;
510 const REAL8 v4 = v * v3;
511 const REAL8 v5 = v * v4;
512 const REAL8 v6 = v * v5;
513 const REAL8 v7 = v * v6;
514 const REAL8 v8 = v * v7;
517 phasing += -2. * pfa7 * v;
518 phasing += (-2. * pfa6 - 1. * pfl6 - 2. * pfl6 * logv);
519 phasing += -3. * pfl5 / v;
520 phasing += 4. * pfa4 / v2 ;
521 phasing += 10. * pfa3 / v3;
522 phasing += 18. * pfa2 / v4;
523 phasing += 28. * pfa1 / v5;
524 phasing += 40. * pfaN / v6;
525 phasing += 54. * pfaMinus1 / v7;
526 phasing += 70. * pfaMinus2 /v8;
528 phasing *= piM*piM/9.;
int XLALDictContains(const LALDict *dict, const char *key)
double XLALSimNRTunedTidesMergerFrequency(const REAL8 mtot_MSUN, const REAL8 kappa2T, const REAL8 q)
compute the merger frequency of a BNS system.
double XLALSimNRTunedTidesComputeKappa2T(REAL8 m1_SI, REAL8 m2_SI, REAL8 lambda1, REAL8 lambda2)
convenient function to compute tidal coupling constant.
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 REAL8 Get22PeakAngFreq(REAL8 UNUSED eta, REAL8 a)
Combined spin chi defined in Eq.
int XLALSimInspiralPhaseCorrectionsPhasing(COMPLEX16FrequencySeries *htilde, const REAL8Sequence *freqs, const UINT4 m, const UINT4 iStart, const UINT4 iRef, const UINT4 iPeak, PNPhasingSeries pfa, const REAL8 mtot, const REAL8 eta, const REAL8 f_window_div_f_Peak, const REAL8 iStartFinal, const REAL8 NCyclesStep)
REAL8 PNPhase(REAL8 f, UINT4 m, PNPhasingSeries pfa, const REAL8 mtot)
REAL8 PNPhaseDerivative(REAL8 f, UINT4 m, PNPhasingSeries pfa, const REAL8 mtot)
REAL8 PNPhaseSecondDerivative(REAL8 f, UINT4 m, PNPhasingSeries pfa, const REAL8 mtot)
int XLALSimInspiralTestingGRCorrections(COMPLEX16FrequencySeries *htilde, const UINT4 l, const UINT4 m, const REAL8 m1_SI, const REAL8 m2_SI, const REAL8 chi1z, const REAL8 chi2z, const REAL8 f_low, const REAL8 f_ref, const REAL8 f_window_div_f_Peak, const REAL8 NCyclesStep, LALDict *LALpars)
void XLALSimInspiralPNCorrections(PNPhasingSeries *pfa, const REAL8 m1, const REAL8 m2, const REAL8 chi1L, const REAL8 chi2L, const REAL8 chi1sq, const REAL8 chi2sq, const REAL8 chi1dotchi2, const REAL8 qm_def1, const REAL8 qm_def2, LALDict *LALpars)
#define PN_PHASING_SERIES_MAX_ORDER
Structure for passing around PN phasing coefficients.
void XLALDestroyREAL8Sequence(REAL8Sequence *sequence)
REAL8Sequence * XLALCreateREAL8Sequence(size_t length)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
REAL8 vneg[PN_PHASING_SERIES_MAX_ORDER+1]
REAL8 vlogv[PN_PHASING_SERIES_MAX_ORDER+1]
REAL8 vlogvsq[PN_PHASING_SERIES_MAX_ORDER+1]
REAL8 v[PN_PHASING_SERIES_MAX_ORDER+1]