43 #define UNUSED __attribute__ ((unused))
58 #include <gsl/gsl_errno.h>
59 #include <gsl/gsl_bspline.h>
60 #include <gsl/gsl_blas.h>
61 #include <gsl/gsl_min.h>
62 #include <gsl/gsl_spline.h>
63 #include <gsl/gsl_poly.h>
64 #include <lal/Units.h>
65 #include <lal/SeqFactories.h>
66 #include <lal/LALConstants.h>
67 #include <lal/XLALError.h>
68 #include <lal/FrequencySeries.h>
70 #include <lal/StringInput.h>
71 #include <lal/Sequence.h>
72 #include <lal/LALStdio.h>
73 #include <lal/FileIO.h>
75 #include <lal/LALSimInspiral.h>
76 #include <lal/LALSimIMR.h>
77 #include <lal/SphericalHarmonics.h>
91 #define EOBNRV2_ROM_NUM_MODES_MAX 5
155 return 1 << (size_t) ceil(log2(n));
160 return 1.-1./4.*exp(-(
q-1.)/5.);
163 return 1.-1./3.*exp(-(
q-1.)/5.);
168 return q/(1.+
q)/(1.+
q);
172 return( (
q-1.)/(
q+1.) );
178 return 0.2733 + 0.2316*eta + 0.4463*eta*eta;
184 if(
l==2 &&
m==2 )
return(sqrt(eta));
185 else if(
l==2 &&
m==1 )
return( sqrt(eta)*
DeltaOfq(
q) );
186 else if(
l==3 &&
m==3 )
return( sqrt(eta)*
DeltaOfq(
q) );
187 else if(
l==4 &&
m==4 )
return( sqrt(
Scaling44(
q))*sqrt(eta)*(1.-3.*eta) );
190 fprintf(stderr,
"Unknown mode (%d,%d) for the amplitude factor.\n",
l,
m);
200 gsl_interp_accel* accel;
201 gsl_vector* matrixline;
207 for (j = 0; j<
nk_amp; j++) {
208 matrixline = gsl_vector_alloc(
nbwf);
209 gsl_matrix_get_row(matrixline,
data->Camp, j);
211 accel = gsl_interp_accel_alloc();
212 spline = gsl_spline_alloc(gsl_interp_cspline,
nbwf);
213 gsl_spline_init(spline, gsl_vector_const_ptr(
data->q, 0), gsl_vector_const_ptr(matrixline, 0),
nbwf);
216 gsl_vector_free(matrixline);
222 for (j = 0; j<
nk_phi; j++) {
223 matrixline = gsl_vector_alloc(
nbwf);
224 gsl_matrix_get_row(matrixline,
data->Cphi, j);
226 accel = gsl_interp_accel_alloc();
227 spline = gsl_spline_alloc(gsl_interp_cspline,
nbwf);
228 gsl_spline_init(spline, gsl_vector_const_ptr(
data->q, 0), gsl_vector_const_ptr(matrixline, 0),
nbwf);
231 gsl_vector_free(matrixline);
239 accel = gsl_interp_accel_alloc();
240 spline = gsl_spline_alloc(gsl_interp_cspline,
nbwf);
241 gsl_spline_init(spline, gsl_vector_const_ptr(
data->q, 0), gsl_vector_const_ptr(
vector, 0),
nbwf);
250 accel = gsl_interp_accel_alloc();
251 spline = gsl_spline_alloc(gsl_interp_cspline,
nbwf);
252 gsl_spline_init(spline, gsl_vector_const_ptr(
data->q, 0), gsl_vector_const_ptr(
vector, 0),
nbwf);
268 for (j=0; j<
nk_amp; j++) {
273 for (j=0; j<
nk_phi; j++) {
309 double tpeak22estimate = 0.;
312 if(*hptilde || *hctilde)
314 XLALPrintError(
"(*hptilde) and (*hctilde) are supposed to be NULL, but got %p and %p\n",(*hptilde),(*hctilde));
337 REAL8 fLow_geom = fLow * Mtot_sec;
338 REAL8 fHigh_geom = fHigh * Mtot_sec;
339 REAL8 fRef_geom = fRef * Mtot_sec;
340 REAL8 deltaF_geom = deltaF * Mtot_sec;
344 XLALPrintWarning(
"Starting frequency Mflow=%g is smaller than lowest frequency in ROM Mf=%g. Starting at lowest frequency in ROM.\n", fLow_geom,
Mf_ROM_min);
351 if (fRef_geom > Mf_ROM_max_ref || fRef_geom == 0)
352 fRef_geom = Mf_ROM_max_ref;
353 if (0 < fRef_geom && fRef_geom <
Mf_ROM_min) {
354 XLALPrintWarning(
"Reference frequency Mf_ref=%g is smaller than lowest frequency in ROM Mf=%g. Setting it to the lowest frequency in ROM.\n", fLow_geom,
Mf_ROM_min);
358 size_t nbpt =
NextPow2(fHigh_geom / deltaF_geom) + 1;
366 *hlmsphharmfreqseries = NULL;
373 REAL8 phase_change_ref = 0;
391 gsl_vector* amp_f = gsl_vector_alloc(
nbfreq);
392 gsl_vector* phi_f = gsl_vector_alloc(
nbfreq);
393 gsl_blas_dgemv(CblasNoTrans, 1.0, listdata_mode->
data->
Bamp, data_coeff->
Camp_coeff, 0.0, amp_f);
394 gsl_blas_dgemv(CblasNoTrans, 1.0, listdata_mode->
data->
Bphi, data_coeff->
Cphi_coeff, 0.0, phi_f);
397 gsl_vector* freq_ds = gsl_vector_alloc(
nbfreq);
398 gsl_vector_memcpy(freq_ds, listdata_mode->
data->
freq);
399 if (
l==4 &&
m==4) gsl_vector_scale( freq_ds, 1./
Scaling44(
q));
400 if (
l==5 &&
m==5) gsl_vector_scale( freq_ds, 1./
Scaling55(
q));
406 REAL8 twopishifttime;
408 twopishifttime = gsl_spline_eval(shifttime_splinelist->
spline,
q, shifttime_splinelist->
accel) *
Scaling44(
q);
410 else if(
l==5 &&
m==5) {
411 twopishifttime = gsl_spline_eval(shifttime_splinelist->
spline,
q, shifttime_splinelist->
accel) *
Scaling55(
q);
414 twopishifttime = gsl_spline_eval(shifttime_splinelist->
spline,
q, shifttime_splinelist->
accel);
416 REAL8 shiftphase = gsl_spline_eval(shiftphase_splinelist->
spline,
q, shiftphase_splinelist->
accel);
422 gsl_interp_accel* accel_phi22 = gsl_interp_accel_alloc();
423 gsl_spline* spline_phi22 = gsl_spline_alloc(gsl_interp_cspline,
nbfreq);
424 gsl_spline_init(spline_phi22, gsl_vector_const_ptr(freq_ds,0), gsl_vector_const_ptr(phi_f,0),
nbfreq);
429 tpeak22estimate = -1./(2*
LAL_PI) * gsl_spline_eval_deriv(spline_phi22, f22peak, accel_phi22);
431 phase_change_ref = 2*phiRef + (gsl_spline_eval(spline_phi22, fRef_geom, accel_phi22) - (twopishifttime - 2*
LAL_PI*tpeak22estimate) * fRef_geom - shiftphase);
433 gsl_spline_free(spline_phi22);
434 gsl_interp_accel_free(accel_phi22);
437 XLALPrintError(
"Error: the first mode in listmode must be the 22 mode to set the changes in phase and time \n");
442 double totaltwopishifttime = twopishifttime - 2*
LAL_PI*tpeak22estimate;
443 double constphaseshift = (double)
m/
listmode[0][1] * phase_change_ref + shiftphase;
449 gsl_interp_accel* accel_phi = gsl_interp_accel_alloc();
450 gsl_interp_accel* accel_amp = gsl_interp_accel_alloc();
451 gsl_spline* spline_phi = gsl_spline_alloc(gsl_interp_cspline,
nbfreq);
452 gsl_spline* spline_amp = gsl_spline_alloc(gsl_interp_cspline,
nbfreq);
453 gsl_spline_init(spline_phi, gsl_vector_const_ptr(freq_ds,0), gsl_vector_const_ptr(phi_f,0),
nbfreq);
454 gsl_spline_init(spline_amp, gsl_vector_const_ptr(freq_ds,0), gsl_vector_const_ptr(amp_f,0),
nbfreq);
456 REAL8 fLow_geom_mode = gsl_vector_get(freq_ds, 0);
457 REAL8 fHigh_geom_mode = fmin(gsl_vector_get(freq_ds,
nbfreq-1), fHigh_geom);
459 INT4 jStart = (
UINT4) ceil(fLow_geom_mode / deltaF_geom);
460 INT4 jStop = (
UINT4) ceil(fHigh_geom_mode / deltaF_geom);
468 f = fmax(fLow_geom_mode, jStart*deltaF_geom);
469 A = gsl_spline_eval(spline_amp, f, accel_amp);
470 phase = -gsl_spline_eval(spline_phi, f, accel_phi) + totaltwopishifttime * f + constphaseshift;
471 modedata[jStart] = amp_pre * A * cexp(I*phase);
473 for (j=jStart+1; j<jStop-1; j++) {
475 A = gsl_spline_eval(spline_amp, f, accel_amp);
476 phase = -gsl_spline_eval(spline_phi, f, accel_phi) + totaltwopishifttime * f + constphaseshift;
477 modedata[j] = amp_pre * A * cexp(I*phase);
480 f = fmin(fHigh_geom_mode, (jStop-1)*deltaF_geom);
481 A = gsl_spline_eval(spline_amp, f, accel_amp);
482 phase = -gsl_spline_eval(spline_phi, f, accel_phi) + totaltwopishifttime * f + constphaseshift;
483 modedata[jStop-1] = amp_pre * A * cexp(I*phase);
489 gsl_spline_free(spline_amp);
490 gsl_spline_free(spline_phi);
491 gsl_interp_accel_free(accel_amp);
492 gsl_interp_accel_free(accel_phi);
493 gsl_vector_free(amp_f);
494 gsl_vector_free(phi_f);
495 gsl_vector_free(freq_ds);
508 memset((*hptilde)->data->data, 0, nbpt *
sizeof(
COMPLEX16));
509 memset((*hctilde)->data->data, 0, nbpt *
sizeof(
COMPLEX16));
523 FDAddMode( *hptilde, *hctilde, mode, inclination, 0.,
l,
m, sym);
531 COMPLEX16* datap = (*hptilde)->data->data;
532 COMPLEX16* datac = (*hctilde)->data->data;
533 for ( j = 0; j < (
INT4) (*hptilde)->data->length; ++j ) {
534 datap[j] = conj(datap[j]);
536 for ( j = 0; j < (
INT4) (*hctilde)->data->length; ++j ) {
537 datac[j] = conj(datac[j]);
551 envpath=getenv(
"LAL_DATA_PATH");
553 XLALPrintError(
"XLAL Error: the environment variable LAL_DATA_PATH, giving the path to the ROM data, seems undefined\n");
556 strncpy(
path,envpath,
sizeof(
path)-1);
558 for(word=strtok_r(
path,
":",&brkt); word; word=strtok_r(NULL,
":",&brkt))
564 XLALPrintError(
"Unable to find EOBNRv2HMROM data files in $LAL_DATA_PATH\n");
611 struct tagCOMPLEX16FrequencySeries **hptilde,
612 struct tagCOMPLEX16FrequencySeries **hctilde,
622 const int higherModesFlag)
626 if ( higherModesFlag == 0 )
630 else if ( higherModesFlag == 1 )
637 "(expected 0 or 1, but got %d\n)", higherModesFlag );
644 REAL8 Mtot = mass1 + mass2;
645 REAL8 q = fmax(mass1/mass2, mass2/mass1);
649 XLALPrintError(
"XLAL Error - %s: q out of range!\nEOBNRv2HMROM is only available for a mass ratio in the range q <= %g.\n", __func__,
q_max);
658 phiRef, deltaF, fLow, fHigh, fRef, distance, inclination, Mtot_sec,
q);
static ListmodesEOBNRHMROMdata **const __lalsim_EOBNRv2HMROM_data
static INT4 EOBNRv2HMROM_Init(const char dir[])
static REAL8 EtaOfq(const REAL8 q)
static INT4 __lalsim_EOBNRv2HMROM_setup
static REAL8 DeltaOfq(const REAL8 q)
static double omega22peakOfq(const double q)
static INT4 Evaluate_Spline_Data(const REAL8 q, const EOBNRHMROMdata_interp *data_interp, EOBNRHMROMdata_coeff *data_coeff)
static const REAL8 Mf_ROM_max
static INT4 Interpolate_Spline_Data(const EOBNRHMROMdata *data, EOBNRHMROMdata_interp *data_interp)
static ListmodesEOBNRHMROMdata_interp **const __lalsim_EOBNRv2HMROM_interp
static INT4 EOBNRv2HMROMCore(COMPLEX16FrequencySeries **hptilde, COMPLEX16FrequencySeries **hctilde, REAL8 phiRef, REAL8 deltaF, REAL8 fLow, REAL8 fHigh, REAL8 fRef, REAL8 distance, REAL8 inclination, REAL8 Mtot_sec, REAL8 q)
static const INT4 listmode[EOBNRV2_ROM_NUM_MODES_MAX][2]
static REAL8 Scaling55(const REAL8 q)
static ListmodesEOBNRHMROMdata_interp * __lalsim_EOBNRv2HMROM_interp_init
static REAL8 ModeAmpFactor(const INT4 l, const INT4 m, const REAL8 q)
#define EOBNRV2_ROM_NUM_MODES_MAX
static ListmodesEOBNRHMROMdata * __lalsim_EOBNRv2HMROM_data_init
static REAL8 Scaling44(const REAL8 q)
static size_t NextPow2(const size_t n)
static const REAL8 Mf_ROM_min
INT4 XLALSimIMREOBNRv2HMROM(struct tagCOMPLEX16FrequencySeries **hptilde, struct tagCOMPLEX16FrequencySeries **hctilde, REAL8 phiRef, REAL8 deltaF, REAL8 fLow, REAL8 fHigh, REAL8 fRef, REAL8 distance, REAL8 inclination, REAL8 m1SI, REAL8 m2SI, const int higherModesFlag)
static INT4 EOBNRv2HMROM_Init_LALDATA(void)
C code for structures EOBNRv2HM reduced order model (non-spinning version). See CQG 31 195010,...
static SplineList * SplineList_GetElement(SplineList *const splinelist, const UINT4 i)
static void EOBNRHMROMdata_coeff_Init(EOBNRHMROMdata_coeff **data_coeff)
static ListmodesEOBNRHMROMdata * ListmodesEOBNRHMROMdata_GetMode(ListmodesEOBNRHMROMdata *const list, UINT4 l, INT4 m)
static ListmodesEOBNRHMROMdata_interp * ListmodesEOBNRHMROMdata_interp_AddModeNoCopy(ListmodesEOBNRHMROMdata_interp *appended, EOBNRHMROMdata_interp *data, UINT4 l, INT4 m)
static INT4 FDAddMode(COMPLEX16FrequencySeries *hptilde, COMPLEX16FrequencySeries *hctilde, COMPLEX16FrequencySeries *hlmtilde, REAL8 theta, REAL8 phi, INT4 l, INT4 m, INT4 sym)
static ListmodesEOBNRHMROMdata_interp * ListmodesEOBNRHMROMdata_interp_GetMode(ListmodesEOBNRHMROMdata_interp *const list, UINT4 l, INT4 m)
static INT4 Read_Data_Mode(const char dir[], const INT4 mode[2], EOBNRHMROMdata *data)
static void EOBNRHMROMdata_interp_Init(EOBNRHMROMdata_interp **data_interp)
static void EOBNRHMROMdata_Init(EOBNRHMROMdata **data)
static SplineList * SplineList_AddElementNoCopy(SplineList *appended, gsl_spline *spline, gsl_interp_accel *accel, UINT4 i)
static void EOBNRHMROMdata_coeff_Cleanup(EOBNRHMROMdata_coeff *data_coeff)
static ListmodesEOBNRHMROMdata * ListmodesEOBNRHMROMdata_AddModeNoCopy(ListmodesEOBNRHMROMdata *appended, EOBNRHMROMdata *indata, UINT4 l, INT4 m)
Auxiliary functions for SEOBNRv1/v2 reduced order modeling codes in LALSimIMRSEOBNRv2ROMDoubleSpin....
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)
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.
const LALUnit lalStrainUnit
const LALUnit lalSecondUnit
LALUnit * XLALUnitDivide(LALUnit *output, const LALUnit *unit1, const LALUnit *unit2)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
int int XLALPrintWarning(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
LIGOTimeGPS * XLALGPSAdd(LIGOTimeGPS *epoch, REAL8 dt)
double * shiftphase_coeff
SplineList * shifttime_interp
SplineList * shiftphase_interp
EOBNRHMROMdata_interp * data_interp