25 #define UNUSED __attribute__ ((unused))
32 #include <gsl/gsl_errno.h>
33 #include <gsl/gsl_spline.h>
35 #include <lal/LALStdlib.h>
36 #include <lal/LALSimIMR.h>
37 #include <lal/LALConstants.h>
39 #include <lal/FrequencySeries.h>
40 #include <lal/StringInput.h>
41 #include <lal/TimeSeries.h>
42 #include <lal/TimeFreqFFT.h>
43 #include <lal/Units.h>
58 static int IMRPhenomCGenerateFDForTD(
COMPLEX16FrequencySeries **htilde,
const REAL8 t0,
const REAL8 phi0,
const REAL8 deltaF,
const REAL8 m1,
const REAL8 m2,
const REAL8 f_min,
const REAL8 f_max,
const REAL8 distance,
const BBHPhenomCParams *
params,
const size_t nf);
100 const REAL8 distance,
122 if (chi > 0.9 || chi < -0.9)
127 REAL8 q = (m1 > m2) ? (m1 / m2) : (m2 / m1);
130 XLAL_ERROR(
XLAL_EDOM,
"Mass ratio is way outside the calibration range. m1/m2 should be <= 20.\n");
142 f_max_prime = (f_max_prime >
params->fCut) ?
params->fCut : f_max_prime;
143 if (f_max_prime <=
f_min)
148 if (f_max_prime <
f_max) {
169 LALDict *extraParams = NULL;
171 return phenomParams->
fCut;
198 const REAL8 distance,
199 const REAL8 inclination,
203 size_t cut_ind, peak_ind, ind_t0;
224 if (chi > 0.9 || chi < -0.9)
229 REAL8 q = (m1 > m2) ? (m1 / m2) : (m2 / m1);
232 XLAL_ERROR(
XLAL_EDOM,
"Mass ratio is way outside the calibration range. m1/m2 should be <= 20.\n");
244 f_max_prime = (f_max_prime >
params->fCut) ?
params->fCut : f_max_prime;
245 if (f_max_prime <=
f_min)
278 if (!(*hplus) || !(*hcross))
283 peak_phase = atan2((*hcross)->data->data[peak_ind], (*hplus)->data->data[peak_ind]);
312 const REAL8 distance,
325 const REAL8 eta = m1 * m2 / (
M *
M);
342 memset((*htilde)->data->data, 0, n *
sizeof(
COMPLEX16));
346 size_t ind_min = (size_t) (
f_min / deltaF);
347 size_t ind_max = (size_t) (
f_max / deltaF);
350 gsl_interp_accel *acc = gsl_interp_accel_alloc();
351 size_t L = ind_max - ind_min;
352 gsl_spline *phiI = gsl_spline_alloc(gsl_interp_cspline, L);
357 #pragma omp parallel for
358 for (
size_t i = ind_min;
i < ind_max;
i++)
361 REAL8 phPhenomC = 0.0;
362 REAL8 aPhenomC = 0.0;
365 int per_thread_errcode;
366 #pragma omp flush(errcode)
372 errcode = per_thread_errcode;
373 #pragma omp flush(errcode)
376 phPhenomC -= 2.*phi0;
378 freqs[
i-ind_min] = f;
379 phis[
i-ind_min] = -phPhenomC;
382 ((*htilde)->data->data)[
i] = amp0 * aPhenomC * cos(phPhenomC);
383 ((*htilde)->data->data)[
i] += -I * amp0 * aPhenomC * sin(phPhenomC);
393 gsl_spline_init(phiI, freqs, phis, L);
399 if (f_final > freqs[L-1])
400 f_final = freqs[L-1];
401 if (f_final < freqs[0])
405 REAL8 t_corr = gsl_spline_eval_deriv(phiI, f_final, acc) / (2*
LAL_PI);
408 for (
size_t i = ind_min;
i < ind_max;
i++) {
410 ((*htilde)->data->data)[
i] *= cexp(-2*
LAL_PI * I * f * t_corr);
413 gsl_spline_free(phiI);
414 gsl_interp_accel_free(acc);
431 const REAL8 distance,
440 const REAL8 eta = m1 * m2 / (
M *
M);
447 REAL8 phPhenomC = 0.0;
448 REAL8 aPhenomC = 0.0;
461 memset((*htilde)->data->data, 0, n *
sizeof(
COMPLEX16));
466 size_t ind_max = (size_t) (
f_max / deltaF);
467 for (
i = (
size_t) (
f_min / deltaF);
i < ind_max;
i++)
474 phPhenomC -= 2.*phi0;
475 phPhenomC += 2.*
LAL_PI*f*t0;
478 ((*htilde)->data->data)[
i] = amp0 * aPhenomC * cos(phPhenomC);
479 ((*htilde)->data->data)[
i] += -I * amp0 * aPhenomC * sin(phPhenomC);
498 const REAL8 distance,
546 const REAL8 totalMass = m1 + m2;
547 const REAL8 eta = m1 * m2 / (totalMass * totalMass);
565 const REAL8 totalMass = m1 + m2;
566 const REAL8 eta = m1 * m2 / (totalMass * totalMass);
571 if (temp_f_min < 0.5) temp_f_min = 0.5;
572 if (temp_f_min > fISCO/2.) temp_f_min = fISCO/2.;
583 if (temp_f_max > 2. /
deltaT - 100.) temp_f_max = 2. /
deltaT - 100.;
596 const size_t nt = 2 * (nf - 1);
604 const REAL8 winFLo = 0.2*f_min_wide + 0.8*
f_min;
607 REAL8 winFHi = f_max_wide;
609 REAL8FFTPlan *revPlan;
621 FDdata[k] *= softWin;
644 TDdata = (*signalTD)->data->data;
645 for (k = windowLength; k--;)
646 TDdata[nt-k-1] *= k / windowLength;
656 size_t target_ind = 0;
660 for (; k > 0 ; k--) {
683 size_t peak_ind = -1;
684 REAL8 peak_amp_sq = 0.;
687 const REAL8 amp_sq = hpdata[k] * hpdata[k] + hcdata[k] * hcdata[k];
688 if (amp_sq > peak_amp_sq) {
690 peak_amp_sq = amp_sq;
700 const double cs = cos(shift);
701 const double ss = sin(shift);
704 const REAL8 temp_hpdata = hpdata[k] * cs - hcdata[k] * ss;
705 hcdata[k] = hpdata[k] * ss + hcdata[k] * cs;
706 hpdata[k] = temp_hpdata;
712 REAL8 inclFacPlus, inclFacCross;
717 inclFacCross = cos(inclination);
718 inclFacPlus = 0.5 * (1. + inclFacCross * inclFacCross);
720 hpdata[k] *= inclFacPlus;
721 hcdata[k] *= inclFacCross;
737 taper = 1. / (exp((t2 - t1)/(t - t1) + (t2 - t1)/(t - t2)) + 1.);
static REAL8 ComputeTau0(const REAL8 m1, const REAL8 m2, const REAL8 f_min)
static REAL8 EstimateSafeFMinForTD(const REAL8 m1, const REAL8 m2, const REAL8 f_min, const REAL8 deltaT)
static size_t find_peak_amp(const REAL8TimeSeries *hp, const REAL8TimeSeries *hc)
static int IMRPhenomCGenerateFD(COMPLEX16FrequencySeries **htilde, const REAL8 phi0, const REAL8 deltaF, const REAL8 m1, const REAL8 m2, const REAL8 f_min, const REAL8 f_max, const REAL8 distance, const BBHPhenomCParams *params)
static REAL8 PlanckTaper(const REAL8 t, const REAL8 t1, const REAL8 t2)
static int apply_phase_shift(const REAL8TimeSeries *hp, const REAL8TimeSeries *hc, const REAL8 shift)
static int IMRPhenomCGenerateFDForTD(COMPLEX16FrequencySeries **htilde, const REAL8 t0, const REAL8 phi0, const REAL8 deltaF, const REAL8 m1, const REAL8 m2, const REAL8 f_min, const REAL8 f_max, const REAL8 distance, const BBHPhenomCParams *params, const size_t nf)
static int IMRPhenomCGenerateTD(REAL8TimeSeries **h, const REAL8 phiPeak, size_t *ind_t0, const REAL8 deltaT, const REAL8 m1, const REAL8 m2, const REAL8 f_min, const REAL8 f_max, const REAL8 distance, const BBHPhenomCParams *params)
static int FDToTD(REAL8TimeSeries **signalTD, const COMPLEX16FrequencySeries *signalFD, const REAL8 totalMass, const REAL8 deltaT, const REAL8 f_min, const REAL8 f_max, const REAL8 f_min_wide, const REAL8 f_max_wide)
static size_t find_instant_freq(const REAL8TimeSeries *hp, const REAL8TimeSeries *hc, const REAL8 target, const size_t start)
static int apply_inclination(const REAL8TimeSeries *hp, const REAL8TimeSeries *hc, const REAL8 inclination)
static size_t EstimateIMRLength(const REAL8 m1, const REAL8 m2, const REAL8 f_min, const REAL8 deltaT)
static REAL8 EstimateSafeFMaxForTD(const REAL8 f_max, const REAL8 dt)
static size_t NextPow2_PC(const size_t n)
static int IMRPhenomCGenerateAmpPhase(REAL8 *amplitude, REAL8 *phasing, REAL8 f, REAL8 eta, const BBHPhenomCParams *params)
static BBHPhenomCParams * ComputeIMRPhenomCParams(const REAL8 m1, const REAL8 m2, const REAL8 chi, LALDict *extraParams)
COMPLEX16FrequencySeries * XLALResizeCOMPLEX16FrequencySeries(COMPLEX16FrequencySeries *series, int first, size_t length)
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)
int XLALSimIMRPhenomCGenerateTD(REAL8TimeSeries **hplus, REAL8TimeSeries **hcross, const REAL8 phiPeak, const REAL8 deltaT, const REAL8 m1_SI, const REAL8 m2_SI, const REAL8 chi, const REAL8 f_min, const REAL8 f_max, const REAL8 distance, const REAL8 inclination, LALDict *extraParams)
Driver routine to compute the spin-aligned, inspiral-merger-ringdown phenomenological waveform IMRPhe...
int XLALSimIMRPhenomCGenerateFD(COMPLEX16FrequencySeries **htilde, const REAL8 phi0, const REAL8 deltaF, const REAL8 m1_SI, const REAL8 m2_SI, const REAL8 chi, const REAL8 f_min, const REAL8 f_max, const REAL8 distance, LALDict *extraParams)
Driver routine to compute the spin-aligned, inspiral-merger-ringdown phenomenological waveform IMRPhe...
double XLALSimIMRPhenomCGetFinalFreq(const REAL8 m1, const REAL8 m2, const REAL8 chi)
Convenience function to quickly find the default final frequency.
void XLALDestroyREAL8FFTPlan(REAL8FFTPlan *plan)
REAL8FFTPlan * XLALCreateReverseREAL8FFTPlan(UINT4 size, int measurelvl)
int XLALREAL8FreqTimeFFT(REAL8TimeSeries *tser, const COMPLEX16FrequencySeries *freq, const REAL8FFTPlan *plan)
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 XLALDestroyREAL8TimeSeries(REAL8TimeSeries *series)
const LALUnit lalStrainUnit
const LALUnit lalSecondUnit
LALUnit * XLALUnitMultiply(LALUnit *output, const LALUnit *unit1, const LALUnit *unit2)
#define XLAL_PRINT_INFO(...)
#define XLAL_PRINT_WARNING(...)
LIGOTimeGPS * XLALGPSAdd(LIGOTimeGPS *epoch, REAL8 dt)
LIGOTimeGPS * XLALGPSSetREAL8(LIGOTimeGPS *epoch, REAL8 t)