26 #include <lal/LALStdlib.h>
27 #include <lal/LALConstants.h>
29 #include <lal/Units.h>
30 #include <lal/LALSimIMR.h>
36 #define UNUSED __attribute__ ((unused))
51 taper = 1. / (exp((t2 - t1)/(t - t1) + (t2 - t1)/(t - t2)) + 1.);
60 if ((*m1 == *m2) && (*lambda1 != *lambda2))
61 XLALPrintWarning(
"m1 == m2 (%g), but lambda1 != lambda2 (%g, %g).\n", *m1, *lambda1, *lambda2);
63 REAL8 lambda1_tmp, lambda2_tmp, m1_tmp, m2_tmp;
65 lambda1_tmp = *lambda1;
66 lambda2_tmp = *lambda2;
70 lambda1_tmp = *lambda2;
71 lambda2_tmp = *lambda1;
77 *lambda1 = lambda1_tmp;
78 *lambda2 = lambda2_tmp;
82 to enfore that m1 should be the larger mass.\
83 After trying to enforce this m1 = %f and m2 = %f\n", *m1, *m2);
105 const REAL8 mtot = m1 + m2;
109 const REAL8 Xa = m1 / mtot;
110 const REAL8 Xb = m2 / mtot;
117 const REAL8 term1 = ( 1.0 + 12.0*Xb/Xa ) * pow(Xa, 5.0) * lambda1;
118 const REAL8 term2 = ( 1.0 + 12.0*Xa/Xb ) * pow(Xb, 5.0) * lambda2;
119 const REAL8 kappa2T = (3.0/13.0) * ( term1 + term2 );
129 const REAL8 mtot_MSUN,
135 XLALPrintError(
"XLAL Error - %s: q (%f) should be greater or equal to unity!\n",
140 const REAL8 a_0 = 0.3586;
141 const REAL8 n_1 = 3.35411203e-2;
142 const REAL8 n_2 = 4.31460284e-5;
143 const REAL8 d_1 = 7.54224145e-2;
144 const REAL8 d_2 = 2.23626859e-4;
146 const REAL8 kappa2T2 = kappa2T * kappa2T;
148 const REAL8 num = 1.0 + n_1*kappa2T + n_2*kappa2T2;
149 const REAL8 den = 1.0 + d_1*kappa2T + d_2*kappa2T2;
150 const REAL8 Q_0 = a_0 / sqrt(
q);
153 const REAL8 Momega_merger = Q_0 * (num / den);
182 REAL8 PN_x = pow(M_omega, 2.0/3.0);
183 REAL8 PN_x_2 = PN_x * PN_x;
184 REAL8 PN_x_3over2 = pow(PN_x, 3.0/2.0);
185 REAL8 PN_x_5over2 = pow(PN_x, 5.0/2.0);
188 const REAL8 c_Newt = 2.4375;
190 const REAL8 n_1 = -17.428;
191 const REAL8 n_3over2 = 31.867;
192 const REAL8 n_2 = -26.414;
193 const REAL8 n_5over2 = 62.362;
195 const REAL8 d_1 = n_1 - 2.496;
196 const REAL8 d_3over2 = 36.089;
198 REAL8 tidal_phase = - kappa2T * c_Newt / (Xa * Xb) * PN_x_5over2;
200 REAL8 num = 1.0 + (n_1 * PN_x) + (n_3over2 * PN_x_3over2) + (n_2 * PN_x_2) + (n_5over2 * PN_x_5over2) ;
201 REAL8 den = 1.0 + (d_1 * PN_x) + (d_3over2 * PN_x_3over2) ;
203 REAL8 ratio = num / den;
205 tidal_phase *= ratio;
223 prefac = 9.0*kappa2T;
228 const REAL8 n1 = 4.157407407407407;
229 const REAL8 n289 = 2519.111111111111;
230 const REAL8 d = 13477.8073677;
232 poly = (1.0 + n1*
x + n289*pow(
x, 2.89))/(1+
d*pow(
x,4.));
233 ampT = - prefac*pow(
x,3.25)*poly;
243 NRTidalv2_coeffs[0] = 2.4375;
244 NRTidalv2_coeffs[1] = -12.615214237993088;
245 NRTidalv2_coeffs[2] = 19.0537346970349;
246 NRTidalv2_coeffs[3] = -21.166863146081035;
247 NRTidalv2_coeffs[4] = 90.55082156324926;
248 NRTidalv2_coeffs[5] = -60.25357801943598;
249 NRTidalv2_coeffs[6] = -15.111207827736678;
250 NRTidalv2_coeffs[7] = 22.195327350624694;
251 NRTidalv2_coeffs[8] = 8.064109635305156;
270 REAL8 PN_x = pow(M_omega, 2.0/3.0);
271 REAL8 PN_x_2 = PN_x * PN_x;
272 REAL8 PN_x_3 = PN_x * PN_x_2;
273 REAL8 PN_x_3over2 = pow(PN_x, 3.0/2.0);
274 REAL8 PN_x_5over2 = pow(PN_x, 5.0/2.0);
276 REAL8 NRTidalv2_coeffs[9];
282 const REAL8 c_Newt = NRTidalv2_coeffs[0];
283 const REAL8 n_1 = NRTidalv2_coeffs[1];
284 const REAL8 n_3over2 = NRTidalv2_coeffs[2];
285 const REAL8 n_2 = NRTidalv2_coeffs[3];
286 const REAL8 n_5over2 = NRTidalv2_coeffs[4];
287 const REAL8 n_3 = NRTidalv2_coeffs[5];
288 const REAL8 d_1 = NRTidalv2_coeffs[6];
289 const REAL8 d_3over2 = NRTidalv2_coeffs[7];
290 const REAL8 d_2 = NRTidalv2_coeffs[8];
291 REAL8 tidal_phase = - kappa2T * c_Newt / (Xa * Xb) * PN_x_5over2;
292 REAL8 num = 1.0 + (n_1 * PN_x) + (n_3over2 * PN_x_3over2) + (n_2 * PN_x_2) + (n_5over2 * PN_x_5over2) + (n_3 * PN_x_3);
293 REAL8 den = 1.0 + (d_1 * PN_x) + (d_3over2 * PN_x_3over2) + (d_2 * PN_x_2) ;
294 REAL8 ratio = num / den;
295 tidal_phase *= ratio;
319 if( lambda1 < 0 || lambda2 < 0 )
320 XLAL_ERROR(
XLAL_EFUNC,
"lambda1 = %f, lambda2 = %f. Both should be greater than zero for NRTidal models", lambda1, lambda2);
323 const REAL8 mtot = m1 + m2;
329 if ((*fHz).data[(*fHz).length - 1] > 1.)
337 for(
UINT4 i = 0;
i < (*fHz).length;
i++)
383 if( lambda1 < 0 || lambda2 < 0 )
384 XLAL_ERROR(
XLAL_EFUNC,
"lambda1 = %f, lambda2 = %f. Both should be greater than zero for NRTidal models", lambda1, lambda2);
388 const REAL8 mtot = m1 + m2;
392 const REAL8 Xa = m1 / mtot;
393 const REAL8 Xb = m2 / mtot;
401 const REAL8 fHz_end_taper = 1.2*fHz_mrg;
403 for(
UINT4 i = 0;
i < (*fHz).length;
i++){
405 (*planck_taper).data[
i] = 1.0 -
PlanckTaper((*fHz).data[
i], fHz_mrg, fHz_end_taper);
409 for(
UINT4 i = 0;
i < (*fHz).length;
i++) {
412 (*planck_taper).data[
i] = 1.0 -
PlanckTaper((*fHz).data[
i], fHz_mrg, fHz_end_taper);
416 for(
UINT4 i = 0;
i < (*fHz).length;
i++) {
418 (*planck_taper).data[
i] = 1.0;
422 for(
UINT4 i = 0;
i < (*fHz).length;
i++) {
424 (*planck_taper).data[
i] = 1.0 -
PlanckTaper((*fHz).data[
i], fHz_mrg, fHz_end_taper);
427 else if (NRTidal_version ==
NoNRT_V)
430 XLAL_ERROR(
XLAL_EINVAL,
"Unknown version of NRTidal being used! At present, NRTidal_V, NRTidalv2_V, NRTidalv2NSBH_V, NRTidalv2NoAmpCorr_V and NoNRT_V are the only known ones!" );
456 REAL8 chi1_sq = 0., chi2_sq = 0.;
457 REAL8 X_Asq = 0., X_Bsq = 0.;
458 REAL8 octparam1 = 0, octparam2 = 0.;
470 *SS_3p5PN = - 400.*
LAL_PI*(quadparam1-1.)*chi1_sq*X_Asq - 400.*
LAL_PI*(quadparam2-1.)*chi2_sq*X_Bsq;
471 *SSS_3p5PN = 10.*((X_Asq+308./3.*X_A)*chi1+(X_Bsq-89./3.*X_B)*chi2)*(quadparam1-1.)*X_Asq*chi1_sq
472 + 10.*((X_Bsq+308./3.*X_B)*chi2+(X_Asq-89./3.*X_A)*chi1)*(quadparam2-1.)*X_Bsq*chi2_sq
473 - 440.*octparam1*X_A*X_Asq*chi1_sq*chi1 - 440.*octparam2*X_B*X_Bsq*chi2_sq*chi2;
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 ...
void XLALSimInspiralGetHOSpinTerms(REAL8 *SS_3p5PN, REAL8 *SSS_3p5PN, REAL8 X_A, REAL8 X_B, REAL8 chi1, REAL8 chi2, REAL8 quadparam1, REAL8 quadparam2)
Function to add 3.5PN spin-squared and 3.5PN spin-cubed terms.
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.
static REAL8 SimNRTunedTidesFDTidalAmplitude(const REAL8 fHz, const REAL8 mtot, const REAL8 kappa2T)
Tidal amplitude corrections; only available for NRTidalv2; Eq 24 of arxiv:1905.06011.
static REAL8 PlanckTaper(const REAL8 t, const REAL8 t1, const REAL8 t2)
Planck taper window.
static double SimNRTunedTidesFDTidalPhase_v2(const REAL8 fHz, const REAL8 Xa, const REAL8 Xb, const REAL8 mtot, const REAL8 kappa2T)
NRTunedTidesFDTidalPhase is Eq 22 of https://arxiv.org/abs/1905.06011 and is a function of x = angula...
static int EnforcePrimaryMassIsm1(REAL8 *m1, REAL8 *m2, REAL8 *lambda1, REAL8 *lambda2)
function to swap masses and lambda to enforce m1 >= m2
int XLALSimNRTunedTidesSetFDTidalPhase_v2_Coeffs(REAL8 *NRTidalv2_coeffs)
Set the NRTidalv2 phase coefficients in an array for use here and in the IMRPhenomX*_NRTidalv2 implem...
double XLALSimNRTunedTidesMergerFrequency(const REAL8 mtot_MSUN, const REAL8 kappa2T, const REAL8 q)
compute the merger frequency of a BNS system.
static double SimNRTunedTidesFDTidalPhase(const REAL8 fHz, const REAL8 Xa, const REAL8 Xb, const REAL8 mtot, const REAL8 kappa2T)
Internal function only.
int XLALSimNRTunedTidesFDTidalAmplitudeFrequencySeries(const REAL8Sequence *amp_tidal, const REAL8Sequence *fHz, REAL8 m1, REAL8 m2, REAL8 lambda1, REAL8 lambda2)
Function to call amplitude tidal series only; done for convenience to use for PhenomD_NRTidalv2 and S...
double XLALSimNRTunedTidesComputeKappa2T(REAL8 m1_SI, REAL8 m2_SI, REAL8 lambda1, REAL8 lambda2)
convenient function to compute tidal coupling constant.
REAL8 XLALSimUniversalRelationSpinInducedOctupoleVSSpinInducedQuadrupole(REAL8 qm_def)
@ NRTidalv2NoAmpCorr_V
version NRTidalv2, without amplitude corrections
@ NRTidal_V
version NRTidal: based on https://arxiv.org/pdf/1706.02969.pdf
@ NoNRT_V
special case for PhenomPv2 BBH baseline
@ NRTidalv2NSBH_V
version NRTidalv2: https://arxiv.org/abs/1905.06011 with amplitude corrections for NSBH (used for SEO...
@ NRTidalv2_V
version NRTidalv2: https://arxiv.org/abs/1905.06011
#define XLAL_CHECK(assertion,...)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
int int XLALPrintWarning(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1