22 #include <lal/Units.h>
23 #include <lal/LALAdaptiveRungeKuttaIntegrator.h>
24 #include <lal/FindRoot.h>
25 #include <lal/SeqFactories.h>
26 #include <lal/LALSimInspiral.h>
27 #include <lal/LALSimIMR.h>
29 #include <lal/TimeSeries.h>
30 #include <lal/LALSimSphHarmMode.h>
31 #include <lal/LALSimBlackHoleRingdown.h>
32 #include <gsl/gsl_sf_gamma.h>
69 const double values[],
82 const double values[],
88 const double values[],
110 const REAL8 target,
const size_t start);
135 return sqrt(-dA/(2.*
u*A +
u2 * dA));
156 REAL8 onebyD, AbyD, Heff, HReal, etahH;
174 z3 = 2. * (4. - 3. * eta) * eta;
180 Heff = sqrt(A*(1. + AbyD * p2 +
q*
q *
u2 +
z3 * p4 *
u2));
181 HReal = sqrt(1. + 2.*eta*(Heff - 1.)) / eta;
182 etahH = eta*Heff*HReal;
186 pr = -vr + A*(AbyD*
p + 2. *
z3 *
u2 * p3)/etahH;
219 omega = sqrt(
u3) * sqrt ( -0.5 * dA /(1. + 2.*eta * (A/sqrt(A+0.5 *
u*dA)-1.)));
243 omega1 = pr3in->
omega;
245 return ( -omega1 + omega2 );
257 const REAL8 values[],
285 memcpy( &(valuesVec.
data), &(values),
sizeof(
REAL8 *) );
289 z3 = 2. * ( 4. - 3. * eta ) * eta;
313 Hreal = sqrt( 1. + 2.*eta*(Heff - 1.) );
315 HeffHreal = Heff *
Hreal;
318 dvalues[0] = AoverSqrtD *
u2 *
p * (
r2 + 2. * p2 *
z3 * A ) / HeffHreal;
321 dvalues[1] = omega =
q * A *
u2 / HeffHreal;
328 dvalues[2] = 0.5 * AoverSqrtD *
u3 * ( 2.0 * (
q2 + p4 *
z3) * A
329 -
r * (
q2 +
r2 + p4 *
z3 ) * dAdr ) / HeffHreal
330 - (
p /
q) * (flux / (eta * omega));
333 dvalues[3] = - flux / (eta * omega);
354 Hreal = sqrt( 1. + 2.*eta*(Heff - 1.) );
356 HeffHreal = Heff *
Hreal;
357 return pPhi * A / (HeffHreal*
r*
r);
367 const double UNUSED values[],
374 double omega = dvalues[1];
376 if ( omega < params->omega )
393 const double values[],
395 void UNUSED *funcParams
402 rstop = 1.25 -
params->eta;
406 rstop = 2.1 - 10.0 *
params->eta;
409 if ( values[0] <= rstop || isnan(dvalues[3]) || isnan (dvalues[2]) || isnan (dvalues[1]) || isnan (dvalues[0]) )
426 REAL8 A, dAdr, d2Adr2, dA, d2A, NA, DA, dDA, dNA, d2DA, d2NA;
445 NA = r4 * aCoeffs->
n4
455 dNA = 4. * aCoeffs->
n4 * r3
456 + 5. * aCoeffs->
n5 * r4;
459 + 2. * aCoeffs->
d2 *
r
460 + 3. * aCoeffs->
d3 *
r2
461 + 4. * aCoeffs->
d4 * r3
462 + 5. * aCoeffs->
d5 * r4;
464 d2NA = 12. * aCoeffs->
n4 *
r2
465 + 20. * aCoeffs->
n5 * r3;
467 d2DA = 2. * aCoeffs->
d2
468 + 6. * aCoeffs->
d3 *
r
469 + 12. * aCoeffs->
d4 *
r2
470 + 20. * aCoeffs->
d5 * r3;
473 dAdr = ( dNA * DA - dDA * NA ) / (DA*DA);
474 d2Adr2 = (d2NA*DA - d2DA*NA - 2.*dDA*DA*dAdr)/(DA*DA);
479 d2A = r4 * d2Adr2 + 2.*r3 * dAdr;
487 twoUAPlusu2dA = 2.*
u * A +
u2 * dA;
488 x1 = -
r2 * sqrt (-dA * twoUAPlusu2dA * twoUAPlusu2dA * twoUAPlusu2dA )
489 / (2.*
u * dA * dA + A*dA -
u * A * d2A);
582 REAL8 a12, a22, a32, a42, a52, a62, a72, a23, a33, a43, a53, a34, a44;
588 memset( ak, 0,
sizeof( *ak ) );
591 ak->
fPaN = ak->
FTaN = 32.*eta*eta/5.;
593 ak->
FTa2 = -1247./336.-35.*eta/12.;
595 ak->
FTa4 = -44711./9072.+9271.*eta/504.+65.*eta*eta/18.;
597 ak->
FTl6 = -1712./105.;
600 - 94403./3024. *eta*eta - 775./324. * eta*eta*eta;
601 ak->
FTa7 =
LAL_PI * (-16285./504. + 214745./1728.*eta
602 + 193385./3024.*eta*eta);
603 ak->
FTa8 = - 117.5043907226773;
604 ak->
FTl8 = 52.74308390022676;
611 a1 = ak->
FTa1 - 1./vpole;
630 + 2.*pow(
c1+
c2+c3,2.) + c3*(c4-2.*
c1))
631 +
c1*
c2*c3*c4*c5*(c5 + 2.*(
c1+
c2+c3+c4))
632 - a6)/(
c1*
c2*c3*c4*c5);
648 c7 = ((a23 + a32 + a12*
a4 -
a2*(2*a1*a3 +
a4)) *
649 (-a44 - a32*a52 + a1*a53 - a22*a62 + a33*a7
650 + a22*a5*a7 + a42*(3*a3*a5 + 2*
a2*a6 + a1*a7)
651 + a3*(2*
a2*a5*a6 + a1*a62 - a1*a5*a7)
652 - 2*
a4*((a32 + a1*a5)*a6 +
a2*(a52 + a3*a7))))/
653 ((a33 + a1*a42 + a22*a5 - a3*(2*
a2*
a4 + a1*a5))*
654 (a34 + a22*a42 - a43 - 2*a1*
a2*
a4*a5 + a12*a52
655 -
a2*a52 - a23*a6 - a12*
a4*a6 +
a2*
a4*a6
656 - a32*(3*
a2*
a4 + 2*a1*a5 + a6)
657 + 2*a3*((a22 +
a4)*a5 + a1*(a42 +
a2*a6))));
659 c8 = -(((a33 + a1*a42 + a22*a5 - a3*(2*
a2*
a4 + a1*a5)) *
660 (pow(
a4,5) + pow(a5,4) - 2*a33*a5*a6 + 2*a1*a3*a52*a6
661 + 2*a3*a5*a62 + a12*a62*a6 - 2*a3*a52*a7
662 + 2*a1*a32*a6*a7 - 2*a12*a5*a6*a7 + a32*a72
663 + pow(a3,4)*a8 - 2*a1*a32*a5*a8 + a12*a52*a8
664 - a32*a6*a8 - a43*(4*a3*a5 + 3*
a2*a6 + 2*a1*a7 + a8)
665 + a42*(3*
a2*a52 + 3*a32*a6 + 4*a1*a5*a6 + a62
666 + 4*
a2*a3*a7 + 2*a5*a7 + a22*a8 + 2*a1*a3*a8)
667 + a22*(a52*a6 - 2*a3*a6*a7 + 2*a3*a5*a8)
668 + a22*
a2*(a72 - a6*a8) -
a4*(3*a52*a6 - 2*a22*a62 + 2*a33*a7
669 + 4*a22*a5*a7 +
a2*a72 -
a2*a6*a8 - 3*a32*(a52 -
a2*a8)
670 + 2*a3*(
a2*a5*a6 + 2*a1*a62 + a6*a7 - a5*a8)
671 + 2*a1*(a52*a5 -
a2*a6*a7 +
a2*a5*a8) + a12*(-a72 + a6*a8))
672 +
a2*(-a62*a6 + 2*a5*a6*a7 + 2*a1*a5*(-a62 + a5*a7)
673 + a32*(a62 + 2*a5*a7) - a52*a8
674 - 2*a3*(a52*a5 + a1*(a72 - a6*a8)))))
675 / ((pow(a3,4) + a22*a42 - a43 - 2*a1*
a2*
a4*a5
676 + a12*a52 -
a2*a52 - a22*
a2*a6 - a12*
a4*a6 +
a2*
a4*a6
677 - a32*(3*
a2*
a4 + 2*a1*a5 + a6)
678 + 2*a3*((a22 +
a4)*a5 + a1*(a42 +
a2*a6)))
679 * (-pow(
a4,4) - a32*a52 + a1*a52*a5 - a22*a62 + a33*a7
680 + a22*a5*a7 + a42*(3*a3*a5 + 2*
a2*a6 + a1*a7)
681 + a3*(2*
a2*a5*a6 + a1*a62 - a1*a5*a7)
682 - 2*
a4*((a32 + a1*a5)*a6 +
a2*(a52 + a3*a7)))));
698 size_t k = start + 1;
709 if (fsign != 0) f = -f;
711 if (f >= target)
return k - 1;
714 printf(
"Error: initial frequency too high, no waveform generated");
719 const REAL8 target,
const size_t start) {
720 size_t k = start + 1;
726 const REAL8 hreDot = (creal(dataPtr[k+1]) - creal(dataPtr[k-1]))
728 const REAL8 himDot = (cimag(dataPtr[k+1]) - cimag(dataPtr[k-1]))
730 REAL8 f = hreDot * cimag(dataPtr[k]) - himDot * creal(dataPtr[k]);
732 f /= creal(dataPtr[k]) * creal(dataPtr[k])
733 + cimag(dataPtr[k]) * cimag(dataPtr[k]);
734 if (f >= target)
return k - 1;
736 printf(
"Error: initial frequency too high, no waveform generated");
751 const REAL8 distance,
752 const REAL8 inclination,
753 const int higherModeFlag
756 UINT4 count, nn=4, hiSRndx=0;
757 UINT4 flag_fLower_extend = 0;
764 REAL8Vector rVecHi, phiVecHi, prVecHi, pPhiVecHi, tVecHi;
767 REAL8 mass1, mass2, totalMass;
768 REAL8 eta,
m,
r,
s,
p,
q,
dt, t, v, omega, f, ampl0;
806 REAL8 resampEstimate;
812 const REAL8 xacc = 1.0e-12;
815 const REAL8 rInitMin = 3.;
816 const REAL8 rInitMax = 1000.;
818 const REAL8 prInitMin = -10.;
819 const REAL8 prInitMax = 5.;
822 const REAL8 EPS_ABS = 1.0e-12;
823 const REAL8 EPS_REL = 1.0e-10;
861 if ( (!hplus || !hcross) && !h_lms )
866 if ( hplus && hcross )
868 if ( *hplus || *hcross )
870 XLALPrintError(
"(*hplus) and (*hcross) are expected to be NULL; got %p and %p\n",
885 if ( distance <= 0.0 )
891 if ( m1SI <= 0. || m2SI <= 0. )
901 if ( !values || !dvalues )
912 totalMass = mass1 + mass2;
914 eta = mass1 * mass2 / (totalMass*totalMass);
935 if ( higherModeFlag == 0 )
939 else if ( higherModeFlag == 1 )
946 "(expected 0 or 1, but got %d\n)", higherModeFlag );
952 for ( currentMode = 0; currentMode <
nModes; currentMode++ )
956 modeL =
lmModes[currentMode][0];
957 modeM =
lmModes[currentMode][1];
974 XLALPrintError(
"(%d,%d) mode ringdown freq greater than Nyquist freq. "
975 "Increase sample rate or consider using EOB approximant.\n",modeL,modeM );
981 tStepBack = 20.0 *
m;
982 nStepBack = ceil( tStepBack /
dt );
985 memset( &eobParams, 0,
sizeof(eobParams) );
987 eobParams.
m1 = mass1;
988 eobParams.
m2 = mass2;
1020 resampEstimate = 20.*
dt /
m;
1023 if ( resampEstimate > 1 )
1025 resampPwr = (
UINT4)ceil(log2(resampEstimate));
1026 while ( resampPwr-- )
1056 pr3in.
omega = omega;
1068 flag_fLower_extend = 1;
1069 omega = pow(10., -1.5);
1070 pr3in.
omega = omega;
1076 XLALPrintError(
"Initial orbital frequency too low. The corresponding initial radius > %fM\n", rInitMax);
1082 rInitMax, xacc, &pr3in);
1085 XLALPrintError(
"Failed solving the initial radius. The desired initial orbital frequency is %e\n", omega );
1095 r = (
r<rmin) ? rmin :
r;
1102 pr3in.
omega = omega;
1122 values->
data[0] =
r;
1123 values->
data[1] =
s;
1124 values->
data[2] =
p;
1125 values->
data[3] =
q;
1142 if ( !sigReHi || !sigImHi || !phseHi )
1164 memset(
q1->data, 0,
q1->length *
sizeof(
REAL8 ));
1165 memset(
q2->data, 0,
q2->length *
sizeof(
REAL8 ));
1166 memset(
q3->data, 0,
q3->length *
sizeof(
REAL8 ));
1197 hiSRndx = retLen - nStepBack;
1202 phiVec.
data = dynamics->
data+2*retLen;
1203 prVec.
data = dynamics->
data+3*retLen;
1204 pPhiVec.
data = dynamics->
data+4*retLen;
1207 values->
data[0] = rVec.
data[hiSRndx];
1208 values->
data[1] = phiVec.
data[hiSRndx];
1209 values->
data[2] = prVec.
data[hiSRndx];
1210 values->
data[3] = pPhiVec.
data[hiSRndx];
1216 0, (lengthHiSR-1)*
dt/
m,
dt/
m, &dynamicsHi );
1219 rVecHi.
data = dynamicsHi->
data+retLen;
1220 phiVecHi.
data = dynamicsHi->
data+2*retLen;
1221 prVecHi.
data = dynamicsHi->
data+3*retLen;
1222 pPhiVecHi.
data = dynamicsHi->
data+4*retLen;
1251 if (flag_fLower_extend == 1)
1253 lfCut = pow(10., -1.5);
1259 while (
i < hiSRndx )
1262 if ( omega > lfCut || fabs( omega - lfCut ) < 1.0e-5 )
1283 XLALPrintError(
"Low frequency cut-off is too close to coalescence frequency.\n" );
1291 for (
i=0;
i < (
UINT4)retLen;
i++ )
1294 omegaHi->
data[
i] = omega;
1297 values->
data[1] =
s = phiVecHi.
data[
i] - sSub;
1301 if ( omega <= omegaOld && !peakIdx )
1307 finalIdx = retLen - 1;
1310 gsl_spline *spline = NULL;
1311 gsl_interp_accel *acc = NULL;
1314 REAL8 timePeak, omegaDerivMid;
1316 spline = gsl_spline_alloc( gsl_interp_cspline, retLen );
1317 acc = gsl_interp_accel_alloc();
1319 time1 = dynamicsHi->
data[peakIdx];
1321 gsl_spline_init( spline, dynamicsHi->
data, omegaHi->
data, retLen );
1322 omegaDeriv1 = gsl_spline_eval_deriv( spline, time1, acc );
1323 if ( omegaDeriv1 > 0. )
1325 time2 = dynamicsHi->
data[peakIdx+1];
1330 time1 = dynamicsHi->
data[peakIdx-1];
1332 omegaDeriv1 = gsl_spline_eval_deriv( spline, time1, acc );
1337 timePeak = ( time1 + time2 ) / 2.;
1338 omegaDerivMid = gsl_spline_eval_deriv( spline, timePeak, acc );
1340 if ( omegaDerivMid * omegaDeriv1 < 0.0 )
1346 omegaDeriv1 = omegaDerivMid;
1350 while ( time2 - time1 > 1.0e-5 );
1361 t =
m * (dynamics->
data[hiSRndx] + timePeak - dynamics->
data[startIdx]);
1362 gsl_spline_init( spline, dynamicsHi->
data, phiVecHi.
data, retLen );
1364 sSub = 0*gsl_spline_eval( spline, timePeak, acc ) - phiC;
1366 gsl_spline_free( spline );
1367 gsl_interp_accel_free( acc );
1373 if( hplus && hcross )
1376 &
lalStrainUnit, hiSRndx - startIdx + lengthHiSR / resampFac );
1380 if ( !(*hplus) || !(*hcross) )
1405 memset( (*hplus)->data->data, 0, (*hplus)->data->length *
sizeof(
REAL8) );
1406 memset( (*hcross)->data->data, 0, (*hcross)->data->length *
sizeof(
REAL8) );
1411 for ( currentMode = 0; currentMode <
nModes; currentMode++ )
1414 &
lalStrainUnit, hiSRndx - startIdx + lengthHiSR / resampFac );
1419 modeL =
lmModes[currentMode][0];
1420 modeM =
lmModes[currentMode][1];
1423 if ( eta == 0.25 && modeM % 2 )
1430 for (
i=0;
i < (
UINT4)retLen;
i++ )
1433 omegaHi->
data[
i] = omega;
1436 values->
data[1] =
s = phiVecHi.
data[
i] - sSub;
1444 ampNQC->
data[
i] = cabs( hLM );
1445 sigReHi->
data[
i] = (
REAL8) ampl0 * creal(hLM);
1446 sigImHi->
data[
i] = (
REAL8) ampl0 * cimag(hLM);
1453 q1->data[
i] =
p*
p / (
r*
r*omega*omega);
1454 q2->data[
i] =
q1->data[
i] /
r;
1455 q3->data[
i] =
q2->data[
i] / sqrt(
r);
1456 p1->
data[
i] =
p / (
r*omega );
1461 XLALSimIMREOBCalculateNQCCoefficients( &nqcCoeffs, ampNQC, phseHi,
q1,
q2,
q3,p1,p2, modeL, modeM, timePeak,
dt/
m, eta );
1465 while (
i < hiSRndx )
1481 sigMode->
data->
data[count] = hLM * ampl0;
1488 for (
i = 0;
i <= finalIdx;
i++ )
1494 values->
data[1] =
s = phiVecHi.
data[
i] - sSub;
1500 hLM = sigReHi->
data[
i];
1501 hLM += I * sigImHi->
data[
i];
1504 sigReHi->
data[
i] = creal(hLM);
1505 sigImHi->
data[
i] = cimag(hLM);
1512 if ( !rdMatchPoint )
1534 if ( ceil( tStepBack / ( 2.0 *
dt ) ) > peakIdx )
1536 XLALPrintError(
"Invalid index for first ringdown matching point.\n" );
1559 if ( combSize > timePeak )
1564 rdMatchPoint->
data[0] = combSize < timePeak + nrPeakDeltaT ? timePeak + nrPeakDeltaT - combSize : 0;
1565 rdMatchPoint->
data[1] = timePeak + nrPeakDeltaT;
1566 rdMatchPoint->
data[2] = dynamicsHi->
data[finalIdx];
1568 rdMatchPoint->
data[0] -= fmod( rdMatchPoint->
data[0],
dt/
m );
1569 rdMatchPoint->
data[1] -= fmod( rdMatchPoint->
data[1],
dt/
m );
1572 modeL, modeM,
dt, mass1, mass2, 0, 0, 0, 0, 0, 0, &tVecHi, rdMatchPoint,
EOBNRv2 );
1597 for(j=0; j<sigReHi->
length; j+=resampFac)
1605 if( hplus && hcross)
1607 XLALSimAddMode( *hplus, *hcross, sigMode, inclination, 0., modeL, modeM, 1 );
1609 else if( !(*h_lms) )
1611 if (flag_fLower_extend == 1)
1623 if (flag_fLower_extend == 1)
1638 if (flag_fLower_extend == 1 && hplus && hcross)
1640 if ( cos(inclination) < 0.0 )
1650 if (!(*hplus) || !(*hcross))
1700 const REAL8 distance,
1701 const REAL8 inclination
1728 const REAL8 distance,
1729 const REAL8 inclination
1753 const REAL8 distance
static REAL8 XLALSimIMREOBFactorizedFlux(REAL8Vector *values, const REAL8 omega, EOBParams *ak, const INT4 lMax)
This function calculates the factorized flux in the EOB dynamics for the EOBNR (and potentially subse...
Module to compute the ring-down waveform as linear combination of quasi-normal-modes decaying wavefor...
static UNUSED INT4 XLALSimIMREOBHybridAttachRingdown(REAL8Vector *signal1, REAL8Vector *signal2, const INT4 l, const INT4 m, const REAL8 dt, const REAL8 mass1, const REAL8 mass2, const REAL8 spin1x, const REAL8 spin1y, const REAL8 spin1z, const REAL8 spin2x, const REAL8 spin2y, const REAL8 spin2z, REAL8Vector *timeVec, REAL8Vector *matchrange, Approximant approximant)
The main workhorse function for performing the ringdown attachment for EOB models EOBNRv2 and SEOBNRv...
static UNUSED int XLALSimIMREOBCalculateNQCCoefficients(EOBNonQCCoeffs *restrict coeffs, REAL8Vector *restrict amplitude, REAL8Vector *restrict phase, REAL8Vector *restrict q1, REAL8Vector *restrict q2, REAL8Vector *restrict q3, REAL8Vector *restrict p1, REAL8Vector *restrict p2, INT4 l, INT4 m, REAL8 timePeak, REAL8 deltaT, REAL8 eta)
This function computes the coefficients a1, a2, etc.
static UNUSED int XLALSimIMREOBNonQCCorrection(COMPLEX16 *restrict nqc, REAL8Vector *restrict values, const REAL8 omega, EOBNonQCCoeffs *restrict coeffs)
This function calculates the non-quasicircular correction to apply to the waveform.
static UNUSED int XLALSimIMREOBGetCalibratedNQCCoeffs(EOBNonQCCoeffs *coeffs, INT4 l, INT4 m, REAL8 eta)
For the 2,2 mode, there are fits available for the NQC coefficients, given in Eqs.
static REAL8 XLALSimIMREOBGetNRPeakDeltaT(INT4 l, INT4 m, REAL8 eta)
Compute the time offset which should be used in computing the non-quasicircular correction and perfor...
static int XLALSimIMREOBNRv2Generator(REAL8TimeSeries **hplus, REAL8TimeSeries **hcross, SphHarmTimeSeries **h_lms, const REAL8 phiC, const REAL8 deltaT, const REAL8 m1SI, const REAL8 m2SI, const REAL8 fLower, const REAL8 distance, const REAL8 inclination, const int higherModeFlag)
static REAL8 XLALprInitP4PN(REAL8 p, void *params)
static size_t find_instant_freq(const REAL8TimeSeries *hp, const REAL8TimeSeries *hc, const REAL8 target, const size_t start, const int fsign)
static REAL8 XLALpphiInitP4PN(const REAL8 r, EOBACoefficients *restrict coeffs)
static int LALHCapDerivativesP4PN(double t, const double values[], double dvalues[], void *funcParams)
static int XLALFirstStoppingCondition(double t, const double values[], double dvalues[], void *funcParams)
static REAL8 omegaofrP4PN(const REAL8 r, const REAL8 eta, void *params)
static const int EOBNRV2_NUM_MODES_MAX
The maximum number of modes available to us in this model.
static int XLALSimIMREOBNRv2SetupFlux(expnCoeffsdEnergyFlux *ak, REAL8 eta)
The following declarations are so that the compiler quits.
static REAL8 XLALSimIMREOBGetRingdownAttachCombSize(INT4 l, INT4 m)
static REAL8 XLALrOfOmegaP4PN(REAL8 r, void *params)
static int XLALHighSRStoppingCondition(double t, const double values[], double dvalues[], void *funcParams)
static REAL8 XLALCalculateOmega(REAL8 eta, REAL8 r, REAL8 pr, REAL8 pPhi, EOBACoefficients *aCoeffs)
static REAL8 XLALvrP4PN(const REAL8 r, const REAL8 omega, pr3In *params)
static size_t find_instant_freq_hlm(const COMPLEX16TimeSeries *hlm, const REAL8 target, const size_t start)
static UNUSED int XLALSimIMREOBComputeNewtonMultipolePrefixes(NewtonMultipolePrefixes *prefix, const REAL8 m1, const REAL8 m2)
Function which computes the various coefficients in the Newtonian multipole.
const UINT4 lmModes[NMODES][2]
static REAL8 UNUSED q3(REAL8 e0, REAL8 f0, REAL8 inc, REAL8 bet, REAL8 FPlus, REAL8 FCross)
static REAL8 UNUSED q2(REAL8 e0, REAL8 f0, REAL8 inc, REAL8 bet, REAL8 FPlus, REAL8 FCross)
static REAL8 UNUSED q1(REAL8 e0, REAL8 f0, REAL8 inc, REAL8 bet, REAL8 FPlus, REAL8 FCross)
static REAL8 UNUSED z3(REAL8 e0, REAL8 f0, REAL8 inc, REAL8 bet, REAL8 FPlus, REAL8 FCross)
Module containing the energy and flux functions for waveform generation.
static REAL8 UNUSED XLALSimInspiralFp8PP(REAL8 v, expnCoeffsdEnergyFlux *ak)
void XLALDestroyREAL8Array(REAL8Array *)
REAL8 XLALDBisectionFindRoot(REAL8(*y)(REAL8, void *), REAL8 xmin, REAL8 xmax, REAL8 xacc, void *params)
int XLALAdaptiveRungeKutta4(LALAdaptiveRungeKuttaIntegrator *integrator, void *params, REAL8 *yinit, REAL8 tinit, REAL8 tend, REAL8 deltat, REAL8Array **yout)
void XLALAdaptiveRungeKuttaFree(LALAdaptiveRungeKuttaIntegrator *integrator)
LALAdaptiveRungeKuttaIntegrator * XLALAdaptiveRungeKutta4Init(int dim, int(*dydt)(double t, const double y[], double dydt[], void *params), int(*stop)(double t, const double y[], double dydt[], void *params), double eps_abs, double eps_rel)
INT4 XLALSimIMREOBGenerateQNMFreqV2(COMPLEX16Vector *modefreqs, const REAL8 mass1, const REAL8 mass2, const REAL8 spin1[3], const REAL8 spin2[3], UINT4 l, INT4 m, UINT4 nmodes, Approximant approximant)
These functions generate the quasinormal mode frequencies for a black hole ringdown.
#define EOB_RD_EFOLDS
The number of e-folds of ringdown which should be attached for EOBNR models.
int XLALSimIMREOBNRv2AllModes(REAL8TimeSeries **hplus, REAL8TimeSeries **hcross, const REAL8 phiC, const REAL8 deltaT, const REAL8 m1SI, const REAL8 m2SI, const REAL8 fLower, const REAL8 distance, const REAL8 inclination)
This function generates the plus and cross polarizations for the EOBNRv2 approximant with all availab...
SphHarmTimeSeries * XLALSimIMREOBNRv2Modes(const REAL8 deltaT, const REAL8 m1, const REAL8 m2, const REAL8 fLower, const REAL8 distance)
Wrapper function to generate the -2 spin-weighted spherical harmonic modes (as opposed to generating ...
int XLALSimIMREOBNRv2DominantMode(REAL8TimeSeries **hplus, REAL8TimeSeries **hcross, const REAL8 phiC, const REAL8 deltaT, const REAL8 m1SI, const REAL8 m2SI, const REAL8 fLower, const REAL8 distance, const REAL8 inclination)
This function generates the plus and cross polarizations for the dominant (2,2) mode of the EOBNRv2 a...
int XLALSimAddMode(REAL8TimeSeries *hplus, REAL8TimeSeries *hcross, COMPLEX16TimeSeries *hmode, REAL8 theta, REAL8 phi, int l, int m, int sym)
Multiplies a mode h(l,m) by a spin-2 weighted spherical harmonic to obtain hplus - i hcross,...
SphHarmTimeSeries * XLALSphHarmTimeSeriesAddMode(SphHarmTimeSeries *appended, const COMPLEX16TimeSeries *inmode, UINT4 l, INT4 m)
Prepend a node to a linked list of SphHarmTimeSeries, or create a new head.
void XLALDestroySphHarmTimeSeries(SphHarmTimeSeries *ts)
Delete list from current pointer to the end of the list.
REAL8TimeSeries * XLALResizeREAL8TimeSeries(REAL8TimeSeries *series, int first, size_t length)
REAL8TimeSeries * XLALCreateREAL8TimeSeries(const CHAR *name, const LIGOTimeGPS *epoch, REAL8 f0, REAL8 deltaT, const LALUnit *sampleUnits, size_t length)
void XLALDestroyCOMPLEX16TimeSeries(COMPLEX16TimeSeries *series)
COMPLEX16TimeSeries * XLALResizeCOMPLEX16TimeSeries(COMPLEX16TimeSeries *series, int first, size_t length)
void XLALDestroyREAL8TimeSeries(REAL8TimeSeries *series)
COMPLEX16TimeSeries * XLALCreateCOMPLEX16TimeSeries(const CHAR *name, const LIGOTimeGPS *epoch, REAL8 f0, REAL8 deltaT, const LALUnit *sampleUnits, size_t length)
const LALUnit lalStrainUnit
COMPLEX16Vector * XLALCreateCOMPLEX16Vector(UINT4 length)
REAL8Vector * XLALCreateREAL8Vector(UINT4 length)
void XLALDestroyREAL8Vector(REAL8Vector *vector)
void XLALDestroyCOMPLEX16Vector(COMPLEX16Vector *vector)
#define XLAL_ERROR_REAL8(...)
#define XLAL_ERROR_NULL(...)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
int int XLALPrintWarning(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
#define XLAL_IS_REAL8_FAIL_NAN(val)
LIGOTimeGPS * XLALGPSAdd(LIGOTimeGPS *epoch, REAL8 dt)
Structure containing the coefficients for EOBNRv2 A potential function.
The coefficients which are used in calculating the non-quasicircular correction to the EOBNRv2 model.
Structure containing all the parameters needed for the EOB waveform.
EOBNonQCCoeffs * nqcCoeffs
FacWaveformCoeffs * hCoeffs
NewtonMultipolePrefixes * prefixes
EOBACoefficients * aCoeffs
int(* stop)(double t, const double y[], double dydt[], void *params)
Structure containing all the terms of the Newtonian multipole which are constant over the course of t...
Structure to carry a collection of spherical harmonic modes in COMPLEX16 time series.
Structure containing parameters used to determine the initial radial momentum.
REAL8 vr
< Radial velocity (dimensionless)
EOBACoefficients * aCoeffs
< Pre-computed coefficients of EOB A function
REAL8 eta
< Symmetric mass ratio
REAL8 r
< Orbital separation (units of total mass)
REAL8 omega
< Angular frequency (dimensionless combination M omega)