23 #define UNUSED __attribute__ ((unused))
39 #include <gsl/gsl_errno.h>
40 #include <gsl/gsl_chebyshev.h>
42 #include <lal/Units.h>
43 #include <lal/SeqFactories.h>
44 #include <lal/LALConstants.h>
45 #include <lal/XLALError.h>
46 #include <lal/FrequencySeries.h>
48 #include <lal/StringInput.h>
49 #include <lal/Sequence.h>
50 #include <lal/LALStdio.h>
51 #include <lal/FileIO.h>
53 #include <lal/LALSimInspiral.h>
54 #include <lal/LALSimIMR.h>
56 #include <gsl/gsl_bspline.h>
57 #include <gsl/gsl_spline.h>
61 #include <lal/LALConfig.h>
62 #ifdef LAL_PTHREAD_LOCK
77 #ifdef LAL_PTHREAD_LOCK
78 static pthread_once_t TEOBResumROM_is_initialized = PTHREAD_ONCE_INIT;
86 typedef struct tagTEOBResumROMdataDS_coeff
110 TEOBResumROMdataDS_submodel*
sub1;
111 TEOBResumROMdataDS_submodel*
sub2;
112 TEOBResumROMdataDS_submodel*
sub3;
118 typedef int (*
load_dataPtr)(
const char*, gsl_vector *, gsl_vector *, gsl_matrix *, gsl_matrix *, gsl_vector *);
130 TEOBResumROMdataDS_submodel **submodel,
137 const double *params_min,
138 const double *params_max,
152 gsl_vector *cvec_amp,
153 gsl_vector *cvec_phi,
156 const double xyz_min[],
157 const double xyz_max[],
158 gsl_vector *interp_amp,
159 gsl_vector *interp_phi);
177 static int load_data_romeos(
const char dir[], gsl_vector *cvec_amp, gsl_vector *cvec_phi, gsl_matrix *Bamp, gsl_matrix *Bphi, gsl_vector *times);
209 static int load_data_romeos(
const char dir[], gsl_vector *cvec_amp, gsl_vector *cvec_phi, gsl_matrix *Bamp, gsl_matrix *Bphi, gsl_vector *times) {
211 ret |=
read_vector(dir,
"TEOBResumROM_Amp_ciall.dat", cvec_amp);
212 ret |=
read_vector(dir,
"TEOBResumROM_Phase_ciall.dat", cvec_phi);
213 ret |=
read_matrix(dir,
"TEOBResumROM_Bamp_matrix.dat", Bamp);
214 ret |=
read_matrix(dir,
"TEOBResumROM_Bphase_matrix.dat", Bphi);
215 ret |=
read_vector(dir,
"TEOBResumROM_times.dat", times);
221 TEOBResumROMdataDS_submodel **submodel,
228 const double *params_min,
229 const double *params_max,
235 if(!submodel) exit(1);
238 *submodel =
XLALCalloc(1,
sizeof(TEOBResumROMdataDS_submodel));
245 (*submodel)->cvec_amp = gsl_vector_alloc(
N*n_amp);
246 (*submodel)->cvec_phi = gsl_vector_alloc(
N*n_phi);
247 (*submodel)->Bamp = gsl_matrix_alloc(n_amp, ntimes);
248 (*submodel)->Bphi = gsl_matrix_alloc(n_phi, ntimes);
249 (*submodel)->times = gsl_vector_alloc(ntimes);
252 ret=
load_data(dir, (*submodel)->cvec_amp, (*submodel)->cvec_phi, (*submodel)->Bamp, (*submodel)->Bphi, (*submodel)->times);
255 (*submodel)->n_amp = n_amp;
256 (*submodel)->n_phi = n_phi;
257 (*submodel)->nq = nq;
258 (*submodel)->nl1 = nl1;
259 (*submodel)->nl2 = nl2;
260 (*submodel)->ntimes = ntimes;
262 (*submodel)->params_min = params_min;
263 (*submodel)->params_max = params_max;
270 if(submodel->cvec_amp) gsl_vector_free(submodel->cvec_amp);
271 if(submodel->cvec_phi) gsl_vector_free(submodel->cvec_phi);
272 if(submodel->Bamp) gsl_matrix_free(submodel->Bamp);
273 if(submodel->Bphi) gsl_matrix_free(submodel->Bphi);
274 if(submodel->times) gsl_vector_free(submodel->times);
283 XLALPrintError(
"WARNING: You tried to setup the TEOBResumROM model that was already initialised. Ignoring\n");
290 ret =
TEOBResumROMdataDS_Init_submodel(&(romdata)->
sub1,
Gnamp,
Gnphase,
Gnq,
Gnlambda1,
Gnlambda2,
Gntimes,
Gparams_min,
Gparams_max, dir,
load_data);
305 (romdata)->
sub1 = NULL;
388 Tnx = 2.0*
x*
x - 1.0 ;
392 double d1=0.0,d2=0.0,
sv ;
396 d1 = 2.0*
x*d1 - d2 + 1.0 ;
398 for (k=n-1 ; k>=1 ; k--) {
416 double Tix=0.,Tjy=0.,Tkz=0.;
424 sum+=gsl_vector_get(c_ijk,index)*Tix*Tjy*Tkz;
442 gsl_vector *cvec_amp,
443 gsl_vector *cvec_phi,
446 const double xyz_min[],
447 const double xyz_max[],
448 gsl_vector *interp_amp,
449 gsl_vector *interp_phi)
456 double xrescale = (
q-0.5*(xyz_max[0]+xyz_min[0])) / (0.5*(xyz_max[0]-xyz_min[0]));
457 double yrescale = (lambda1-0.5*(xyz_max[1]+xyz_min[1])) / (0.5*(xyz_max[1]-xyz_min[1]));
458 double zrescale = (lambda2-0.5*(xyz_max[2]+xyz_min[2])) / (0.5*(xyz_max[2]-xyz_min[2]));
461 for (k=0; k<
nk_amp; k++) {
462 gsl_vector v = gsl_vector_subvector(cvec_amp, k*
N,
N).vector;
465 gsl_vector_set(interp_amp, k,
sum);
469 for (k=0; k<
nk_phi; k++) {
470 gsl_vector v = gsl_vector_subvector(cvec_phi, k*
N,
N).vector;
473 gsl_vector_set(interp_phi, k,
sum);
496 inclination = inclination + phiRef - phiRef ;
499 if(!hPlus || !hCross)
502 if(*hPlus || *hCross)
504 XLALPrintError(
"(*hPlus) and (*hCross) are supposed to be NULL, but got %p and %p",(*hPlus),(*hCross));
513 TEOBResumROMdataDS_submodel *submodel;
514 submodel = romdata->sub1;
516 double x = sqrt(1.0-4.0*eta) ;
517 double q = (1-
x)/(1+
x);
520 gsl_vector *amp_at_nodes = gsl_vector_alloc(submodel->times->size);
521 gsl_vector *phi_at_nodes = gsl_vector_alloc(submodel->times->size);
523 double *amp_interp = calloc(
Gntimes,
sizeof(
double));
524 double *phi_interp = calloc(
Gntimes,
sizeof(
double));
525 double *freqs = calloc(
Gntimes,
sizeof(
double));
526 double *physical_times = calloc(
Gntimes,
sizeof(
double));
531 submodel->cvec_amp,submodel->cvec_phi,
533 amp_at_nodes,phi_at_nodes);
544 for (j=0;j<
Gnamp;j++){
545 BjAmp_tn+=gsl_vector_get(amp_at_nodes,j)*gsl_matrix_get(submodel->Bamp,j,n);
548 BjPhi_tn+=gsl_vector_get(phi_at_nodes,j)*gsl_matrix_get(submodel->Bphi,j,n);
551 physical_times[n]=gsl_vector_get(submodel->times,n)*time_to_phys;
552 amp_interp[n]=BjAmp_tn;
553 phi_interp[n]=BjPhi_tn;
559 gsl_interp_accel *acc_amp = gsl_interp_accel_alloc();
560 gsl_interp_accel *acc_phi = gsl_interp_accel_alloc();
561 gsl_interp_accel *acc_fot = gsl_interp_accel_alloc();
562 gsl_spline *ampoft_spline = gsl_spline_alloc (gsl_interp_cspline,
Gntimes);
563 gsl_spline *phioft_spline = gsl_spline_alloc (gsl_interp_cspline,
Gntimes);
566 gsl_spline_init(ampoft_spline, physical_times, amp_interp,
Gntimes);
567 gsl_spline_init(phioft_spline, physical_times, phi_interp,
Gntimes);
573 der = gsl_spline_eval_deriv (phioft_spline, physical_times[n], acc_phi);
574 freqs[n] = 0.5*der/
LAL_PI;
576 if (n > 0 && i_end_mono ==
Gntimes) {
577 if (freqs[n] < freqs[n-1]) i_end_mono = n ;
582 double physical_times_end = physical_times[
Gntimes-1];
584 if ( (freqs =
XLALRealloc ( freqs, i_end_mono*
sizeof( *freqs ) )) == NULL ) {
585 XLALPrintError (
"%s: XLALRealloc(%d) failed!\n", __func__, i_end_mono );
588 if ( (physical_times =
XLALRealloc ( physical_times, i_end_mono*
sizeof( *physical_times ) )) == NULL ) {
589 XLALPrintError (
"%s: XLALRealloc(%d) failed!\n", __func__, i_end_mono );
593 gsl_spline *toffreq_spline = gsl_spline_alloc (gsl_interp_cspline, i_end_mono);
594 gsl_spline_init(toffreq_spline, freqs, physical_times, i_end_mono);
597 double tstart = gsl_spline_eval(toffreq_spline, fLow, acc_fot);
598 int Ntimes_res = (int) ceil((physical_times_end-
tstart)/
deltaT);
599 double *times_res = calloc(Ntimes_res,
sizeof(
double));
600 double *amp_res = calloc(Ntimes_res,
sizeof(
double));
601 double *phi_res = calloc(Ntimes_res,
sizeof(
double));
607 double h22_to_h = 4.0*eta*sqrt(5.0/
LAL_PI)/8.0;
611 double cosi = cos(inclination);
612 double inc_plus = (1.0+cosi*cosi)/2.0;
613 double inc_cross = cosi;
632 amp_res[0] = gsl_spline_eval(ampoft_spline, t, acc_amp)*amp_units*h22_to_h;
633 double phi0 = gsl_spline_eval(phioft_spline, t, acc_phi);
635 hp->
data->
data[0] = inc_plus*amp_res[0]*cos(phi_res[0]);
636 hc->
data->
data[0] = inc_cross*amp_res[0]*sin(phi_res[0]);
638 for (n=1;n<Ntimes_res;n++) {
640 amp_res[n] = gsl_spline_eval(ampoft_spline, t, acc_amp)*amp_units*h22_to_h;
642 phi_res[n] = gsl_spline_eval(phioft_spline, t, acc_phi)-phi0;
644 hp->
data->
data[n] = inc_plus*amp_res[n]*cos(phi_res[n]);
645 hc->
data->
data[n] = inc_cross*amp_res[n]*sin(phi_res[n]);
653 gsl_spline_free (ampoft_spline);
654 gsl_spline_free (phioft_spline);
655 gsl_spline_free (toffreq_spline);
656 gsl_interp_accel_free (acc_amp);
657 gsl_interp_accel_free (acc_phi);
658 gsl_interp_accel_free (acc_fot);
660 gsl_vector_free(amp_at_nodes);
661 gsl_vector_free(phi_at_nodes);
666 free(physical_times);
729 double m1temp = m1SI;
730 double l1temp = lambda1;
740 double Mtot = mass1+mass2;
741 double eta = mass1 * mass2 / (Mtot*Mtot);
743 double x = sqrt(1.0-4.0*eta) ;
744 double q = (1-
x)/(1+
x);
769 #ifdef LAL_PTHREAD_LOCK
777 int retcode =
TEOBResumROMCore(hPlus,hCross, phiRef,
deltaT, fLow, distance, inclination, Mtot, eta, lambda1, lambda2);
792 char datafile[] =
"TEOBResumROM_Phase_ciall.dat";
797 char *dir = dirname(
path);
static void nudge(REAL8 *x, REAL8 X, REAL8 epsilon)
Auxiliary functions for SEOBNRv1/v2 reduced order modeling codes in LALSimIMRSEOBNRv2ROMDoubleSpin....
static UNUSED int read_vector(const char dir[], const char fname[], gsl_vector *v)
static UNUSED int read_matrix(const char dir[], const char fname[], gsl_matrix *m)
static int load_data(const char dir[], gsl_vector *cvec_amp, gsl_vector *cvec_phi, gsl_matrix *Bamp, gsl_matrix *Bphi, gsl_vector *cvec_amp_pre)
static int chebyshev_interpolation3d(double q, double lambda1, double lambda2, int nx, int ny, int nz, gsl_vector *cvec_amp, gsl_vector *cvec_phi, int nk_amp, int nk_phi, const double xyz_min[], const double xyz_max[], gsl_vector *interp_amp, gsl_vector *interp_phi)
static double gsl_cheb_evaluate_polynomial(int n, double x)
int(* load_dataPtr)(const char *, gsl_vector *, gsl_vector *, gsl_matrix *, gsl_matrix *, gsl_vector *)
static int TEOBResumROMdataDS_Init_submodel(TEOBResumROMdataDS_submodel **submodel, const int n_amp, const int n_phi, const int nq, const int nl1, const int nl2, const int ntimes, const double *params_min, const double *params_max, const char dir[], load_dataPtr load_data)
static void TEOBResumROM_Init_LALDATA(void)
Setup TEOBResum_ROM model using data files installed in $LAL_DATA_PATH.
static double gsl_cheb_eval_3d(gsl_vector *c_ijk, int nx, int ny, int nz, double x, double y, double z)
static int TEOBResumROMdataDS_Init(TEOBResumROMdataDS *romdata, const char dir[])
static const double Gparams_max[]
static const double Gparams_min[]
static int TEOBResumROM_Init(const char dir[])
Setup SEOBNRv2ROMDoubleSpin model using data files installed in dir.
static int TEOBResumROMCore(REAL8TimeSeries **hPlus, REAL8TimeSeries **hCross, double phiRef, double deltaT, double fLow, double distance, double inclination, double Mtot_sec, double eta, double lambda1, double lambda2)
static int load_data_romeos(const char dir[], gsl_vector *cvec_amp, gsl_vector *cvec_phi, gsl_matrix *Bamp, gsl_matrix *Bphi, gsl_vector *times)
static void TEOBResumROMdataDS_Cleanup(TEOBResumROMdataDS *romdata)
static TEOBResumROMdataDS __lalsim_TEOBResumROMDS_data
static bool TEOBResumROM_IsSetup(void)
Helper function to check if the SEOBNRv2ROMDoubleSpin model has been initialised.
int XLALSimInspiralTEOBResumROM(REAL8TimeSeries **hPlus, REAL8TimeSeries **hCross, REAL8 phiRef, REAL8 deltaT, REAL8 fLow, UNUSED REAL8 fRef, REAL8 distance, REAL8 inclination, REAL8 m1SI, REAL8 m2SI, REAL8 lambda1, REAL8 lambda2)
static void TEOBResumROMdataDS_Cleanup_submodel(TEOBResumROMdataDS_submodel *submodel)
static REAL8 sum(REAL8 *arr1, REAL8 *arr2, int k)
#define XLAL_FILE_RESOLVE_PATH(fname)
void * XLALCalloc(size_t m, size_t n)
void * XLALRealloc(void *p, size_t n)
REAL8TimeSeries * XLALCreateREAL8TimeSeries(const CHAR *name, const LIGOTimeGPS *epoch, REAL8 f0, REAL8 deltaT, const LALUnit *sampleUnits, size_t length)
const LALUnit lalStrainUnit
#define XLAL_ERROR_VOID(...)
int int int XLALPrintInfo(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
LIGOTimeGPS * XLALGPSAdd(LIGOTimeGPS *epoch, REAL8 dt)
int pthread_once(pthread_once_t *once_control, void(*init_routine)(void))
const double * params_min
const double * params_max
TEOBResumROMdataDS_submodel * sub1
TEOBResumROMdataDS_submodel * sub2
TEOBResumROMdataDS_submodel * sub3