20 #include <lal/LALSimIMR.h>
21 #include <lal/SphericalHarmonics.h>
23 #include <lal/Units.h>
37 static const double cShift[7] = {0.0,
56 if (extraParams == NULL)
59 if (ModeArray == NULL)
96 for (
INT4 ell = 2; ell <= 8; ell++)
98 for (
INT4 mm = -ell; mm < ell + 1; mm++)
100 if (ell == 2 && mm == 2)
104 else if (ell == 2 && mm == 1)
108 else if (ell == 3 && mm == 3)
112 else if (ell == 3 && mm == 2)
116 else if (ell == 4 && mm == 4)
120 else if (ell == 4 && mm == 3)
127 XLAL_ERROR(
XLAL_EFUNC,
"(%i,%i) mode in ModeArray but model does not include this!\n", ell, mm);
144 p->sqrt = sqrt(number);
145 p->sixth = cbrt(
p->sqrt);
146 p->m_sixth = 1.0 /
p->sixth;
147 p->third =
p->sixth *
p->sixth;
148 p->two_thirds =
p->third *
p->third;
149 p->four_thirds = number *
p->third;
150 p->five_thirds = number *
p->two_thirds;
151 p->two = number * number;
152 p->seven_thirds =
p->third *
p->two;
153 p->eight_thirds =
p->two_thirds *
p->two;
154 p->m_seven_sixths =
p->m_sixth / number;
155 p->m_five_sixths =
p->m_seven_sixths *
p->third;
156 p->m_sqrt = 1. /
p->sqrt;
167 double sixth = pow(number, 1.0 / 6.0);
168 p->third = sixth * sixth;
169 p->two_thirds =
p->third *
p->third;
170 p->four_thirds = number *
p->third;
171 p->five_thirds =
p->four_thirds *
p->third;
172 p->two = number * number;
173 p->seven_thirds =
p->third *
p->two;
174 p->eight_thirds =
p->two_thirds *
p->two;
175 p->inv = 1. / number;
176 double m_sixth = 1.0 / sixth;
177 p->m_seven_sixths =
p->inv * m_sixth;
178 p->m_third = m_sixth * m_sixth;
179 p->m_two_thirds =
p->m_third *
p->m_third;
180 p->m_five_thirds =
p->inv *
p->m_two_thirds;
200 const REAL8 Mf_RD_tmp = inv2Pi * creal(ZZ);
201 *fringdown = Mf_RD_tmp / finalmass;
203 const REAL8 f_DAMP_tmp = inv2Pi * cimag(ZZ);
204 *
fdamp = f_DAMP_tmp / finalmass;
218 UINT4 freq_is_uniform = 0;
219 if ((freqs->
length == 2) && (deltaF > 0.))
223 else if ((freqs->
length != 2) && (deltaF <= 0.))
228 return freq_is_uniform;
254 if (
p->freq_is_uniform == 1)
256 p->f_min = freqs->
data[0];
257 p->f_max = freqs->
data[1];
271 p->ind_min = (size_t)ceil(
p->f_min /
p->deltaF);
272 p->ind_max = (size_t)ceil(
p->f_max /
p->deltaF);
273 XLAL_CHECK((
p->ind_max <=
p->npts) && (
p->ind_min <=
p->ind_max),
XLAL_EDOM,
"minimum freq index %zu and maximum freq index %zu do not fulfill 0<=ind_min<=ind_max<=npts=%zu.",
p->ind_min,
p->ind_max,
p->npts);
275 else if (
p->freq_is_uniform == 0)
283 "custom frequencies must be increasing.");
287 p->f_min = freqs->
data[0];
292 p->ind_max =
p->npts;
297 compatible.\nSpecify a f_min and f_max by using a REAL8Sequence of length = 2 \
298 along with a deltaF > 0.\
299 \nIf you want to supply an arbitrary list of frequencies to evaluate the with \
300 then supply those frequencies using a REAL8Sequence and also set deltaF <= 0.");
340 p->Mtot =
p->m1 +
p->m2;
341 p->eta =
p->m1 *
p->m2 / (
p->Mtot *
p->Mtot);
354 if (
p->eta > 0.25 ||
p->eta < 0.0)
357 XLAL_PRINT_WARNING(
"Warning: The model is not calibrated for mass-ratios above 20\n");
372 "PhenomInternal_AlignedSpinEnforcePrimaryIsm1 failed");
389 "init_IMRPhenomHMGet_FrequencyBounds_storage failed");
396 p->npts = pHMFS.
npts;
405 if (
p->finspin > 1.0)
412 &
p->PhenomHMfring[2][2],
413 &
p->PhenomHMfdamp[2][2],
415 p->finmass,
p->finspin);
419 &
p->PhenomHMfring[2][1],
420 &
p->PhenomHMfdamp[2][1],
422 p->finmass,
p->finspin);
426 &
p->PhenomHMfring[3][3],
427 &
p->PhenomHMfdamp[3][3],
429 p->finmass,
p->finspin);
433 &
p->PhenomHMfring[3][2],
434 &
p->PhenomHMfdamp[3][2],
436 p->finmass,
p->finspin);
440 &
p->PhenomHMfring[4][4],
441 &
p->PhenomHMfdamp[4][4],
443 p->finmass,
p->finspin);
447 &
p->PhenomHMfring[4][3],
448 &
p->PhenomHMfdamp[4][3],
450 p->finmass,
p->finspin);
452 p->Mf_RD_22 =
p->PhenomHMfring[2][2];
453 p->Mf_DM_22 =
p->PhenomHMfdamp[2][2];
459 p->Rholm[ell][mm] =
p->Mf_RD_22 /
p->PhenomHMfring[ell][mm];
460 p->Taulm[ell][mm] =
p->PhenomHMfdamp[ell][mm] /
p->Mf_DM_22;
464 p->Rholm[ell][mm] =
p->Mf_RD_22 /
p->PhenomHMfring[ell][mm];
465 p->Taulm[ell][mm] =
p->PhenomHMfdamp[ell][mm] /
p->Mf_DM_22;
469 p->Rholm[ell][mm] =
p->Mf_RD_22 /
p->PhenomHMfring[ell][mm];
470 p->Taulm[ell][mm] =
p->PhenomHMfdamp[ell][mm] /
p->Mf_DM_22;
474 p->Rholm[ell][mm] =
p->Mf_RD_22 /
p->PhenomHMfring[ell][mm];
475 p->Taulm[ell][mm] =
p->PhenomHMfdamp[ell][mm] /
p->Mf_DM_22;
479 p->Rholm[ell][mm] =
p->Mf_RD_22 /
p->PhenomHMfring[ell][mm];
480 p->Taulm[ell][mm] =
p->PhenomHMfdamp[ell][mm] /
p->Mf_DM_22;
484 p->Rholm[ell][mm] =
p->Mf_RD_22 /
p->PhenomHMfring[ell][mm];
485 p->Taulm[ell][mm] =
p->PhenomHMfdamp[ell][mm] /
p->Mf_DM_22;
506 ans = Mf - Mf_RD_lm + Mf_RD_22;
524 return 2.0 * Mf / mm;
546 *Am = (Trd - Ti) / (fr - fi);
549 *Bm = Ti - fi * (*Am);
638 REAL8 Mf_1_lm = Mf_1_22 / Rholm;
656 Br = -Mf_RD_lm + Mf_RD_22;
665 int ret =
IMRPhenomHMMapParams(
a, b, flm, *fi, *fr, Ai, Bi, Am, Bm, Ar, Br);
668 XLALPrintError(
"XLAL Error - IMRPhenomHMMapParams failed in IMRPhenomHMFreqDomainMapParams (1)\n");
699 XLALPrintError(
"XLAL Error - IMRPhenomHMFreqDomainMapParams failed in IMRPhenomHMFreqDomainMap\n");
702 REAL8 Mf22 =
a * Mflm + b;
711 UNUSED LALDict *extraParams
724 const INT4 AmpFlag = 0;
727 const REAL8 Mfshift = 0.0001;
732 XLALPrintError(
"XLAL Error - IMRPhenomHMFreqDomainMapParams failed in IMRPhenomHMFreqDomainMapParams - inspiral\n");
741 XLALPrintError(
"XLAL Error - IMRPhenomHMFreqDomainMapParams failed in IMRPhenomHMFreqDomainMapParams - intermediate\n");
750 XLALPrintError(
"XLAL Error - IMRPhenomHMFreqDomainMapParams failed in IMRPhenomHMFreqDomainMapParams - merger-ringdown\n");
760 double Rholm = pHM->
Rholm[ell][mm];
761 double Taulm = pHM->
Taulm[ell][mm];
779 XLALPrintError(
"XLAL Error - IMRPhenomDSetupAmpAndPhaseCoefficients failed\n");
783 REAL8 PhDBMf = am * fi + bm;
786 REAL8 PhDCMf = ar * fr + br;
789 REAL8 PhDBAMf = ai * fi + bi;
811 REAL8 M_INPUT = M1 + M2;
817 REAL8 Xs = 0.5 * (X1z + X2z);
818 REAL8 Xa = 0.5 * (X1z - X2z);
827 if (
l == 2 &&
m == 2)
833 else if (
l == 2 &&
m == 1)
840 Hlm = (sqrt(2.0) / 3.0) * \
843 v3 *
delta * ((335.0 / 672.0) + (eta * 117.0 / 56.0)
848 Xa * (3427.0 / 1344 - eta * 2101.0 / 336) + \
849 delta * Xs * (3427.0 / 1344 - eta * 965 / 336) + \
850 delta * (-I * 0.5 -
LAL_PI - 2 * I * 0.69314718056) \
854 else if (
l == 3 &&
m == 3)
858 Hlm = 0.75 * sqrt(5.0 / 7.0) * (v *
delta);
860 else if (
l == 3 &&
m == 2)
864 Hlm = (1.0 / 3.0) * sqrt(5.0 / 7.0) * (v2 * (1.0 - 3.0 * eta));
866 else if (
l == 4 &&
m == 4)
870 Hlm = (4.0 / 9.0) * sqrt(10.0 / 7.0) * v2 * (1.0 - 3.0 * eta);
872 else if (
l == 4 &&
m == 3)
876 Hlm = 0.75 * sqrt(3.0 / 35.0) * v3 *
delta * (1.0 - 2.0 * eta);
880 XLALPrintError(
"XLAL Error - requested ell = %i and m = %i mode not available, check documentation for available modes\n",
l,
m);
884 ans =
M *
M *
LAL_PI * sqrt(eta * 2.0 / 3) * pow(v, -3.5) * cabs(Hlm);
940 UNUSED
const REAL8 distance,
941 UNUSED
const REAL8 inclination,
942 UNUSED
const REAL8 phiRef,
943 UNUSED
const REAL8 deltaF,
945 UNUSED LALDict *extraParams
981 XLAL_EFUNC,
"IMRPhenomHMCore failed in XLALSimIMRPhenomHM.");
1005 const REAL8 distance,
1006 const REAL8 inclination,
1010 LALDict *extraParams
1016 LALDict *extraParams_aux;
1019 if (extraParams == NULL)
1048 XLAL_EFUNC,
"XLALSimIMRPhenomHMGethlmModes failed");
1062 XLAL_EFUNC,
"init_IMRPhenomHMGet_FrequencyBounds_storage failed");
1077 "Failed to shift coalescence time to t=0,\
1078 tried to apply shift of -1.0/deltaF with deltaF=%g.",
1086 memset((*hptilde)->data->data, 0, pHMFS->
npts *
sizeof(
COMPLEX16));
1092 memset((*hctilde)->data->data, 0, pHMFS->
npts *
sizeof(
COMPLEX16));
1106 if (ModeArray == NULL)
1112 for (
INT4 mm = 1; mm < (
INT4)ell + 1; mm++)
1143 #pragma omp parallel for
1144 for (
size_t i = pHMFS->
ind_min; i < pHMFS->ind_max;
i++)
1146 ((*hptilde)->data->data)[
i] = ((*hptilde)->data->data)[
i] * amp0;
1147 ((*hctilde)->data->data)[
i] = ((*hctilde)->data->data)[
i] * amp0;
1179 UNUSED
const REAL8 phiRef,
1180 UNUSED
const REAL8 deltaF,
1182 UNUSED LALDict *extraParams
1188 LALDict *extraParams_aux;
1196 must be <= 1 in magnitude!\n", chi1z);
1198 must be <= 1 in magnitude!\n", chi2z);
1203 if (extraParams == NULL){
1252 for (
size_t i = 0;
i < pHM->
npts;
i++)
1256 phases->
data[
i] = 0;
1263 "Failed to shift coalescence time to t=0,\
1264 tried to apply shift of -1.0/deltaF with deltaF=%g.",
1273 for (
size_t i = 0;
i < pHM->
npts;
i++)
1275 phases->
data[
i] = 0;
1286 for (
size_t i = 0;
i < pHM->
npts;
i++)
1307 XLALPrintError(
"XLAL Error - IMRPhenomDSetupAmpAndPhaseCoefficients failed\n");
1318 REAL8 phi0 = 0.5 * phi_22_at_f_ref + phiRef;
1324 if (ModeArray == NULL)
1330 for (
INT4 mm = 1; mm < (
INT4)ell + 1; mm++)
1353 XLAL_EFUNC,
"IMRPhenomHMEvaluateOnehlmMode failed");
1402 UNUSED LALDict *extraParams
1431 pHM->eta, pHM->chi1z, pHM->chi2z,
1432 pHM->finspin, extraParams);
1434 REAL8 phase_term1 = 0.0;
1435 REAL8 phase_term2 = 0.0;
1439 for (
size_t i = pHM->ind_min; i < pHM->ind_max;
i++)
1441 Mf = freqs_geom->data[
i];
1442 phase_term1 = - t0 * (Mf - pHM->Mf_ref);
1443 phase_term2 = phases->data[
i] - (mm * phi0);
1444 ((*hlm)->data->data)[
i] = amps->data[
i] * cexp(-I * (phase_term1 + phase_term2));
1462 UNUSED LALDict *extraParams
1482 pHM->ind_min, pHM->ind_max,
1491 XLAL_EFUNC,
"IMRPhenomDAmpFrequencySequence failed");
1513 &powers_of_freq_amp, freqs_amp->
data[
i]);
1516 XLALPrintError(
"PhenomHM_init_useful_powers failed for Mf, status_in_for=%d", status_in_for);
1517 retcode = status_in_for;
1524 freqs_geom->data[
i],
1533 double beta_term2=0.;
1534 double HMamp_term1=1.;
1535 double HMamp_term2=1.;
1538 if (beta_term1 == 0.){
1543 beta = beta_term1 / beta_term2;
1559 amps->data[
i] *=
beta * HMamp_term1 / HMamp_term2;
1577 UNUSED LALDict *extraParams
1590 REAL8 Rholm = pHM->Rholm[ell][mm];
1591 REAL8 Taulm = pHM->Taulm[ell][mm];
1609 XLALPrintError(
"XLAL Error - IMRPhenomDSetupAmpAndPhaseCoefficients failed\n");
1616 REAL8 tmpphaseC = 0.0;
1617 for (
UINT4 i = pHM->ind_min; i < pHM->ind_max;
i++)
1621 Mf_wf = freqs_geom->data[
i];
1623 if (!(Mf_wf >
q.fi))
1625 Mf =
q.ai * Mf_wf +
q.bi;
1628 else if (!(Mf_wf >
q.fr))
1630 Mf =
q.am * Mf_wf +
q.bm;
1633 else if ((Mf_wf >
q.fr))
1635 Mfr =
q.am *
q.fr +
q.bm;
1637 Mf =
q.ar * Mf_wf +
q.br;
1642 XLALPrintError(
"XLAL_ERROR - should not get here - in function IMRPhenomHMPhase");
void XLALDestroyDict(LALDict *dict)
LALDict * XLALDictDuplicate(LALDict *old)
LALDict * XLALCreateDict(void)
UNUSED REAL8 IMRPhenomDPhase_OneFrequency(REAL8 Mf, PhenDAmpAndPhasePreComp pD, REAL8 Rholm, REAL8 Taulm)
Function to return the phenomD phase using the IMRPhenomDSetupAmpAndPhaseCoefficients struct.
int IMRPhenomDAmpFrequencySequence(REAL8Sequence *amps, REAL8Sequence *freqs, size_t ind_min, size_t ind_max, REAL8 m1, REAL8 m2, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z)
Helper function used in PhenomHM and PhenomPv3HM Returns the phenomD amplitude.
REAL8 IMRPhenomDComputet0(REAL8 eta, REAL8 chi1z, REAL8 chi2z, REAL8 finspin, LALDict *extraParams)
computes the time shift as the approximate time of the peak of the 22 mode.
int IMRPhenomDSetupAmpAndPhaseCoefficients(PhenDAmpAndPhasePreComp *pDPreComp, REAL8 m1, REAL8 m2, REAL8 chi1x, REAL8 chi1y, REAL8 chi1z, REAL8 chi2x, REAL8 chi2y, REAL8 chi2z, const REAL8 Rholm, const REAL8 Taulm, LALDict *extraParams)
Function to compute the amplitude and phase coefficients for PhenomD Used to optimise the calls to IM...
#define PHI_fJoin_INS
Dimensionless frequency (Mf) at which the inspiral phase switches to the intermediate phase.
#define AMP_fJoin_INS
Dimensionless frequency (Mf) at which the inspiral amplitude switches to the intermediate amplitude.
Internal function for IMRPhenomD phenomenological waveform model. See LALSimIMRPhenom....
static double fdamp(double eta, double chi1, double chi2, double finspin)
fdamp is the complex part of the ringdown frequency 1508.07250 figure 9
int PhenomHM_init_useful_powers(PhenomHMUsefulPowers *p, REAL8 number)
must be called before the first usage of *p
double IMRPhenomHMTi(REAL8 Mf, const INT4 mm)
mathematica function Ti domain mapping function - inspiral
COMPLEX16 IMRPhenomHMOnePointFiveSpinPN(REAL8 fM, INT4 l, INT4 m, REAL8 M1, REAL8 M2, REAL8 X1z, REAL8 X2z)
Define function for FD PN amplitudes.
static int IMRPhenomHM_check_mode_array(LALValue *ModeArray)
Reads in a ModeArray and checks that it is valid.
static int init_PhenomHM_Storage(PhenomHMStorage *p, const REAL8 m1_SI, const REAL8 m2_SI, const REAL8 chi1x, const REAL8 chi1y, const REAL8 chi1z, const REAL8 chi2x, const REAL8 chi2y, const REAL8 chi2z, REAL8Sequence *freqs, const REAL8 deltaF, const REAL8 f_ref, const REAL8 phiRef)
Precompute a bunch of PhenomHM related quantities and store them filling in a PhenomHMStorage variabl...
LALDict * IMRPhenomHM_setup_mode_array(LALDict *extraParams)
read in a LALDict.
int IMRPhenomHMEvaluateOnehlmMode(UNUSED COMPLEX16FrequencySeries **hlm, UNUSED REAL8Sequence *amps, UNUSED REAL8Sequence *phases, UNUSED REAL8Sequence *freqs_geom, UNUSED PhenomHMStorage *pHM, UNUSED UINT4 ell, UNUSED INT4 mm, UNUSED REAL8 phi0, UNUSED LALDict *extraParams)
Function to compute the one hlm mode.
int IMRPhenomHMFreqDomainMapParams(REAL8 *a, REAL8 *b, REAL8 *fi, REAL8 *fr, REAL8 *f1, const REAL8 flm, const INT4 ell, const INT4 mm, PhenomHMStorage *pHM, const int AmpFlag)
helper function for IMRPhenomHMFreqDomainMap
int init_IMRPhenomHMGet_FrequencyBounds_storage(PhenomHMFrequencyBoundsStorage *p, REAL8Sequence *freqs, REAL8 Mtot, REAL8 deltaF, REAL8 f_ref_in)
derive frequency variables for PhenomHM based on input.
static const double cShift[7]
double IMRPhenomHMFreqDomainMap(REAL8 Mflm, const INT4 ell, const INT4 mm, PhenomHMStorage *pHM, const int AmpFlag)
IMRPhenomHMFreqDomainMap Input waveform frequency in Geometric units (Mflm) and computes what frequen...
int IMRPhenomHMSlopeAmAndBm(double *Am, double *Bm, const INT4 mm, REAL8 fi, REAL8 fr, REAL8 Mf_RD_22, REAL8 Mf_RD_lm, const INT4 AmpFlag, const INT4 ell, PhenomHMStorage *pHM)
helper function for IMRPhenomHMFreqDomainMap
int IMRPhenomHMMapParams(REAL8 *a, REAL8 *b, REAL8 flm, REAL8 fi, REAL8 fr, REAL8 Ai, REAL8 Bi, REAL8 Am, REAL8 Bm, REAL8 Ar, REAL8 Br)
helper function for IMRPhenomHMFreqDomainMap
int IMRPhenomHMPhasePreComp(HMPhasePreComp *q, const INT4 ell, const INT4 mm, PhenomHMStorage *pHM, UNUSED LALDict *extraParams)
int IMRPhenomHMGetRingdownFrequency(REAL8 *fringdown, REAL8 *fdamp, UINT4 ell, INT4 mm, REAL8 finalmass, REAL8 finalspin)
returns the real and imag parts of the complex ringdown frequency for the (l,m) mode.
int IMRPhenomHMPhase(UNUSED REAL8Sequence *phases, UNUSED REAL8Sequence *freqs_geom, UNUSED PhenomHMStorage *pHM, UNUSED UINT4 ell, UNUSED INT4 mm, UNUSED LALDict *extraParams)
returns IMRPhenomHM phase evaluated at a set of input frequencies for the l,m mode
int PhenomHM_init_useful_mf_powers(PhenomHMUsefulMfPowers *p, REAL8 number)
must be called before the first usage of *p
int IMRPhenomHMAmplitude(UNUSED REAL8Sequence *amps, UNUSED REAL8Sequence *freqs_geom, UNUSED PhenomHMStorage *pHM, UNUSED UINT4 ell, UNUSED INT4 mm, UNUSED LALDict *extraParams)
returns IMRPhenomHM amplitude evaluated at a set of input frequencies for the l,m mode
int XLALSimIMRPhenomHMGethlmModes(UNUSED SphHarmFrequencySeries **hlms, UNUSED REAL8Sequence *freqs, UNUSED REAL8 m1_SI, UNUSED REAL8 m2_SI, UNUSED REAL8 chi1x, UNUSED REAL8 chi1y, UNUSED REAL8 chi1z, UNUSED REAL8 chi2x, UNUSED REAL8 chi2y, UNUSED REAL8 chi2z, UNUSED const REAL8 phiRef, UNUSED const REAL8 deltaF, UNUSED REAL8 f_ref, UNUSED LALDict *extraParams)
XLAL function that returns a SphHarmFrequencySeries object containing all the hlm modes requested.
UINT4 IMRPhenomHM_is_freq_uniform(REAL8Sequence *freqs, REAL8 deltaF)
helper function to easily check if the input frequency sequence is uniformly space or a user defined ...
int IMRPhenomHMCore(UNUSED COMPLEX16FrequencySeries **hptilde, UNUSED COMPLEX16FrequencySeries **hctilde, REAL8Sequence *freqs, REAL8 m1_SI, REAL8 m2_SI, REAL8 chi1z, REAL8 chi2z, const REAL8 distance, const REAL8 inclination, const REAL8 phiRef, const REAL8 deltaF, REAL8 f_ref, LALDict *extraParams)
internal function that returns h+ and hx.
double IMRPhenomHMTrd(REAL8 Mf, REAL8 Mf_RD_22, REAL8 Mf_RD_lm, const INT4 AmpFlag, const INT4 ell, const INT4 mm, PhenomHMStorage *pHM)
domain mapping function - ringdown
#define L_MAX_PLUS_1
Highest ell multipole PhenomHM models + 1.
#define PHENOMHM_DEFAULT_MF_MAX
Dimensionless frequency (Mf) at which define the end of the waveform.
#define MAX_ALLOWED_ETA
eta is the symmetric mass-ratio.
int PhenomInternal_IMRPhenomHMFDAddMode(COMPLEX16FrequencySeries *hptilde, COMPLEX16FrequencySeries *hctilde, COMPLEX16FrequencySeries *hlmtilde, REAL8 theta, REAL8 phi, INT4 l, INT4 m, INT4 sym)
helper function to multiple hlm with Ylm.
size_t PhenomInternal_NextPow2(const size_t n)
Return the closest higher power of 2.
int PhenomInternal_PrecessingSpinEnforcePrimaryIsm1(REAL8 *m1, REAL8 *m2, REAL8 *chi1x, REAL8 *chi1y, REAL8 *chi1z, REAL8 *chi2x, REAL8 *chi2y, REAL8 *chi2z)
Given m1 with spins (chi1x, chi1y, chi1z) and m2 with spins (chi2x,chi2y,chi2z).
void PhenomInternal_nudge(REAL8 *x, REAL8 X, REAL8 epsilon)
If x and X are approximately equal to relative accuracy epsilon then set x = X.
static double double delta
double XLALSimPhenomUtilsFDamp0(REAL8 Mtot_Msun, REAL8 distance)
compute the frequency domain amplitude pre-factor
double XLALSimPhenomUtilsIMRPhenomDFinalMass(REAL8 m1, REAL8 m2, REAL8 chi1z, REAL8 chi2z)
Helper function used in PhenomHM and PhenomPv3HM Returns the final mass from the fit used in PhenomD.
REAL8 XLALSimPhenomUtilsPhenomPv2FinalSpin(const REAL8 m1, const REAL8 m2, const REAL8 chi1_l, const REAL8 chi2_l, const REAL8 chip)
Wrapper for final-spin formula based on:
REAL8 XLALSimPhenomUtilsChiP(const REAL8 m1, const REAL8 m2, const REAL8 s1x, const REAL8 s1y, const REAL8 s2x, const REAL8 s2y)
Function to compute the effective precession parameter chi_p (1408.1810)
double XLALSimPhenomUtilsMftoHz(REAL8 Mf, REAL8 Mtot_Msun)
Convert from geometric frequency to frequency in Hz.
double XLALSimPhenomUtilsHztoMf(REAL8 fHz, REAL8 Mtot_Msun)
Convert from frequency in Hz to geometric frequency.
static double beta(const double a, const double b, const sysq *system)
Internal function that computes the spin-orbit couplings.
double SimRingdownCW_KAPPA(double jf, int l, int m)
complex double SimRingdownCW_CW07102016(double kappa, int l, int input_m, int n)
void XLALDestroyValue(LALValue *value)
COMPLEX16FrequencySeries * XLALCreateCOMPLEX16FrequencySeries(const CHAR *name, const LIGOTimeGPS *epoch, REAL8 f0, REAL8 deltaF, const LALUnit *sampleUnits, size_t length)
void XLALDestroyCOMPLEX16FrequencySeries(COMPLEX16FrequencySeries *series)
void * XLALMalloc(size_t n)
UNUSED int XLALSimIMRPhenomHM(UNUSED COMPLEX16FrequencySeries **hptilde, UNUSED COMPLEX16FrequencySeries **hctilde, UNUSED REAL8Sequence *freqs, UNUSED REAL8 m1_SI, UNUSED REAL8 m2_SI, UNUSED REAL8 chi1z, UNUSED REAL8 chi2z, UNUSED const REAL8 distance, UNUSED const REAL8 inclination, UNUSED const REAL8 phiRef, UNUSED const REAL8 deltaF, UNUSED REAL8 f_ref, UNUSED LALDict *extraParams)
Returns h+ and hx in the frequency domain.
COMPLEX16FrequencySeries * XLALSphHarmFrequencySeriesGetMode(SphHarmFrequencySeries *ts, UINT4 l, INT4 m)
Get the time series of a waveform's (l,m) spherical harmonic mode from a SphHarmFrequencySeries linke...
SphHarmFrequencySeries * XLALSphHarmFrequencySeriesAddMode(SphHarmFrequencySeries *appended, const COMPLEX16FrequencySeries *inmode, UINT4 l, INT4 m)
Prepend a node to a linked list of SphHarmFrequencySeries, or create a new head.
void XLALDestroySphHarmFrequencySeries(SphHarmFrequencySeries *ts)
Delete list from current pointer to the end of the list.
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
#define XLAL_PRINT_ERROR(...)
LIGOTimeGPS * XLALGPSAdd(LIGOTimeGPS *epoch, REAL8 dt)
Structure holding Higher Mode Phase pre-computations.
A struct the store the amplitude and phase structs for phenomD.
Structure storing pre-determined quantities that describe the frequency array and tells you over whic...
size_t npts
number of points in waveform array
size_t ind_min
start index containing non-zero values
UINT4 freq_is_uniform
If = 1 then assume uniform spaced, If = 0 then assume arbitrarily spaced.
size_t ind_max
end index containing non-zero values
Structure storing pre-determined quantities complying to the conventions of the PhenomHM model.
REAL8 Rholm[L_MAX_PLUS_1][L_MAX_PLUS_1]
ratio of (2,2) mode to (l,m) mode ringdown frequency
REAL8 Taulm[L_MAX_PLUS_1][L_MAX_PLUS_1]
ratio of (l,m) mode to (2,2) mode damping time
REAL8 chi1x
x-component of the dimensionless spin of object 1 w.r.t.
REAL8 chi2y
y-component of the dimensionless spin of object 2 w.r.t.
size_t npts
number of points in waveform array
REAL8 chi2z
z-component of the dimensionless spin of object 2 w.r.t.
REAL8 m2
mass of lighter body in solar masses
REAL8 chi2x
x-component of the dimensionless spin of object 2 w.r.t.
REAL8 chi1z
z-component of the dimensionless spin of object 1 w.r.t.
REAL8 Mtot
total mass in solar masses
REAL8 m1
mass of larger body in solar masses
REAL8 PhenomHMfring[L_MAX_PLUS_1][L_MAX_PLUS_1]
REAL8 Mf_ref
reference frequnecy in geometric units
REAL8 chi1y
y-component of the dimensionless spin of object 1 w.r.t.
UINT4 freq_is_uniform
If = 1 then assume uniform spaced, If = 0 then assume arbitrarily spaced.
Useful powers of Mf: 1/6, 1/3, 2/3, 4/3, 5/3, 2, 7/3, 8/3, -7/6, -5/6, -1/2, -1/6,...
useful powers in GW waveforms: 1/6, 1/3, 2/3, 4/3, 5/3, 2, 7/3, 8/3, -1, -1/6, -7/6,...