LALSimulation  5.4.0.1-fe68b98
LALSimIMRPhenomX_PNR_alpha.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2022 Cardiff University
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with with program; see the file COPYING. If not, write to the
16  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
17  * MA 02110-1301 USA
18  */
19 
20 #ifdef __cplusplus
21 extern "C"
22 {
23 #endif
24 
25  /**
26  * \author Eleanor Hamilton, Sebastian Khan, Jonathan E. Thompson
27  *
28  */
29 
30 #include <lal/LALStdlib.h>
31 #include <lal/LALConstants.h>
32 #include <lal/LALDatatypes.h>
33 #include <lal/XLALError.h>
34 
36 
37 #ifndef _OPENMP
38 #define omp ignore
39 #endif
40 
41 #ifndef PHENOMXHMDEBUG
42 #define DEBUG 0
43 #else
44 #define DEBUG 1
45 #endif
46 
47  /**
48  * This function evaluates Eq. 59 of arXiv:2107.08876.
49  */
51  REAL8 Mf, /**< geometric frequency */
52  const IMRPhenomX_PNR_alpha_parameters *alphaParams, /**< Alpha parameter struct */
53  IMRPhenomXWaveformStruct *pWF, /**< PhenomX Waveform struct */
54  IMRPhenomXPrecessionStruct *pPrec /**< PhenomX Precession struct */
55  )
56  {
57  /* Alpha transition frequencies */
58  REAL8 Mf_alpha_lower = alphaParams->Mf_alpha_lower;
59  REAL8 Mf_alpha_upper = alphaParams->Mf_alpha_upper;
60 
61  /* Continuity offset between intermediate and MR region */
62  REAL8 alpha_MR_offset = alphaParams->alpha_MR_offset;
63 
64  if (Mf <= Mf_alpha_lower)
65  {
66  /* Below low-frequency cutoff, use either NNLO or MSA alpha depending on precession flag */
67  return IMRPhenomX_PNR_GetPNAlphaAtFreq(Mf, pWF, pPrec);
68  }
69 
70  if (Mf >= Mf_alpha_upper)
71  {
72  /* above high-frequency cutoff, use MR expression for alpha shifted for continuity */
73  return IMRPhenomX_PNR_MR_alpha_expression(Mf, alphaParams) + alpha_MR_offset;
74  }
75 
76  /* evaluate interpolating function for alpha between Mf_alpha_lower and Mf_alpha_upper */
77  return IMRPhenomX_PNR_intermediate_alpha_expression(Mf, alphaParams);
78  }
79 
80  /**
81  * This function generates the blended PNR and PN expressions for alpha for the transition region of parameter space.
82  */
84  REAL8 Mf, /**< geometric frequency */
85  const IMRPhenomX_PNR_alpha_parameters *alphaParams, /**< Alpha parameter struct */
86  IMRPhenomXWaveformStruct *pWF, /**< PhenomX Waveform struct */
87  IMRPhenomXPrecessionStruct *pPrec /**< PhenomX Precession struct */
88  )
89  {
90  /* evaluate blending window */
91  double pnr_window = IMRPhenomX_PNR_AnglesWindow(pWF, pPrec);
92  double msa_window = 1 - pnr_window;
93 
94  /* Alpha transition frequencies */
95  REAL8 Mf_alpha_lower = alphaParams->Mf_alpha_lower;
96  REAL8 Mf_alpha_upper = alphaParams->Mf_alpha_upper;
97 
98  /* Continuity offset between intermediate and MR region */
99  REAL8 alpha_MR_offset = alphaParams->alpha_MR_offset;
100 
101  if (Mf <= Mf_alpha_lower)
102  {
103  /* Below low-frequency cutoff, use either NNLO or MSA alpha depending on precession flag */
104  return IMRPhenomX_PNR_GetPNAlphaAtFreq(Mf, pWF, pPrec);
105  }
106 
107  if (Mf >= Mf_alpha_upper)
108  {
109  /* above high-frequency cutoff, use MR expression for alpha shifted for continuity */
110  REAL8 alpha_PN = IMRPhenomX_PNR_GetPNAlphaAtFreq(Mf, pWF, pPrec);
111  REAL8 alpha_MR = IMRPhenomX_PNR_MR_alpha_expression(Mf, alphaParams) + alpha_MR_offset;
112  return pnr_window * alpha_MR + msa_window * alpha_PN;
113  }
114 
115  /* evaluate interpolating function for alpha between Mf_alpha_lower and Mf_alpha_upper */
116  REAL8 alpha_PN = IMRPhenomX_PNR_GetPNAlphaAtFreq(Mf, pWF, pPrec);
117  REAL8 alpha_IM = IMRPhenomX_PNR_intermediate_alpha_expression(Mf, alphaParams);
118  return pnr_window * alpha_IM + msa_window * alpha_PN;
119  }
120 
121 
122  /**
123  * Here we write a wrapper function to produce either MSA or NNLO
124  * alpha for use in IMRPhenomX_PNR_GeneratePNRAlphaAtMf. This function will
125  * toggle which to use based on IMRPhenomXPrecVersion.
126  */
128  REAL8 Mf, /**< geometric frequency */
129  IMRPhenomXWaveformStruct *pWF, /**< PhenomX waveform struct */
130  IMRPhenomXPrecessionStruct *pPrec /**< PhenomX precession struct */
131  )
132  {
133  /* Define PN expansion parameter v = (pi M f)^(1/3)*/
134  const double omega = LAL_PI * Mf;
135  const double omega_cbrt = cbrt(omega);
136 
137  REAL8 alpha;
138 
139  /* Toggle between NNLO and MSA alpha */
140  switch (pPrec->IMRPhenomXPrecVersion)
141  {
142  /* ~~~~~ Use NNLO PN Euler Angles - Appendix G of arXiv:2004.06503 and https://dcc.ligo.org/LIGO-T1500602 ~~~~~ */
143  case 101:
144  case 102:
145  case 103:
146  case 104:
147  {
148  const double omega_cbrt2 = omega_cbrt * omega_cbrt;
149  const double logomega = log(omega);
150 
151  alpha = IMRPhenomX_PN_Euler_alpha_NNLO(pPrec, omega, omega_cbrt2, omega_cbrt, logomega);
152 
153  break;
154  }
155  case 220:
156  case 221:
157  case 222:
158  case 223:
159  case 224:
160  {
161  vector vangles = {0., 0., 0.};
162 
163  /* ~~~~~ Euler Angles from Chatziioannou et al, PRD 95, 104004, (2017), arXiv:1703.03967 ~~~~~ */
164  vangles = IMRPhenomX_Return_phi_zeta_costhetaL_MSA(omega_cbrt, pWF, pPrec);
165 
166  alpha = vangles.x;
167 
168  break;
169  }
170  default:
171  {
172  XLAL_ERROR(XLAL_EINVAL, "Error: IMRPhenomXPrecessionVersion not recognized in IMRPhenomX_PNR_GetPNAlphaAtFreq.\n");
173  break;
174  }
175  }
176 
177  return alpha;
178  }
179 
180  /**
181  * This function evaluates the coefficients outlined in
182  * Sec 7A of arXiv:2107.08876 for alpha.
183  */
185  IMRPhenomX_PNR_alpha_parameters *alphaParams, /**< Alpha parameter struct */
186  IMRPhenomXWaveformStruct *pWF, /**< PhenomX waveform struct */
187  IMRPhenomXPrecessionStruct *pPrec /**< PhenomX precession struct */
188  )
189  {
190  /* safety first */
191  XLAL_CHECK(alphaParams != NULL, XLAL_EFAULT);
192  XLAL_CHECK(pWF != NULL, XLAL_EFAULT);
193  XLAL_CHECK(pPrec != NULL, XLAL_EFAULT);
194 
195  /* Grab the single-spin MR parameters */
196  REAL8 eta = pWF->eta;
197  REAL8 chi = pPrec->chi_singleSpin;
199 
200  /* Evaluate coefficients as described in Sec. 8D in arXiv:2107.08876 */
202  if (A2 > 0.0)
203  {
204  A2 = 0.0;
205  }
206  REAL8 A3 = fabs(IMRPhenomX_PNR_alpha_A3_coefficient(eta, chi, costheta));
207  if (A3 < 0.00001)
208  {
209  A3 = 0.00001;
210  }
211  REAL8 maxA2 = LAL_PI*LAL_PI*sqrt(A3);
212  if (A2 < -maxA2)
213  {
214  A2 = -maxA2;
215  }
216 
217  alphaParams->A1 = fabs(IMRPhenomX_PNR_alpha_A1_coefficient(eta, chi, costheta));
218  alphaParams->A2 = A2;
219  alphaParams->A3 = A3;
220  alphaParams->A4 = IMRPhenomX_PNR_alpha_A4_coefficient(eta, chi, costheta);
221 
222  return XLAL_SUCCESS;
223  }
224 
225  /**
226  * The following four functions are used to compute the C1 interpolation function
227  * used to connect the inspiral and MR expressions for alpha. They are evaluated at
228  * the two transition frequency values Mf1 = 2 A4 / 7 and Mf2 = A4 / 3.
229  * See Sec. 8A of arXiv:2107.08876.
230  *
231  * Specifically, the next four functions are Eq. 52 in arXiv:2107.08876.
232  */
234  REAL8 Mf1, /**< lower connection frequency in geometric units */
235  REAL8 Mf2, /**< upper connection frequency in geometric units */
236  REAL8 alpha1, /**< value of alpha at Mf1 */
237  REAL8 alpha2, /**< value of alpha at Mf2 */
238  REAL8 dalpha1, /**< derivative of alpha at Mf1 */
239  REAL8 dalpha2 /**< derivative of alpha at Mf2 */
240  )
241  {
242 
243  REAL8 D = (Mf2 - Mf1) * (Mf2 - Mf1) * (Mf2 - Mf1);
244  REAL8 N = 2.0 * (Mf1 * alpha1 - Mf2 * alpha2) - (Mf1 - Mf2) * ((Mf1 * dalpha1 + Mf2 * dalpha2) + (alpha1 + alpha2));
245 
246  return N / D;
247  }
248 
250  REAL8 Mf1, /**< lower connection frequency in geometric units */
251  REAL8 Mf2, /**< upper connection frequency in geometric units */
252  REAL8 alpha1, /**< value of alpha at Mf1 */
253  REAL8 alpha2, /**< value of alpha at Mf2 */
254  REAL8 dalpha1, /**< derivative of alpha at Mf1 */
255  REAL8 dalpha2 /**< derivative of alpha at Mf2 */
256  )
257  {
258 
259  REAL8 D = (Mf2 - Mf1) * (Mf2 - Mf1) * (Mf2 - Mf1);
260  REAL8 N = 3.0 * (Mf1 + Mf2) * (Mf2 * alpha2 - Mf1 * alpha1) + (Mf1 - Mf2) * ((Mf1 + 2.0 * Mf2) * (Mf1 * dalpha1 + alpha1) + (2.0 * Mf1 + Mf2) * (Mf2 * dalpha2 + alpha2));
261 
262  return N / D;
263  }
264 
266  REAL8 Mf1, /**< lower connection frequency in geometric units */
267  REAL8 Mf2, /**< upper connection frequency in geometric units */
268  REAL8 alpha1, /**< value of alpha at Mf1 */
269  REAL8 alpha2, /**< value of alpha at Mf2 */
270  REAL8 dalpha1, /**< derivative of alpha at Mf1 */
271  REAL8 dalpha2 /**< derivative of alpha at Mf2 */
272  )
273  {
274 
275  REAL8 D = (Mf2 - Mf1) * (Mf2 - Mf1) * (Mf2 - Mf1);
276  REAL8 N = 6.0 * Mf1 * Mf2 * (Mf1 * alpha1 - Mf2 * alpha2) - (Mf1 - Mf2) * (Mf2 * (2.0 * Mf1 + Mf2) * (Mf1 * dalpha1 + alpha1) + Mf1 * (Mf1 + 2.0 * Mf2) * (Mf2 * dalpha2 + alpha2));
277 
278  return N / D;
279  }
280 
282  REAL8 Mf1, /**< lower connection frequency in geometric units */
283  REAL8 Mf2, /**< upper connection frequency in geometric units */
284  REAL8 alpha1, /**< value of alpha at Mf1 */
285  REAL8 alpha2, /**< value of alpha at Mf2 */
286  REAL8 dalpha1, /**< derivative of alpha at Mf1 */
287  REAL8 dalpha2 /**< derivative of alpha at Mf2 */
288  )
289  {
290 
291  REAL8 D = (Mf2 - Mf1) * (Mf2 - Mf1) * (Mf2 - Mf1);
292  REAL8 N = Mf1 * Mf2 * Mf2 * (Mf2 - 3.0 * Mf1) * alpha1 - Mf1 * Mf1 * Mf2 * (Mf1 - 3.0 * Mf2) * alpha2 + Mf1 * Mf2 * (Mf1 - Mf2) * (Mf2 * (Mf1 * dalpha1 + alpha1) + Mf1 * (Mf2 * dalpha2 + alpha2));
293 
294  return N / D;
295  }
296 
297  /**
298  * This function evaluates Eq. 51 of arXiv:2107.08876
299  */
301  REAL8 Mf, /**< frequency in geometric units */
302  const IMRPhenomX_PNR_alpha_parameters *alphaParams /**< Alpha parameter struct */
303  )
304  {
305  /* check we have data */
306  XLAL_CHECK(alphaParams != NULL, XLAL_EFAULT);
307 
308  /* get interpolation coefficients */
309  REAL8 a0 = alphaParams->alpha_interp_0;
310  REAL8 a1 = alphaParams->alpha_interp_1;
311  REAL8 a2 = alphaParams->alpha_interp_2;
312  REAL8 a3 = alphaParams->alpha_interp_3;
313 
314  /* evaluate */
315  return a0 * Mf * Mf + a1 * Mf + a2 + a3 / Mf;
316  }
317 
318  /**
319  * This function evaluates Eq. 48 of arXiv:2107.08876
320  */
322  REAL8 Mf, /**< frequency in geometric units */
323  const IMRPhenomX_PNR_alpha_parameters *alphaParams /**< Alpha parameter struct */
324  )
325  {
326  /* check we have data */
327  XLAL_CHECK(alphaParams != NULL, XLAL_EFAULT);
328 
329  /* get MR coefficients */
330  REAL8 A1 = alphaParams->A1;
331  REAL8 A2 = alphaParams->A2;
332  REAL8 A3 = alphaParams->A3;
333  REAL8 A4 = alphaParams->A4;
334 
335  /* evaluate */
336  return -(A1 / Mf + (A2 * sqrt(A3)) / (A3 + (Mf - A4) * (Mf - A4)));
337  }
338 
339  /**
340  * This function evaluates the connection frequencies Mf1 and Mf2 detailed in Sec. 8A
341  * of arXiv:2107.08876. It then computes the values of alpha and its derivatives
342  * at these frequencies to compute the coefficients used for the intermediate
343  * interpolation function Eq. 51.
344  *
345  * The derivatives are computed using simple centered finite differences.
346  */
348  IMRPhenomX_PNR_alpha_parameters *alphaParams, /**< Alpha parameter struct */
349  IMRPhenomXWaveformStruct *pWF, /**< PhenomX waveform struct */
350  IMRPhenomXPrecessionStruct *pPrec /**< PhenomX precession struct */
351  )
352  {
353  /* safety first */
354  XLAL_CHECK(alphaParams != NULL, XLAL_EFAULT);
355  XLAL_CHECK(pWF != NULL, XLAL_EFAULT);
356  XLAL_CHECK(pPrec != NULL, XLAL_EFAULT);
357 
358  /* define frequency spacing over which to calculate derivatives */
359  /* here set to be 0.0005Mf */
360  REAL8 dMf = 0.0005;
361 
362  /* define connection frequencies for alpha */
363  REAL8 Mf_alpha_upper = alphaParams->A4 / 3.0;
364  REAL8 Mf_alpha_lower = (3.0 / 3.5) * Mf_alpha_upper;
365 
366  /* catch cases where Mf_alpha_lower < 2 Hz and just use MSA alpha */
367  if (Mf_alpha_upper < XLALSimIMRPhenomXUtilsHztoMf(2.0, pWF->Mtot))
368  {
369  Mf_alpha_lower = 100.0;
370  Mf_alpha_upper = 100.0;
371  }
372 
373  /* evaluate expressions for alpha at and around the connection frequencies */
374  REAL8 a1 = IMRPhenomX_PNR_GetPNAlphaAtFreq(Mf_alpha_lower - dMf, pWF, pPrec);
375  REAL8 alpha_lower = IMRPhenomX_PNR_GetPNAlphaAtFreq(Mf_alpha_lower, pWF, pPrec);
376  REAL8 a3 = IMRPhenomX_PNR_GetPNAlphaAtFreq(Mf_alpha_lower + dMf, pWF, pPrec);
377 
378  REAL8 a4 = IMRPhenomX_PNR_MR_alpha_expression(Mf_alpha_upper - dMf, alphaParams);
379  REAL8 alpha_upper = IMRPhenomX_PNR_GetPNAlphaAtFreq(Mf_alpha_upper, pWF, pPrec);
380  REAL8 a6 = IMRPhenomX_PNR_MR_alpha_expression(Mf_alpha_upper + dMf, alphaParams);
381 
382  /* calculate derivative of alpha at connection frequencies using finite difference central difference method */
383  REAL8 derivative_alpha_lower = (a3 - a1) / (2.0 * dMf);
384  REAL8 derivative_alpha_upper = (a6 - a4) / (2.0 * dMf);
385 
386  /* evaluate the interpolation coefficients */
387  REAL8 alpha_interp_0 = IMRPhenomX_PNR_alpha_interpolation_0(Mf_alpha_lower, Mf_alpha_upper, alpha_lower, alpha_upper, derivative_alpha_lower, derivative_alpha_upper);
388  REAL8 alpha_interp_1 = IMRPhenomX_PNR_alpha_interpolation_1(Mf_alpha_lower, Mf_alpha_upper, alpha_lower, alpha_upper, derivative_alpha_lower, derivative_alpha_upper);
389  REAL8 alpha_interp_2 = IMRPhenomX_PNR_alpha_interpolation_2(Mf_alpha_lower, Mf_alpha_upper, alpha_lower, alpha_upper, derivative_alpha_lower, derivative_alpha_upper);
390  REAL8 alpha_interp_3 = IMRPhenomX_PNR_alpha_interpolation_3(Mf_alpha_lower, Mf_alpha_upper, alpha_lower, alpha_upper, derivative_alpha_lower, derivative_alpha_upper);
391 
392  alpha_interp_0 = isnan(alpha_interp_0) ? 0.0 : alpha_interp_0;
393  alpha_interp_1 = isnan(alpha_interp_1) ? 0.0 : alpha_interp_1;
394  alpha_interp_2 = isnan(alpha_interp_2) ? 0.0 : alpha_interp_2;
395  alpha_interp_3 = isnan(alpha_interp_3) ? 0.0 : alpha_interp_3;
396 
397  /* calculate the offset required for the MR contributions to alpha to continuously
398  * connect to the inspiral. */
399  REAL8 MR_alpha_at_Mf_upper = IMRPhenomX_PNR_MR_alpha_expression(Mf_alpha_upper, alphaParams);
400  REAL8 alpha_MR_offset = alpha_upper - MR_alpha_at_Mf_upper;
401 
402  /* save alpha values into the struct */
403  alphaParams->Mf_alpha_lower = Mf_alpha_lower;
404  alphaParams->Mf_alpha_upper = Mf_alpha_upper;
405  alphaParams->alpha_lower = alpha_lower;
406  alphaParams->alpha_upper = alpha_upper;
407  alphaParams->derivative_alpha_lower = derivative_alpha_lower;
408  alphaParams->derivative_alpha_upper = derivative_alpha_upper;
409  alphaParams->alpha_interp_0 = alpha_interp_0;
410  alphaParams->alpha_interp_1 = alpha_interp_1;
411  alphaParams->alpha_interp_2 = alpha_interp_2;
412  alphaParams->alpha_interp_3 = alpha_interp_3;
413  alphaParams->alpha_MR_offset = alpha_MR_offset;
414 
415  return XLAL_SUCCESS;
416  }
417 
418 #ifdef __cplusplus
419 }
420 #endif
REAL8 IMRPhenomX_PNR_MR_alpha_expression(REAL8 Mf, const IMRPhenomX_PNR_alpha_parameters *alphaParams)
This function evaluates Eq.
int IMRPhenomX_PNR_precompute_alpha_coefficients(IMRPhenomX_PNR_alpha_parameters *alphaParams, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
This function evaluates the coefficients outlined in Sec 7A of arXiv:2107.08876 for alpha.
REAL8 IMRPhenomX_PNR_alpha_interpolation_0(REAL8 Mf1, REAL8 Mf2, REAL8 alpha1, REAL8 alpha2, REAL8 dalpha1, REAL8 dalpha2)
The following four functions are used to compute the C1 interpolation function used to connect the in...
REAL8 IMRPhenomX_PNR_intermediate_alpha_expression(REAL8 Mf, const IMRPhenomX_PNR_alpha_parameters *alphaParams)
This function evaluates Eq.
REAL8 IMRPhenomX_PNR_GetPNAlphaAtFreq(REAL8 Mf, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
Here we write a wrapper function to produce either MSA or NNLO alpha for use in IMRPhenomX_PNR_Genera...
REAL8 IMRPhenomX_PNR_GeneratePNRAlphaAtMf(REAL8 Mf, const IMRPhenomX_PNR_alpha_parameters *alphaParams, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
This function evaluates Eq.
REAL8 IMRPhenomX_PNR_alpha_interpolation_1(REAL8 Mf1, REAL8 Mf2, REAL8 alpha1, REAL8 alpha2, REAL8 dalpha1, REAL8 dalpha2)
REAL8 IMRPhenomX_PNR_alpha_interpolation_3(REAL8 Mf1, REAL8 Mf2, REAL8 alpha1, REAL8 alpha2, REAL8 dalpha1, REAL8 dalpha2)
int IMRPhenomX_PNR_alpha_connection_parameters(IMRPhenomX_PNR_alpha_parameters *alphaParams, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
This function evaluates the connection frequencies Mf1 and Mf2 detailed in Sec.
REAL8 IMRPhenomX_PNR_GenerateMergedPNRAlphaAtMf(REAL8 Mf, const IMRPhenomX_PNR_alpha_parameters *alphaParams, IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
This function generates the blended PNR and PN expressions for alpha for the transition region of par...
REAL8 IMRPhenomX_PNR_alpha_interpolation_2(REAL8 Mf1, REAL8 Mf2, REAL8 alpha1, REAL8 alpha2, REAL8 dalpha1, REAL8 dalpha2)
REAL8 IMRPhenomX_PNR_alpha_A1_coefficient(REAL8 eta, REAL8 chi, REAL8 costheta)
expressions for each of the coefficients that appear in the merger-ringdown expression for alpha
REAL8 IMRPhenomX_PNR_alpha_A2_coefficient(REAL8 eta, REAL8 chi, REAL8 costheta)
REAL8 IMRPhenomX_PNR_alpha_A3_coefficient(REAL8 eta, REAL8 chi, REAL8 costheta)
REAL8 IMRPhenomX_PNR_alpha_A4_coefficient(REAL8 eta, REAL8 chi, REAL8 costheta)
REAL8 IMRPhenomX_PNR_AnglesWindow(IMRPhenomXWaveformStruct *pWF, IMRPhenomXPrecessionStruct *pPrec)
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.
REAL8 XLALSimIMRPhenomXUtilsHztoMf(REAL8 fHz, REAL8 Mtot_Msun)
Convert from frequency in Hz to geometric frequency.
const double a4
const double a2
const double costheta
#define LAL_PI
double REAL8
#define XLAL_ERROR(...)
#define XLAL_CHECK(assertion,...)
XLAL_SUCCESS
XLAL_EFAULT
XLAL_EINVAL
int N
double alpha
Definition: sgwb.c:106
REAL8 derivative_alpha_upper
derivative at connection frequency
REAL8 derivative_alpha_lower
derivative at connection frequency
REAL8 alpha_interp_2
intermediate coefficient
REAL8 alpha_lower
alpha at connection frequency
REAL8 alpha_MR_offset
continuity offset between intermediate and MR
REAL8 alpha_interp_0
intermediate coefficient
REAL8 Mf_alpha_lower
connection frequency
REAL8 alpha_interp_3
intermediate coefficient
REAL8 Mf_alpha_upper
connection frequency
REAL8 alpha_upper
alpha at connection frequency
REAL8 alpha_interp_1
intermediate coefficient
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.