24 #define UNUSED __attribute__ ((unused))
40 #include <gsl/gsl_errno.h>
41 #include <gsl/gsl_bspline.h>
42 #include <gsl/gsl_blas.h>
43 #include <gsl/gsl_min.h>
44 #include <gsl/gsl_spline.h>
45 #include <gsl/gsl_poly.h>
46 #include <lal/Units.h>
47 #include <lal/SeqFactories.h>
48 #include <lal/LALConstants.h>
49 #include <lal/XLALError.h>
50 #include <lal/FrequencySeries.h>
52 #include <lal/StringInput.h>
53 #include <lal/Sequence.h>
54 #include <lal/LALStdio.h>
55 #include <lal/FileIO.h>
56 #include <lal/LALSimSphHarmMode.h>
57 #include <lal/LALDatatypes.h>
58 #include <lal/LALSimInspiral.h>
59 #include <lal/AVFactories.h>
60 #include <lal/SphericalHarmonics.h>
64 #define f_hyb_ini 0.003
65 #define f_hyb_end 0.004
67 #ifdef LAL_HDF5_ENABLED
68 #include <lal/H5FileIO.h>
69 static const char ROMDataHDF5[] =
"SEOBNRv4HMROM.hdf5";
70 static const INT4 ROMDataHDF5_VERSION_MAJOR = 1;
71 static const INT4 ROMDataHDF5_VERSION_MINOR = 0;
72 static const INT4 ROMDataHDF5_VERSION_MICRO = 0;
75 #include <lal/LALSimInspiral.h>
76 #include <lal/LALSimIMR.h>
80 #include <lal/LALConfig.h>
81 #ifdef LAL_PTHREAD_LOCK
87 #ifdef LAL_PTHREAD_LOCK
88 static pthread_once_t SEOBNRv4HMROM_is_initialized = PTHREAD_ONCE_INIT;
118 #define Mf_low_22 0.0004925491025543576
119 #define Mf_low_33 (Mf_low_22 * (3.0/2.0))
120 #define Mf_low_21 (Mf_low_22 * (1.0/2.0))
121 #define Mf_low_44 (Mf_low_22 * (4.0/2.0))
122 #define Mf_low_55 (Mf_low_22 * (5.0/2.0))
127 typedef struct tagSEOBNRROMdataDS_coeff
159 SEOBNRROMdataDS_submodel*
hqhs;
160 SEOBNRROMdataDS_submodel*
hqls;
161 SEOBNRROMdataDS_submodel*
lqhs;
162 SEOBNRROMdataDS_submodel*
lqls;
163 SEOBNRROMdataDS_submodel*
lowf;
169 typedef int (*
load_dataPtr)(
const char*, gsl_vector *, gsl_vector *, gsl_matrix *, gsl_matrix *, gsl_vector *);
171 typedef struct tagSplineData
173 gsl_bspline_workspace *bwx;
174 gsl_bspline_workspace *bwy;
175 gsl_bspline_workspace *bwz;
178 typedef struct tagAmpPhaseSplineData
196 UNUSED SEOBNRROMdataDS_submodel **submodel,
197 UNUSED
const char dir[],
198 UNUSED
const char grp_name[],
209 const double *chi1vec,
210 const double *chi2vec
240 UNUSED
static double GetModeAmpFactor(
double eta,
double delta,
double chi1,
double chi2,
int l,
int m,
double v);
277 static size_t NextPow2(
const size_t n);
303 const double *chi1vec,
304 const double *chi2vec,
320 REAL8* Deltaphi_align,
321 gsl_vector *phase_lo,
322 gsl_vector *phase_hi,
332 gsl_vector *phase_lo,
333 gsl_vector *phase_hi,
338 REAL8 Deltat_22_align,
339 REAL8 Deltaphi_22_align,
355 gsl_spline **hyb_spline,
364 gsl_spline **hyb_spline,
366 REAL8* Deltaphi_align,
369 gsl_vector *PN_phase,
375 gsl_spline **hyb_spline,
378 gsl_vector *PN_phase,
381 REAL8 Deltat_22_align,
382 REAL8 Deltaphi_22_align,
399 UNUSED
REAL8 distance,
400 UNUSED
REAL8 Mtot_sec,
422 *
x = gsl_vector_alloc(
s->size);
423 *
y = gsl_vector_alloc(
s->size);
424 for (
size_t i=0;
i <
s->size;
i++) {
425 gsl_vector_set(*
x,
i,
s->x[
i]);
426 gsl_vector_set(*
y,
i,
s->y[
i]);
443 #ifdef LAL_HDF5_ENABLED
444 #define datafile ROMDataHDF5
449 char *dir = dirname(
path);
456 files in $LAL_DATA_PATH for the mode = %d\n",
i);
481 const double *chi1vec,
482 const double *chi2vec
485 if(!splinedata) exit(1);
491 const size_t nbreak_x = ncx-2;
492 const size_t nbreak_y = ncy-2;
493 const size_t nbreak_z = ncz-2;
496 gsl_bspline_workspace *bwx = gsl_bspline_alloc(4, nbreak_x);
497 gsl_bspline_workspace *bwy = gsl_bspline_alloc(4, nbreak_y);
498 gsl_bspline_workspace *bwz = gsl_bspline_alloc(4, nbreak_z);
501 gsl_vector *breakpts_x = gsl_vector_alloc(nbreak_x);
502 gsl_vector *breakpts_y = gsl_vector_alloc(nbreak_y);
503 gsl_vector *breakpts_z = gsl_vector_alloc(nbreak_z);
505 gsl_vector_set(breakpts_x,
i, qvec[
i]);
506 for (
UINT4 j=0; j<nbreak_y; j++)
507 gsl_vector_set(breakpts_y, j, chi1vec[j]);
508 for (
UINT4 k=0; k<nbreak_z; k++)
509 gsl_vector_set(breakpts_z, k, chi2vec[k]);
511 gsl_bspline_knots(breakpts_x, bwx);
512 gsl_bspline_knots(breakpts_y, bwy);
513 gsl_bspline_knots(breakpts_z, bwz);
515 gsl_vector_free(breakpts_x);
516 gsl_vector_free(breakpts_y);
517 gsl_vector_free(breakpts_z);
519 (*splinedata)->bwx=bwx;
520 (*splinedata)->bwy=bwy;
521 (*splinedata)->bwz=bwz;
527 if(!splinedata)
return;
528 if(splinedata->
bwx) gsl_bspline_free(splinedata->
bwx);
529 if(splinedata->
bwy) gsl_bspline_free(splinedata->
bwy);
530 if(splinedata->
bwz) gsl_bspline_free(splinedata->
bwz);
544 for (
int i=0;
i<num_modes;
i++) {
552 if(!data_array)
return;
555 for (
int i=0;
i<num_modes;
i++) {
556 data = data_array[
i];
560 if (
data->spline_amp) gsl_spline_free(
data->spline_amp);
561 if (
data->spline_phi) gsl_spline_free(
data->spline_phi);
562 if (
data->acc_amp) gsl_interp_accel_free(
data->acc_amp);
563 if (
data->acc_phi) gsl_interp_accel_free(
data->acc_phi);
564 if (
data->f) gsl_vector_free(
data->f);
585 const double *chi1vec,
586 const double *chi2vec,
591 XLAL_ERROR(
XLAL_EDOM,
"Truncation parameter nk_max %d must be smaller or equal to nk %d\n", nk_max, nk);
600 gsl_bspline_workspace *bwx=splinedata->
bwx;
601 gsl_bspline_workspace *bwy=splinedata->
bwy;
602 gsl_bspline_workspace *bwz=splinedata->
bwz;
606 for (
int k=0; k<nk; k++) {
607 gsl_vector v = gsl_vector_subvector(cvec, k*
N,
N).vector;
609 gsl_vector_set(c_out, k, csum);
636 UNUSED SEOBNRROMdataDS *romdata,
637 UNUSED
const char dir[],
638 UNUSED
UINT4 index_mode)
644 XLALPrintError(
"WARNING: You tried to setup the SEOBNRv4HMROM model that was already initialised. Ignoring\n");
648 #ifdef LAL_HDF5_ENABLED
650 size_t size = strlen(dir) + strlen(ROMDataHDF5) + 2;
652 snprintf(
path, size,
"%s/%s", dir, ROMDataHDF5);
656 PrintInfoStringAttribute(
file,
"Email");
657 PrintInfoStringAttribute(
file,
"Description");
658 ret = ROM_check_version_number(
file, ROMDataHDF5_VERSION_MAJOR,
659 ROMDataHDF5_VERSION_MINOR,
660 ROMDataHDF5_VERSION_MICRO);
699 (romdata)->hqhs = NULL;
702 (romdata)->hqls = NULL;
705 (romdata)->lqhs = NULL;
708 (romdata)->lqls = NULL;
711 (romdata)->lowf = NULL;
717 if(submodel->cvec_real) gsl_vector_free(submodel->cvec_real);
718 if(submodel->cvec_imag) gsl_vector_free(submodel->cvec_imag);
719 if(submodel->cvec_phase) gsl_vector_free(submodel->cvec_phase);
720 if(submodel->Breal) gsl_matrix_free(submodel->Breal);
721 if(submodel->Bimag) gsl_matrix_free(submodel->Bimag);
722 if(submodel->Bphase) gsl_matrix_free(submodel->Bphase);
723 if(submodel->gCMode) gsl_vector_free(submodel->gCMode);
724 if(submodel->gPhase) gsl_vector_free(submodel->gPhase);
725 if(submodel->qvec) gsl_vector_free(submodel->qvec);
726 if(submodel->chi1vec) gsl_vector_free(submodel->chi1vec);
727 if(submodel->chi2vec) gsl_vector_free(submodel->chi2vec);
732 SEOBNRROMdataDS_submodel **submodel,
733 UNUSED
const char dir[],
734 UNUSED
const char grp_name[],
735 UNUSED
UINT4 index_mode
738 if(!submodel) exit(1);
741 *submodel =
XLALCalloc(1,
sizeof(SEOBNRROMdataDS_submodel));
745 #ifdef LAL_HDF5_ENABLED
746 size_t size = strlen(dir) + strlen(ROMDataHDF5) + 2;
748 snprintf(
path, size,
"%s/%s", dir, ROMDataHDF5);
757 ReadHDF5RealVectorDataset(sub, path_to_dataset, & (*submodel)->cvec_real);
758 free(path_to_dataset);
760 ReadHDF5RealVectorDataset(sub, path_to_dataset, & (*submodel)->cvec_imag);
761 free(path_to_dataset);
765 ReadHDF5RealVectorDataset(sub,
"phase_carrier/coeff_flattened", & (*submodel)->cvec_phase);
773 ReadHDF5RealMatrixDataset(sub, path_to_dataset, & (*submodel)->Breal);
774 free(path_to_dataset);
776 ReadHDF5RealMatrixDataset(sub, path_to_dataset, & (*submodel)->Bimag);
777 free(path_to_dataset);
781 ReadHDF5RealMatrixDataset(sub,
"phase_carrier/basis", & (*submodel)->Bphase);
787 ReadHDF5RealVectorDataset(sub, path_to_dataset, & (*submodel)->gCMode);
788 free(path_to_dataset);
792 ReadHDF5RealVectorDataset(sub,
"phase_carrier/MF_grid", & (*submodel)->gPhase);
795 ReadHDF5RealVectorDataset(sub,
"qvec", & (*submodel)->qvec);
796 ReadHDF5RealVectorDataset(sub,
"chi1vec", & (*submodel)->chi1vec);
797 ReadHDF5RealVectorDataset(sub,
"chi2vec", & (*submodel)->chi2vec);
801 (*submodel)->nk_cmode = (*submodel)->gCMode->size;
804 (*submodel)->nk_phase = (*submodel)->gPhase->size;
806 (*submodel)->ncx = (*submodel)->qvec->size + 2;
807 (*submodel)->ncy = (*submodel)->chi1vec->size + 2;
808 (*submodel)->ncz = (*submodel)->chi2vec->size + 2;
811 (*submodel)->q_bounds[0] = gsl_vector_get((*submodel)->qvec, 0);
812 (*submodel)->q_bounds[1] = gsl_vector_get((*submodel)->qvec, (*submodel)->qvec->size - 1);
813 (*submodel)->chi1_bounds[0] = gsl_vector_get((*submodel)->chi1vec, 0);
814 (*submodel)->chi1_bounds[1] = gsl_vector_get((*submodel)->chi1vec, (*submodel)->chi1vec->size - 1);
815 (*submodel)->chi2_bounds[0] = gsl_vector_get((*submodel)->chi2vec, 0);
816 (*submodel)->chi2_bounds[1] = gsl_vector_get((*submodel)->chi2vec, (*submodel)->chi2vec->size - 1);
831 if(!romdatacoeff) exit(1);
838 (*romdatacoeff)->c_real = gsl_vector_alloc(nk_cmode);
839 (*romdatacoeff)->c_imag = gsl_vector_alloc(nk_cmode);
840 (*romdatacoeff)->c_phase = gsl_vector_alloc(nk_phase);
845 if(romdatacoeff->
c_real) gsl_vector_free(romdatacoeff->
c_real);
846 if(romdatacoeff->
c_imag) gsl_vector_free(romdatacoeff->
c_imag);
853 return 1 << (size_t) ceil(log2(n));
858 gsl_vector *phase_f_lo = gsl_vector_alloc(freq_lo->size);
859 gsl_vector *phase_f_hi = gsl_vector_alloc(freq_hi->size);
875 gsl_vector_free(phase_f_lo);
876 gsl_vector_free(phase_f_hi);
891 "Error setting up SEOBNRv4ROM data - check your $LAL_DATA_PATH\n");
894 UNUSED
UINT4 retcode=0;
897 SEOBNRROMdataDS_submodel *submodel_hi;
898 SEOBNRROMdataDS_submodel *submodel_lo;
902 submodel_lo = romdata->lowf;
906 submodel_hi = romdata->hqls;
908 else if(flag_patch == 1){
909 submodel_hi = romdata->hqhs;
911 else if(flag_patch == 2){
912 submodel_hi = romdata->lqls;
914 else if(flag_patch == 3){
915 submodel_hi = romdata->lqhs;
919 XLALPrintError(
"XLAL Error - %s: SEOBNRv4HM not currently available in this region!\n",
929 gsl_vector* freq_lo = gsl_vector_alloc(submodel_lo->nk_phase);
930 for(
unsigned int i = 0;
i < freq_lo->size;
i++){
931 freq_lo->data[
i] = submodel_lo->gPhase->data[
i];
933 gsl_vector* freq_hi = gsl_vector_alloc(submodel_hi->nk_phase);
940 for(
unsigned int i = 0;
i < freq_hi->size;
i++){
941 freq_hi->data[
i] = inv_scaling*submodel_hi->gPhase->data[
i];
947 *freq = gsl_vector_alloc(i_max_LF + freq_hi->size - i_min_HF + 1);
950 *phase = gsl_vector_calloc((*freq)->size);
953 for(
unsigned int i = 0;
i <= i_max_LF;
i++){
954 (*freq)->data[
i] = freq_lo->data[
i];
956 for(
unsigned int i = i_min_HF;
i < freq_hi->size;
i++){
957 (*freq)->data[i_max_LF+
i-i_min_HF+1] = freq_hi->data[
i];
965 gsl_vector_free(freq_lo);
966 gsl_vector_free(freq_hi);
979 REAL8* Deltaphi_align,
980 gsl_vector *phase_lo,
981 gsl_vector *phase_hi,
999 *freq = gsl_vector_alloc(i_max_LF + freq_hi->size - i_min_HF + 1);
1002 for(
unsigned int i=0;
i <= i_max_LF;
i++)
1003 (*freq)->data[
i] = freq_lo->data[
i];
1004 for(
unsigned int i=i_min_HF; i < freq_hi->size;
i++)
1005 (*freq)->data[i_max_LF+
i-i_min_HF+1] = freq_hi->data[
i];
1008 *phase = gsl_vector_calloc((*freq)->size);
1013 REAL8 Deltaphi = 0.;
1014 retcode =
align_wfs_window(freq_lo, freq_hi, phase_lo, phase_hi, &Deltat, &Deltaphi, f_hyb_lo, f_hyb_hi);
1018 retcode =
blend_functions(*freq, *phase, freq_lo, phase_lo, freq_hi, phase_hi, f_hyb_lo, f_hyb_hi);
1024 *Deltat_align = Deltat;
1025 *Deltaphi_align = Deltaphi;
1034 gsl_vector *phase_lo,
1035 gsl_vector *phase_hi,
1036 gsl_vector *freq_lo,
1037 gsl_vector *freq_hi,
1040 REAL8 Deltat_22_align,
1041 REAL8 Deltaphi_22_align,
1056 *freq = gsl_vector_alloc(i_max_LF + freq_hi->size - i_min_HF + 1);
1059 for(
unsigned int i=0;
i <= i_max_LF;
i++)
1060 (*freq)->data[
i] = freq_lo->data[
i];
1061 for(
unsigned int i=i_min_HF; i < freq_hi->size;
i++)
1062 (*freq)->data[i_max_LF+
i-i_min_HF+1] = freq_hi->data[
i];
1065 *phase = gsl_vector_calloc((*freq)->size);
1068 retcode =
align_wfs_window_from_22(freq_lo, freq_hi, phase_lo, phase_hi, f_hyb_lo, f_hyb_hi, Deltat_22_align, Deltaphi_22_align, modeM);
1072 retcode =
blend_functions(*freq, *phase, freq_lo, phase_lo, freq_hi, phase_hi, f_hyb_lo, f_hyb_hi);
1084 gsl_vector *freq_lo,
1085 gsl_vector *freq_hi,
1100 *freq = gsl_vector_alloc(i_max_LF + freq_hi->size - i_min_HF + 1);
1103 for(
unsigned int i=0;
i <= i_max_LF;
i++)
1104 (*freq)->data[
i] = freq_lo->data[
i];
1105 for(
unsigned int i=i_min_HF; i < freq_hi->size;
i++)
1106 (*freq)->data[i_max_LF+
i-i_min_HF+1] = freq_hi->data[
i];
1109 *amp = gsl_vector_calloc((*freq)->size);
1112 retcode =
blend_functions(*freq, *amp, freq_lo, amp_lo, freq_hi, amp_hi, f_hyb_lo, f_hyb_hi);
1127 REAL8 f_max_carrier = freq_carrier_hyb->data[freq_carrier_hyb->size -1];
1128 REAL8 phase_carrier_at_f_max = phase_carrier_hyb->data[phase_carrier_hyb->size -1];
1130 gsl_interp_accel *acc = gsl_interp_accel_alloc ();
1131 gsl_spline *spline = gsl_spline_alloc (gsl_interp_cspline, phase_carrier_hyb->size);
1133 gsl_spline_init (spline, freq_carrier_hyb->data, phase_carrier_hyb->data, phase_carrier_hyb->size);
1134 REAL8 der_phase_carrier_at_f_max = gsl_spline_eval_deriv(spline, f_max_carrier, acc);
1139 for(
unsigned int i = 0;
i < freq_mode_lm->size;
i++){
1140 if(freq_mode_lm->data[
i]/(
REAL8)modeM < f_max_carrier){
1142 phase_approx_lm->data[
i] = (
REAL8)modeM*gsl_spline_eval (spline, freq_mode_lm->data[
i]/(
REAL8)modeM, acc) + const_phase_shift;
1146 phase_approx_lm->data[
i] = modeM*(phase_carrier_at_f_max + der_phase_carrier_at_f_max*(freq_mode_lm->data[
i]/modeM-f_max_carrier)) + const_phase_shift;
1151 gsl_spline_free(spline);
1152 gsl_interp_accel_free(acc);
1161 gsl_vector* real_f_lo = gsl_vector_alloc(freq_lo->size);
1162 gsl_vector* imag_f_lo = gsl_vector_alloc(freq_lo->size);
1163 gsl_vector* real_f_hi = gsl_vector_alloc(freq_hi->size);
1164 gsl_vector* imag_f_hi = gsl_vector_alloc(freq_hi->size);
1177 gsl_vector_free(real_f_lo);
1178 gsl_vector_free(imag_f_lo);
1179 gsl_vector_free(real_f_hi);
1180 gsl_vector_free(imag_f_hi);
1196 "Error setting up SEOBNRv4ROM data - check your $LAL_DATA_PATH\n");
1199 UNUSED
UINT4 retcode=0;
1202 SEOBNRROMdataDS_submodel *submodel_hi;
1203 SEOBNRROMdataDS_submodel *submodel_lo;
1207 submodel_lo = romdata->lowf;
1210 if(flag_patch == 0){
1211 submodel_hi = romdata->hqls;
1213 else if(flag_patch == 1){
1214 submodel_hi = romdata->hqhs;
1216 else if(flag_patch == 2){
1217 submodel_hi = romdata->lqls;
1219 else if(flag_patch == 3){
1220 submodel_hi = romdata->lqhs;
1224 XLALPrintError(
"XLAL Error - %s: SEOBNRv4HM not currently available in this region!\n",
1234 gsl_vector* freq_lo = gsl_vector_alloc(submodel_lo->nk_cmode);
1235 gsl_vector* freq_hi = gsl_vector_alloc(submodel_hi->nk_cmode);
1237 for(
unsigned int i = 0;
i < freq_lo->size;
i++){
1238 freq_lo->data[
i] = submodel_lo->gCMode->data[
i];
1245 for(
unsigned int i = 0;
i < freq_hi->size;
i++){
1246 freq_hi->data[
i] = inv_scaling*submodel_hi->gCMode->data[
i];
1253 *freq_cmode = gsl_vector_alloc(i_max_LF + freq_hi->size - i_min_HF + 1);
1256 for(
unsigned int i = 0;
i <= i_max_LF;
i++){
1257 (*freq_cmode)->data[
i] = freq_lo->data[
i];
1259 for(
unsigned int i = i_min_HF;
i < freq_hi->size;
i++){
1260 (*freq_cmode)->data[i_max_LF+
i-i_min_HF+1] = freq_hi->data[
i];
1263 *cmode_real = gsl_vector_calloc((*freq_cmode)->size);
1264 *cmode_imag = gsl_vector_calloc((*freq_cmode)->size);
1273 gsl_vector_free(freq_lo);
1274 gsl_vector_free(freq_hi);
1288 "Error setting up SEOBNRv4ROM data - check your $LAL_DATA_PATH\n");
1291 SEOBNRROMdataDS_submodel *submodel;
1292 if(strcmp(
"LF",freq_range) == 0){
1294 submodel = romdata->lowf;
1300 if(flag_patch == 0){
1301 submodel = romdata->hqls;
1303 else if(flag_patch == 1){
1304 submodel = romdata->hqhs;
1306 else if(flag_patch == 2){
1307 submodel = romdata->lqls;
1309 else if(flag_patch == 3){
1310 submodel = romdata->lqhs;
1314 XLALPrintError(
"XLAL Error - %s: SEOBNRv4HM not currently available in this region!\n",
1327 submodel->cvec_phase,
1333 gsl_vector_const_ptr(submodel->qvec, 0),
1334 gsl_vector_const_ptr(submodel->chi1vec, 0),
1335 gsl_vector_const_ptr(submodel->chi2vec, 0),
1346 gsl_blas_dgemv(CblasTrans, 1.0, submodel->Bphase, romdata_coeff->
c_phase, 0.0, phase_f);
1361 "Error setting up SEOBNRv4ROM data - check your $LAL_DATA_PATH\n");
1364 SEOBNRROMdataDS_submodel *submodel;
1365 if(strcmp(
"LF",freq_range) == 0){
1367 submodel = romdata->lowf;
1373 if(flag_patch == 0){
1374 submodel = romdata->hqls;
1376 else if(flag_patch == 1){
1377 submodel = romdata->hqhs;
1379 else if(flag_patch == 2){
1380 submodel = romdata->lqls;
1382 else if(flag_patch == 3){
1383 submodel = romdata->lqhs;
1387 XLALPrintError(
"XLAL Error - %s: SEOBNRv4HM not currently available in this region!\n",
1400 submodel->cvec_real,
1406 gsl_vector_const_ptr(submodel->qvec, 0),
1407 gsl_vector_const_ptr(submodel->chi1vec, 0),
1408 gsl_vector_const_ptr(submodel->chi2vec, 0),
1417 submodel->cvec_imag,
1423 gsl_vector_const_ptr(submodel->qvec, 0),
1424 gsl_vector_const_ptr(submodel->chi1vec, 0),
1425 gsl_vector_const_ptr(submodel->chi2vec, 0),
1437 gsl_blas_dgemv(CblasTrans, 1.0, submodel->Breal, romdata_coeff->
c_real, 0.0, creal_f);
1438 gsl_blas_dgemv(CblasTrans, 1.0, submodel->Bimag, romdata_coeff->
c_imag, 0.0, cimag_f);
1449 if ((
q> 3.) && (chi1<=0.8)){
1452 else if ((
q> 3.) && (chi1>0.8)){
1455 else if ((
q<= 3.) && (chi1<=0.8)){
1458 else if ((
q<= 3.) && (chi1>0.8)){
1463 XLALPrintError(
"XLAL Error - %s: SEOBNRv4HM not currently available in this region!\n",
1480 if(!ampPhaseSplineData)
1485 if (
q > 50.0)
nudge(&
q, 50.0, 1
e-6);
1487 if ( chi1 < -1.0 || chi2 < -1.0 || chi1 > 1.0 || chi2 > 1.0) {
1488 XLALPrintError(
"XLAL Error - %s: chi1 or chi2 smaller than -1.0 or larger than 1.0!\n"
1489 "SEOBNRv4HMROM is only available for spins in the range -1 <= a/M <= 1.0.\n",
1494 if (q<1.0 || q > 50.0) {
1495 XLALPrintError(
"XLAL Error - %s: q (%f) bigger than 50.0 or unphysical!\n"
1496 "SEOBNRv4HMROM is only available for q in the range 1 <= q <= 50.\n",
1505 gsl_vector *freq_carrier_hyb = NULL;
1506 gsl_vector *phase_carrier_hyb = NULL;
1511 &freq_carrier_hyb, &phase_carrier_hyb,
q, chi1, chi2, flag_patch, nk_max);
1515 for(
unsigned int i=0;
i < phase_carrier_hyb->size;
i++) {
1516 phase_carrier_hyb->data[
i] = -phase_carrier_hyb->data[
i];
1520 for(
unsigned int nMode=0; nMode <
nModes; nMode++){
1522 gsl_vector *freq_cmode_hyb = NULL;
1523 gsl_vector *cmode_real_hyb = NULL;
1524 gsl_vector *cmode_imag_hyb = NULL;
1531 &freq_cmode_hyb, &cmode_real_hyb, &cmode_imag_hyb,
1532 q, chi1, chi2, nMode, flag_patch, nk_max);
1534 gsl_vector *phase_approx_lm = gsl_vector_alloc(freq_cmode_hyb->size);
1537 freq_carrier_hyb, phase_carrier_hyb, nMode);
1541 gsl_vector *phase_cmode = gsl_vector_alloc(freq_cmode_hyb->size);
1542 for(
unsigned int i=0;
i < freq_cmode_hyb->size;
i++) {
1543 complex_mode = cmode_real_hyb->data[
i] + I*cmode_imag_hyb->data[
i];
1544 phase_cmode->data[
i] = carg(complex_mode);
1548 gsl_vector *unwrapped_phase_cmode = gsl_vector_alloc(freq_cmode_hyb->size);
1549 retcode =
unwrap_phase(unwrapped_phase_cmode,phase_cmode);
1552 gsl_vector *reconstructed_phase = gsl_vector_alloc(freq_cmode_hyb->size);
1553 gsl_vector *reconstructed_amplitude = gsl_vector_alloc(freq_cmode_hyb->size);
1554 for(
unsigned int i=0;
i < freq_cmode_hyb->size;
i++) {
1555 complex_mode = cmode_real_hyb->data[
i] + I*cmode_imag_hyb->data[
i];
1556 reconstructed_amplitude->data[
i] = cabs(complex_mode);
1557 reconstructed_phase->data[
i] = unwrapped_phase_cmode->data[
i] - phase_approx_lm->data[
i];
1561 gsl_interp_accel *acc_amp = gsl_interp_accel_alloc();
1562 gsl_spline *spline_amp = gsl_spline_alloc (gsl_interp_cspline, reconstructed_amplitude->size);
1563 gsl_spline_init(spline_amp, freq_cmode_hyb->data, reconstructed_amplitude->data, reconstructed_amplitude->size);
1565 gsl_interp_accel *acc_phase = gsl_interp_accel_alloc();
1566 gsl_spline *spline_phase = gsl_spline_alloc (gsl_interp_cspline, reconstructed_phase->size);
1567 gsl_spline_init(spline_phase, freq_cmode_hyb->data, reconstructed_phase->data, reconstructed_phase->size);
1571 ampPhaseSplineData[nMode]->spline_amp = spline_amp;
1572 ampPhaseSplineData[nMode]->spline_phi = spline_phase;
1573 ampPhaseSplineData[nMode]->acc_amp = acc_amp;
1574 ampPhaseSplineData[nMode]->acc_phi = acc_phase;
1575 ampPhaseSplineData[nMode]->f = freq_cmode_hyb;
1578 gsl_vector_free(cmode_real_hyb);
1579 gsl_vector_free(cmode_imag_hyb);
1580 gsl_vector_free(phase_approx_lm);
1581 gsl_vector_free(phase_cmode);
1582 gsl_vector_free(unwrapped_phase_cmode);
1583 gsl_vector_free(reconstructed_amplitude);
1584 gsl_vector_free(reconstructed_phase);
1588 gsl_vector_free(freq_carrier_hyb);
1589 gsl_vector_free(phase_carrier_hyb);
1602 UNUSED
REAL8 phiRef,
1604 UNUSED
REAL8 distance,
1605 UNUSED
REAL8 Mtot_sec,
1610 UNUSED
REAL8 deltaF,
1614 REAL8 sign_odd_modes
1623 if (
q > 50.0)
nudge(&
q, 50.0, 1
e-6);
1625 if ( chi1 < -1.0 || chi2 < -1.0 || chi1 > 1.0 || chi2 > 1.0) {
1626 XLALPrintError(
"XLAL Error - %s: chi1 or chi2 smaller than -1.0 or larger than 1.0!\n"
1627 "SEOBNRv4HMROM is only available for spins in the range -1 <= a/M <= 1.0.\n",
1632 if (q<1.0 || q > 50.0) {
1633 XLALPrintError(
"XLAL Error - %s: q (%f) bigger than 50.0 or unphysical!\n"
1634 "SEOBNRv4HMROM is only available for q in the range 1 <= q <= 50.\n",
1644 ampPhaseSplineData,
q, chi1, chi2, nk_max,
nModes);
1650 REAL8 fLow = freqs_in->data[0];
1651 REAL8 fHigh = freqs_in->data[freqs_in->length - 1];
1653 UNUSED
REAL8 fLow_geom = fLow * Mtot_sec;
1654 REAL8 fHigh_geom = fHigh * Mtot_sec;
1655 REAL8 deltaF_geom = deltaF * Mtot_sec;
1660 if (fHigh_geom == 0)
1666 if (fHigh_geom <= fLow_geom)
1667 XLAL_ERROR(
XLAL_EDOM,
"End frequency %g is smaller than (or equal to) starting frequency %g!\n", fHigh_geom, fLow_geom);
1670 for(
unsigned int nMode=0; nMode <
nModes; nMode++){
1681 npts =
NextPow2(fHigh_geom / deltaF_geom) + 1;
1682 if (fHigh_geom < fHigh * Mtot_sec)
1683 npts =
NextPow2(fHigh * Mtot_sec / deltaF_geom) + 1;
1691 double fHigh_temp = fHigh_geom / Mtot_sec;
1693 UINT4 iStop = (
UINT4) ceil(fHigh_temp / deltaF);
1697 freqs->
data[
i-iStart] =
i*deltaF_geom;
1716 REAL8 t_corr = 1000.;
1719 gsl_spline *spline_amp = ampPhaseSplineData[nMode]->
spline_amp;
1720 gsl_spline *spline_phase = ampPhaseSplineData[nMode]->
spline_phi;
1721 gsl_interp_accel *acc_amp = ampPhaseSplineData[nMode]->
acc_amp;
1722 gsl_interp_accel *acc_phase = ampPhaseSplineData[nMode]->
acc_phi;
1731 if (f > Mf_max_mode)
continue;
1732 if (f <=
Mf_low_22 * modeM/2.)
continue;
1734 REAL8 A = gsl_spline_eval(spline_amp, f, acc_amp);
1735 REAL8 phase = gsl_spline_eval(spline_phase, f, acc_phase);
1736 hlmdata[j] = amp0*A * (cos(phase) + I*sin(phase));
1738 COMPLEX16 t_factor = cos(phase_factor) + I*sin(phase_factor);
1739 hlmdata[j] *= t_factor;
1742 hlmdata[j] = pow(-1.,modeL)*conj(hlmdata[j]);
1746 hlmdata[j] = hlmdata[j]*sign_odd_modes;
1810 for (
INT4 EMM = -ELL; EMM <= (
INT4)ELL; EMM++) {
1817 if ((modeL == ELL)&&(modeM == EMM)) {
1820 if ((modeL == ELL)&&(modeM == -EMM)) {
1826 if (flagTrue == 0) {
1827 XLALPrintError (
"Mode (%d,%d) is not available by the model SEOBNRv4HM_ROM\n", ELL,
1831 if (flagTrue == 2) {
1832 XLALPrintError (
"Mode (%d,%d) is not available by the model SEOBNRv4HM_ROM.\n"
1833 "In this function you can only select (l,-|m|) modes that are directly modeled in the ROM.\n"
1834 "The (l,+|m|) mode will be automatically added to the waveform using symmetry arguments.\n", ELL,
1856 LALValue *ModeArray,
1864 while ( hlms_temp ) {
1868 hlms_temp->
l, hlms_temp->
m, 1);
1870 hlms_temp = hlms_temp->
next;
1881 if (
l==2 &&
m==2)
return 0.;
1882 else if (
l==2 &&
m==1)
return LAL_PI/2;
1883 else if (
l==3 &&
m==3)
return -
LAL_PI/2;
1884 else if (
l==4 &&
m==4)
return LAL_PI;
1885 else if (
l==5 &&
m==5)
return LAL_PI/2;
1899 double chis = 1./2 * (chi1 + chi2);
1900 double chia = 1./2 * (chi1 - chi2);
1901 if (
l==2 &&
m==2)
return 1.;
1902 else if (
l==2 &&
m==1)
return v * (
delta/3 - 1./2*v*(chia +
delta*chis));
1903 else if (
l==3 &&
m==3)
return v * 3./4 * sqrt(15./14) *
delta;
1904 else if (
l==4 &&
m==4)
return v*v * 8*sqrt(35.)/63 * (1 - 3*eta);
1905 else if (
l==5 &&
m==5)
return v*v*v * 625*sqrt(66.)/6336 *
delta * (1 - 2*eta);
1926 gsl_vector **PNphase
1930 *PNphase = gsl_vector_alloc(Mfs->size);
1937 double m1OverM =
q / (1.0+
q);
1938 double m2OverM = 1.0 / (1.0+
q);
1948 for (
size_t i=0;
i < Mfs->size;
i++) {
1949 const double Mf = gsl_vector_get(Mfs,
i);
1950 const double Mf_m = 2./
m * Mf;
1951 const double v = cbrt(
LAL_PI * Mf_m);
1952 const double logv = log(v);
1953 const double v2 = v * v;
1954 const double v3 = v * v2;
1955 const double v4 = v * v3;
1956 const double v5 = v * v4;
1957 const double v6 = v * v5;
1958 const double v7 = v * v6;
1959 double phasing = 0.0;
1961 phasing +=
pn->v[7] * v7;
1962 phasing += (
pn->v[6] +
pn->vlogv[6] * logv) * v6;
1963 phasing += (
pn->v[5] +
pn->vlogv[5] * logv) * v5;
1964 phasing +=
pn->v[4] * v4;
1965 phasing +=
pn->v[3] * v3;
1966 phasing +=
pn->v[2] * v2;
1967 phasing +=
pn->v[1] * v;
1968 phasing +=
pn->v[0];
1977 phasing += Deltaphilm -
LAL_PI/4.;
1979 gsl_vector_set(*PNphase,
i, phasing);
2006 *PNamp = gsl_vector_alloc(Mfs->size);
2007 double eta =
q / ((1.+
q)*(1.+
q));
2011 double delta = (
q-1. + DBL_EPSILON) / (1.+
q);
2014 double ampN =
LAL_PI * sqrt(2*eta/3.);
2017 for (
size_t i=0;
i < Mfs->size;
i++) {
2018 const double Mf = gsl_vector_get(Mfs,
i);
2019 const double Mf_m = 2./
m * Mf;
2020 const double v = cbrt(
LAL_PI * Mf_m);
2021 const double vm72 = pow(v, -7./2);
2025 double amp = ampN * vm72 * sqrt(2./
m) * mode_amp_factor;
2026 gsl_vector_set(*PNamp,
i, amp);
2045 if (!(Mfmin < Mfmax))
2048 double eta =
q / ((1.+
q) * (1.+
q));
2053 double Lambda = 3.8 * pow(acc * eta, 1./4) * pow(
LAL_PI, 5./12);
2057 double Lambdatilde = 0.;
2058 N = 1 + ceil(12./5/
Lambda * (pow(Mfmin, -5./12) - pow(Mfmax, -5./12)));
2060 Lambdatilde = 12./5/(
N-1) * (pow(Mfmin, -5./12) - pow(Mfmax, -5./12));
2063 *Mfreq = gsl_vector_alloc(
N);
2066 double Mfmin_m512 = pow(Mfmin, -5./12);
2067 for (
int i=0;
i<
N;
i++) {
2068 (*Mfreq)->data[
i] = pow(Mfmin_m512 - 5./12*Lambdatilde*
i, -12./5);
2072 (*Mfreq)->data[0] = Mfmin;
2073 (*Mfreq)->data[
N-1] = Mfmax;
2079 gsl_spline **hyb_spline,
2081 gsl_vector *PN_freq,
2083 double f_hyb_win_lo,
2087 gsl_vector *ROM_amp_f = NULL;
2088 gsl_vector *ROM_amp = NULL;
2092 if ( (gsl_vector_get(PN_freq, 0) > f_hyb_win_lo)
2093 || (gsl_vector_get(PN_freq, PN_freq->size - 1) < f_hyb_win_lo)
2094 || (gsl_vector_get(PN_freq, 0) > f_hyb_win_hi)
2095 || (gsl_vector_get(PN_freq, PN_freq->size - 1) < f_hyb_win_hi) )
2096 XLAL_ERROR(
XLAL_EFUNC,
"Hybridization window for amplitude is not contained in PN frequencies.");
2097 if ( (gsl_vector_get(ROM_amp_f, 0) > f_hyb_win_lo)
2098 || (gsl_vector_get(ROM_amp_f, ROM_amp_f->size - 1) < f_hyb_win_lo)
2099 || (gsl_vector_get(ROM_amp_f, 0) > f_hyb_win_hi)
2100 || (gsl_vector_get(ROM_amp_f, ROM_amp_f->size - 1) < f_hyb_win_hi) )
2101 XLAL_ERROR(
XLAL_EFUNC,
"Hybridization window for amplitude is not contained in ROM frequencies.");
2104 gsl_spline *PN_amp_spline = gsl_spline_alloc(gsl_interp_cspline, PN_amp->size);
2105 gsl_spline_init(PN_amp_spline, PN_freq->data, PN_amp->data, PN_amp->size);
2106 gsl_interp_accel *acc_PN = gsl_interp_accel_alloc();
2107 gsl_interp_accel *acc_ROM = gsl_interp_accel_alloc();
2108 double PN_amp_i = gsl_spline_eval(PN_amp_spline, f_hyb_win_lo, acc_PN);
2109 double ROM_amp_i = gsl_spline_eval(ampPhaseSplineData_for_mode->
spline_amp, f_hyb_win_lo, acc_ROM);
2110 double fac = ROM_amp_i / PN_amp_i;
2111 for (
size_t i=0;
i < PN_amp->size;
i++) {
2112 double A = gsl_vector_get(PN_amp,
i);
2113 gsl_vector_set(PN_amp,
i, A * fac);
2115 gsl_spline_free(PN_amp_spline);
2116 gsl_interp_accel_free(acc_PN);
2117 gsl_interp_accel_free(acc_ROM);
2119 gsl_vector *hyb_freq = NULL;
2120 gsl_vector *hyb_amp = NULL;
2122 &hyb_freq, &hyb_amp,
2125 f_hyb_win_lo, f_hyb_win_hi
2128 *hyb_spline = gsl_spline_alloc(gsl_interp_cspline, hyb_amp->size);
2129 gsl_spline_init(*hyb_spline, hyb_freq->data, hyb_amp->data, hyb_amp->size);
2131 gsl_vector_free(ROM_amp_f);
2132 gsl_vector_free(ROM_amp);
2133 gsl_vector_free(hyb_freq);
2134 gsl_vector_free(hyb_amp);
2140 gsl_spline **hyb_spline,
2141 REAL8* Deltat_align,
2142 REAL8* Deltaphi_align,
2144 gsl_vector *PN_freq,
2145 gsl_vector *PN_phase,
2146 double f_hyb_win_lo,
2150 gsl_vector *ROM_phi_f = NULL;
2151 gsl_vector *ROM_phi = NULL;
2155 if ( (gsl_vector_get(PN_freq, 0) > f_hyb_win_lo)
2156 || (gsl_vector_get(PN_freq, PN_freq->size - 1) < f_hyb_win_lo)
2157 || (gsl_vector_get(PN_freq, 0) > f_hyb_win_hi)
2158 || (gsl_vector_get(PN_freq, PN_freq->size - 1) < f_hyb_win_hi) )
2160 if ( (gsl_vector_get(ROM_phi_f, 0) > f_hyb_win_lo)
2161 || (gsl_vector_get(ROM_phi_f, ROM_phi_f->size - 1) < f_hyb_win_lo)
2162 || (gsl_vector_get(ROM_phi_f, 0) > f_hyb_win_hi)
2163 || (gsl_vector_get(ROM_phi_f, ROM_phi_f->size - 1) < f_hyb_win_hi) )
2166 gsl_vector *hyb_freq = NULL;
2167 gsl_vector *hyb_phase = NULL;
2169 &hyb_freq, &hyb_phase, Deltat_align, Deltaphi_align,
2172 f_hyb_win_lo, f_hyb_win_hi
2176 *hyb_spline = gsl_spline_alloc(gsl_interp_cspline, hyb_phase->size);
2177 gsl_spline_init(*hyb_spline, hyb_freq->data, hyb_phase->data, hyb_phase->size);
2179 gsl_vector_free(ROM_phi_f);
2180 gsl_vector_free(ROM_phi);
2181 gsl_vector_free(hyb_freq);
2182 gsl_vector_free(hyb_phase);
2188 gsl_spline **hyb_spline,
2190 gsl_vector *PN_freq,
2191 gsl_vector *PN_phase,
2192 double f_hyb_win_lo,
2193 double f_hyb_win_hi,
2194 REAL8 Deltat_22_align,
2195 REAL8 Deltaphi_22_align,
2199 gsl_vector *ROM_phi_f = NULL;
2200 gsl_vector *ROM_phi = NULL;
2204 if ( (gsl_vector_get(PN_freq, 0) > f_hyb_win_lo)
2205 || (gsl_vector_get(PN_freq, PN_freq->size - 1) < f_hyb_win_lo)
2206 || (gsl_vector_get(PN_freq, 0) > f_hyb_win_hi)
2207 || (gsl_vector_get(PN_freq, PN_freq->size - 1) < f_hyb_win_hi) )
2209 if ( (gsl_vector_get(ROM_phi_f, 0) > f_hyb_win_lo)
2210 || (gsl_vector_get(ROM_phi_f, ROM_phi_f->size - 1) < f_hyb_win_lo)
2211 || (gsl_vector_get(ROM_phi_f, 0) > f_hyb_win_hi)
2212 || (gsl_vector_get(ROM_phi_f, ROM_phi_f->size - 1) < f_hyb_win_hi) )
2215 gsl_vector *hyb_freq = NULL;
2216 gsl_vector *hyb_phase = NULL;
2218 &hyb_freq, &hyb_phase,
2221 f_hyb_win_lo, f_hyb_win_hi,
2222 Deltat_22_align, Deltaphi_22_align, modeM
2226 *hyb_spline = gsl_spline_alloc(gsl_interp_cspline, hyb_phase->size);
2227 gsl_spline_init(*hyb_spline, hyb_freq->data, hyb_phase->data, hyb_phase->size);
2229 gsl_vector_free(ROM_phi_f);
2230 gsl_vector_free(ROM_phi);
2231 gsl_vector_free(hyb_freq);
2232 gsl_vector_free(hyb_phase);
2242 UNUSED
REAL8 phiRef,
2244 UNUSED
REAL8 distance,
2245 UNUSED
REAL8 Mtot_sec,
2250 UNUSED
REAL8 deltaF,
2257 REAL8 sign_odd_modes
2262 REAL8 fLow = freqs_in->data[0];
2263 REAL8 fHigh = freqs_in->data[freqs_in->length - 1];
2265 REAL8 fLow_geom = fLow * Mtot_sec;
2266 REAL8 fHigh_geom = fHigh * Mtot_sec;
2267 REAL8 deltaF_geom = deltaF * Mtot_sec;
2272 if (fHigh_geom == 0)
2279 XLAL_PRINT_INFO(
"Starting frequency %g is smaller than (or equal to) ROM starting frequency for (2,2) mode %g!\nUsing hybridization with TaylorF2.\n", fLow_geom,
Mf_low_22);
2281 XLAL_PRINT_INFO(
"Starting frequency %g is smaller than (or equal to) ROM starting frequency for (5,5) mode %g!\nUsing hybridization with TaylorF2.\n", fLow_geom,
Mf_low_55);
2282 if (fLow_geom <= 0.0) {
2283 XLALPrintError(
"XLAL Error - %s: Starting frequency in REAL8Sequence must be positive.\n", __func__);
2290 ampPhaseSplineData,
q, chi1, chi2, nk_max,
nModes);
2295 const double f_hyb_win_lo_fac = 1.01;
2296 const double f_hyb_win_hi_fac = 2.0;
2305 double PN_Mf_low = fmin(fLow_geom / 2.0,
Mf_low_21);
2306 double PN_Mf_high = 1.1 * f_hyb_win_hi_fac *
Mf_low_55;
2308 gsl_vector *Mfs = NULL;
2309 const double acc = 1
e-4;
2314 gsl_spline *hybrid_spline_amp[
nModes];
2315 gsl_spline *hybrid_spline_phi[
nModes];
2317 hybrid_spline_amp[
i] = NULL;
2318 hybrid_spline_phi[
i] = NULL;
2323 REAL8 Deltat_22_align = 0.;
2324 REAL8 Deltaphi_22_align = 0.;
2329 double f_hyb_win_lo =
Mf_low_lm[k] * f_hyb_win_lo_fac;
2330 double f_hyb_win_hi =
Mf_low_lm[k] * f_hyb_win_hi_fac;
2332 XLALPrintInfo(
"%s : SEOBNRv4HM_ROM hybridization window for (2,2) mode: Mf in [%g, %g]\n",
2333 __func__, f_hyb_win_lo, f_hyb_win_hi);
2337 gsl_vector *PNamp = NULL;
2338 gsl_vector *PNphase = NULL;
2342 retcode |=
TaylorF2Phasing(Mtot,
q, chi1, chi2, modeL, modeM, Mfs, &PNphase);
2344 gsl_vector_free(PNamp);
2345 gsl_vector_free(PNphase);
2346 gsl_vector_free(Mfs);
2355 if (!(modeL==2 && modeM==2)) {
2361 &hybrid_spline_phi[k],
2364 ampPhaseSplineData[k],
2366 f_hyb_win_lo, f_hyb_win_hi
2372 &hybrid_spline_phi[k],
2373 ampPhaseSplineData[k],
2375 f_hyb_win_lo, f_hyb_win_hi,
2376 Deltat_22_align, Deltaphi_22_align, modeM
2382 &hybrid_spline_amp[k],
2383 ampPhaseSplineData[k],
2385 f_hyb_win_lo, f_hyb_win_hi
2389 gsl_interp_accel *acc_amp = gsl_interp_accel_alloc();
2390 gsl_interp_accel *acc_phase = gsl_interp_accel_alloc();
2402 npts =
NextPow2(fHigh_geom / deltaF_geom) + 1;
2403 if (fHigh_geom < fHigh * Mtot_sec)
2404 npts =
NextPow2(fHigh * Mtot_sec / deltaF_geom) + 1;
2409 "hlmtilde: FD mode", &tC, 0.0, deltaF, &
lalStrainUnit, npts);
2413 double fHigh_temp = fHigh_geom / Mtot_sec;
2415 UINT4 iStop = (
UINT4) ceil(fHigh_temp / deltaF);
2419 freqs->
data[
i-iStart] =
i*deltaF_geom;
2424 npts = freqs_in->length;
2428 "hlmtilde: FD mode", &tC, fLow, deltaF, &
lalStrainUnit, npts);
2432 for (
UINT4 i=0;
i<freqs_in->length;
i++)
2433 freqs->
data[
i] = freqs_in->data[
i] * Mtot_sec;
2442 double amp0 = Mtot * Mtot_sec *
LAL_MRSUN_SI / (distance);
2446 double t_corr = 1000.0;
2450 q, chi1, chi2, modeL, modeM) / (2.0*
LAL_PI);
2454 double f = freqs->
data[
i];
2455 if (f > Mf_max_mode)
continue;
2459 REAL8 A = gsl_spline_eval(hybrid_spline_amp[k], f, acc_amp);
2460 REAL8 phase = gsl_spline_eval(hybrid_spline_phi[k], f, acc_phase);
2461 hlmdata[j] = amp0*A * (cos(phase) + I*sin(phase));
2463 COMPLEX16 t_factor = cos(phase_factor) + I*sin(phase_factor);
2464 hlmdata[j] *= t_factor;
2467 hlmdata[j] = pow(-1.0, modeL) * conj(hlmdata[j]);
2471 hlmdata[j] = hlmdata[j] * sign_odd_modes;
2479 gsl_interp_accel_free(acc_amp);
2480 gsl_interp_accel_free(acc_phase);
2481 gsl_vector_free(PNamp);
2482 gsl_vector_free(PNphase);
2487 gsl_vector_free(Mfs);
2491 gsl_spline_free(hybrid_spline_amp[k]);
2492 gsl_spline_free(hybrid_spline_phi[k]);
2530 UNUSED
struct tagCOMPLEX16FrequencySeries **hptilde,
2531 UNUSED
struct tagCOMPLEX16FrequencySeries **hctilde,
2532 UNUSED
REAL8 phiRef,
2533 UNUSED
REAL8 deltaF,
2537 UNUSED
REAL8 distance,
2538 UNUSED
REAL8 inclination,
2545 bool use_hybridization,
2549 REAL8 sign_odd_modes = 1.;
2553 REAL8 m1temp = m1SI;
2554 REAL8 chi1temp = chi1;
2559 sign_odd_modes = -1.;
2565 REAL8 Mtot = mass1+mass2;
2572 if (ModeArray == NULL) {
2587 freqs->
data[0] = fLow;
2588 freqs->
data[1] = fHigh;
2591 #ifdef LAL_PTHREAD_LOCK
2600 if (use_hybridization) {
2602 phiRef, fRef, distance, Mtot_sec,
q, chi1, chi2, freqs, deltaF, nk_max,
2607 phiRef, fRef, distance, Mtot_sec,
q, chi1, chi2, freqs, deltaF, nk_max,
2621 memset(hPlustilde->data->data, 0, npts *
sizeof(
COMPLEX16));
2622 memset(hCrosstilde->data->data, 0, npts *
sizeof(
COMPLEX16));
2629 (*hptilde) = hPlustilde;
2630 (*hctilde) = hCrosstilde;
2637 const char*
s = getenv(
"FREE_MEMORY_SEOBNRv4HMROM");
2639 for(
unsigned int index_mode = 0; index_mode <
nModes;index_mode++){
2655 UNUSED
struct tagCOMPLEX16FrequencySeries **hptilde,
2656 UNUSED
struct tagCOMPLEX16FrequencySeries **hctilde,
2658 UNUSED
REAL8 phiRef,
2660 UNUSED
REAL8 distance,
2661 UNUSED
REAL8 inclination,
2671 REAL8 sign_odd_modes = 1.;
2675 REAL8 m1temp = m1SI;
2676 REAL8 chi1temp = chi1;
2681 sign_odd_modes = -1.;
2687 REAL8 Mtot = mass1+mass2;
2694 if (ModeArray == NULL) {
2706 #ifdef LAL_PTHREAD_LOCK
2716 double deltaF = 0.0;
2721 phiRef, fRef, distance, Mtot_sec,
q, chi1, chi2, freqs, deltaF, nk_max,
2731 double fLow = freqs->
data[0];
2734 "hptilde: FD waveform", &tGPS, fLow, deltaF, &
lalStrainUnit, npts);
2736 "hctilde: FD waveform", &tGPS, fLow, deltaF, &
lalStrainUnit, npts);
2737 memset(hPlustilde->data->data, 0, npts *
sizeof(
COMPLEX16));
2738 memset(hCrosstilde->data->data, 0, npts *
sizeof(
COMPLEX16));
2745 (*hptilde) = hPlustilde;
2746 (*hctilde) = hCrosstilde;
2752 const char*
s = getenv(
"FREE_MEMORY_SEOBNRv4HMROM");
2754 for(
unsigned int index_mode = 0; index_mode <
nModes;index_mode++){
2771 UNUSED
REAL8 phiRef,
2772 UNUSED
REAL8 deltaF,
2783 bool use_hybridization
2786 REAL8 sign_odd_modes = 1.;
2790 REAL8 m1temp = m1SI;
2791 REAL8 chi1temp = chi1;
2796 sign_odd_modes = -1.;
2801 XLAL_PRINT_ERROR(
"Requested number of modes not available. Set nModes = 0 to get all the available modes.\n");
2808 REAL8 Mtot = mass1+mass2;
2819 freqs->
data[0] = fLow;
2820 freqs->
data[1] = fHigh;
2823 #ifdef LAL_PTHREAD_LOCK
2830 UNUSED
UINT8 retcode;
2832 if (use_hybridization) {
2835 Mtot_sec,
q, chi1, chi2, freqs,
2836 deltaF, nk_max, 5, sign_odd_modes);
2839 Mtot_sec,
q, chi1, chi2, freqs,
2840 deltaF, nk_max,
nModes, sign_odd_modes);
2845 Mtot_sec,
q, chi1, chi2, freqs,
2846 deltaF, nk_max, 5, sign_odd_modes);
2849 Mtot_sec,
q, chi1, chi2, freqs,
2850 deltaF, nk_max,
nModes, sign_odd_modes);
2867 UNUSED
REAL8 phiRef,
2869 UNUSED
REAL8 distance,
2870 UNUSED
REAL8 inclination,
2880 REAL8 sign_odd_modes = 1.;
2884 REAL8 m1temp = m1SI;
2885 REAL8 chi1temp = chi1;
2890 sign_odd_modes = -1.;
2896 REAL8 Mtot = mass1+mass2;
2903 if (ModeArray == NULL) {
2915 #ifdef LAL_PTHREAD_LOCK
2924 double deltaF = 0.0;
2929 phiRef, fRef, distance, Mtot_sec,
q, chi1, chi2, freqs, deltaF, nk_max,
2936 const char*
s = getenv(
"FREE_MEMORY_SEOBNRv4HMROM");
2938 for(
unsigned int index_mode = 0; index_mode <
nModes;index_mode++){
struct tagLALH5File LALH5File
void XLALDestroyDict(LALDict *dict)
LALDict * XLALCreateDict(void)
static const REAL8 Mf_ROM_max
static void nudge(REAL8 *x, REAL8 X, REAL8 epsilon)
static double double delta
Auxiliary functions for SEOBNRv1/v2 reduced order modeling codes in LALSimIMRSEOBNRv2ROMDoubleSpin....
static UNUSED UINT4 align_wfs_window_from_22(gsl_vector *f_array_1, gsl_vector *f_array_2, gsl_vector *phase_1, gsl_vector *phase_2, REAL8 f_align_start, REAL8 f_align_end, REAL8 Deltat22, REAL8 Deltaphi22, INT4 modeM)
static UNUSED UINT4 compute_i_max_LF_i_min_HF(INT8 *i_max_LF, INT8 *i_min_LF, gsl_vector *freqs_in_1, gsl_vector *freqs_in_2, REAL8 freq_1)
static UNUSED REAL8 Interpolate_Coefficent_Tensor(gsl_vector *v, REAL8 eta, REAL8 chi1, REAL8 chi2, int ncy, int ncz, gsl_bspline_workspace *bwx, gsl_bspline_workspace *bwy, gsl_bspline_workspace *bwz)
static UNUSED REAL8 Get_omegaQNM_SEOBNRv4(REAL8 q, REAL8 chi1z, REAL8 chi2z, UINT4 l, UINT4 m)
static UNUSED UINT4 unwrap_phase(gsl_vector *phaseout, gsl_vector *phasein)
static UNUSED UINT4 align_wfs_window(gsl_vector *f_array_1, gsl_vector *f_array_2, gsl_vector *phase_1, gsl_vector *phase_2, REAL8 *Deltat, REAL8 *Deltaphi, REAL8 f_align_start, REAL8 f_align_end)
static UNUSED char * concatenate_strings(int count,...)
static UNUSED UINT4 blend_functions(gsl_vector *freqs_out, gsl_vector *out_fun, gsl_vector *freq_in_1, gsl_vector *fun_in_1, gsl_vector *freq_in_2, gsl_vector *fun_in_2, REAL8 freq_1, REAL8 freq_2)
static UNUSED UINT8 SEOBNRv4HMROM_Select_HF_patch(REAL8 q, REAL8 chi1)
static UNUSED void AmpPhaseSplineData_Destroy(AmpPhaseSplineData **data, const int num_modes)
static UNUSED bool SEOBNRv4HMROM_IsSetup(UINT4)
Helper function to check if the SEOBNRv4HMROM model has been initialised.
static SEOBNRROMdataDS __lalsim_SEOBNRv4HMROMDS_data[NMODES]
static UNUSED UINT8 SEOBNRv4HMROM_freq_cmode_sparse_grid_hybrid(gsl_vector **freq_cmode, gsl_vector **cmode_real, gsl_vector **cmode_imag, REAL8 q, REAL8 chi1, REAL8 chi2, UINT8 nMode, UINT8 flag_patch, INT8 nk_max)
static INT8 Check_EOBROM_mode_array_structure(LALValue *ModeArray, UINT4 nModes)
ModeArray is a structure which allows to select the modes to include in the waveform.
static UNUSED int SEOBNRv4HMROM_Init(const char dir[], UINT4)
Setup SEOBNRv4HMROM mode using data files installed in dir.
static UNUSED UINT8 SEOBNRv4HMROM_phase_sparse_grid_hybrid_output_align(gsl_vector **freq, gsl_vector **phase, REAL8 *Deltat_align, REAL8 *Deltaphi_align, gsl_vector *phase_lo, gsl_vector *phase_hi, gsl_vector *freq_lo, gsl_vector *freq_hi, double f_hyb_lo, double f_hyb_hi)
static UNUSED int TaylorF2Phasing(double Mtot, double q, double chi1, double chi2, int l, int m, gsl_vector *Mfs, gsl_vector **PNphase)
int(* load_dataPtr)(const char *, gsl_vector *, gsl_vector *, gsl_matrix *, gsl_matrix *, gsl_vector *)
static UNUSED UINT8 SEOBNRv4HMROM_phase_sparse_grid_hybrid_input_align(gsl_vector **freq, gsl_vector **phase, gsl_vector *phase_lo, gsl_vector *phase_hi, gsl_vector *freq_lo, gsl_vector *freq_hi, double f_hyb_lo, double f_hyb_hi, REAL8 Deltat_22_align, REAL8 Deltaphi_22_align, INT4 modeM)
static UNUSED double GetDeltaphilm(int l, int m)
static UNUSED int SEOBNRv4HMROMCoreModesHybridized(UNUSED SphHarmFrequencySeries **hlm_list, UNUSED REAL8 phiRef, UNUSED REAL8 fRef, UNUSED REAL8 distance, UNUSED REAL8 Mtot_sec, UNUSED REAL8 q, UNUSED REAL8 chi1, UNUSED REAL8 chi2, UNUSED const REAL8Sequence *freqs_in, UNUSED REAL8 deltaF, UNUSED INT4 nk_max, UNUSED UINT4 nModes, REAL8 sign_odd_modes)
static UNUSED void SplineData_Init(SplineData **splinedata, int ncx, int ncy, int ncz, const double *qvec, const double *chi1vec, const double *chi2vec)
static UNUSED int hybridize_ROM_with_PN_phase_output_align(gsl_spline **hyb_spline, REAL8 *Deltat_align, REAL8 *Deltaphi_align, AmpPhaseSplineData *ampPhaseSplineData_for_mode, gsl_vector *PN_freq, gsl_vector *PN_phase, double f_hyb_win_lo, double f_hyb_win_hi)
static UNUSED int SEOBNRROMdataDS_Init(SEOBNRROMdataDS *romdata, const char dir[], UINT4)
static UNUSED UINT8 SEOBNRv4HMROM_phase_sparse_grid_hybrid(gsl_vector *freq, gsl_vector *phase, gsl_vector *freq_lo, gsl_vector *freq_hi, REAL8 q, REAL8 chi1, REAL8 chi2, INT4 nk_max)
const REAL8 const_phaseshift_lm[NMODES]
static UNUSED void SplineData_Destroy(SplineData *splinedata)
const char mode_array[NMODES][3]
const REAL8 const_fmax_lm[NMODES]
static UNUSED int SEOBNRROMdataDS_Init_submodel(UNUSED SEOBNRROMdataDS_submodel **submodel, UNUSED const char dir[], UNUSED const char grp_name[], UINT4 index_mode)
static UNUSED UINT8 SEOBNRv4HMROM_amplitude_sparse_grid_hybrid_general(gsl_vector **freq, gsl_vector **amp, gsl_vector *amp_lo, gsl_vector *amp_hi, gsl_vector *freq_lo, gsl_vector *freq_hi, double f_hyb_lo, double f_hyb_hi)
static UNUSED UINT8 SEOBNRv4HMROM_cmode_sparse_grid(gsl_vector *creal_f, gsl_vector *cimag_f, REAL8 q, REAL8 chi1, REAL8 chi2, const char *freq_range, UINT8 nMode, INT4 nk_max)
static UNUSED UINT8 SEOBNRv4HMROM_freq_phase_sparse_grid_hybrid(UNUSED gsl_vector **freq, UNUSED gsl_vector **phase, REAL8 q, REAL8 chi1, REAL8 chi2, UINT8 flag_patch, INT4 nk_max)
static UNUSED void SEOBNRROMdataDS_coeff_Init(SEOBNRROMdataDS_coeff **romdatacoeff, int nk_cmode, int nk_phase)
static UNUSED int TaylorF2Amplitude(const double q, const double chi1, const double chi2, const int l, const int m, gsl_vector *Mfs, gsl_vector **PNamp)
static int SEOBROMComputehplushcrossFromhlm(COMPLEX16FrequencySeries *hplusFS, COMPLEX16FrequencySeries *hcrossFS, LALValue *ModeArray, SphHarmFrequencySeries *hlm, REAL8 inc, REAL8 phi)
static UNUSED void SEOBNRv4HMROM_Init_LALDATA(void)
Setup SEOBNRv4HMROM model using data files installed in $LAL_DATA_PATH.
static UNUSED void SEOBNRROMdataDS_Cleanup_submodel(SEOBNRROMdataDS_submodel *submodel)
static UNUSED void AmpPhaseSplineData_Init(AmpPhaseSplineData ***data, const int num_modes)
const UINT4 lmModes[NMODES][2]
static UNUSED void SEOBNRROMdataDS_coeff_Cleanup(SEOBNRROMdataDS_coeff *romdatacoeff)
static UNUSED UINT8 SEOBNRv4HMROM_cmode_sparse_grid_hybrid(gsl_vector *freq, gsl_vector *cmode_real, gsl_vector *cmode_imag, gsl_vector *freq_lo, gsl_vector *freq_hi, REAL8 q, REAL8 chi1, REAL8 chi2, UINT8 nMode, INT8 nk_max)
static UNUSED void SEOBNRROMdataDS_Cleanup(SEOBNRROMdataDS *romdata)
static UNUSED int hybridize_ROM_with_PN_amplitude(gsl_spline **hyb_spline, AmpPhaseSplineData *ampPhaseSplineData_for_mode, gsl_vector *PN_freq, gsl_vector *PN_amp, double f_hyb_win_lo, double f_hyb_win_hi)
static UNUSED double GetModeAmpFactor(double eta, double delta, double chi1, double chi2, int l, int m, double v)
static size_t NextPow2(const size_t n)
static UNUSED int BuildInspiralGeomFrequencyGrid(gsl_vector **Mfreq, const double Mfmin, const double Mfmax, const double q, const double acc)
static UNUSED UINT8 SEOBNRv4HMROM_approx_phi_lm(gsl_vector *freq_mode_lm, gsl_vector *phase_approx_lm, gsl_vector *freq_carrier_hyb, gsl_vector *phase_carrier_hyb, UINT4 nMode)
static int TP_Spline_interpolation_3d(REAL8 q, REAL8 chi1, REAL8 chi2, gsl_vector *cvec, int nk, int nk_max, int ncx, int ncy, int ncz, const double *qvec, const double *chi1vec, const double *chi2vec, gsl_vector *c_out)
static UNUSED UINT8 SEOBNRv4HMROM_phase_sparse_grid(gsl_vector *phase_f, REAL8 q, REAL8 chi1, REAL8 chi2, const char *freq_range, INT4 nk_max)
static UNUSED int SEOBNRv4HMROMCoreModeAmpPhaseSplines(UNUSED AmpPhaseSplineData **ampPhaseSplineData, UNUSED REAL8 q, UNUSED REAL8 chi1, UNUSED REAL8 chi2, UNUSED INT4 nk_max, UNUSED UINT4 nModes)
static UNUSED int hybridize_ROM_with_PN_phase_input_align(gsl_spline **hyb_spline, AmpPhaseSplineData *ampPhaseSplineData_for_mode, gsl_vector *PN_freq, gsl_vector *PN_phase, double f_hyb_win_lo, double f_hyb_win_hi, REAL8 Deltat_22_align, REAL8 Deltaphi_22_align, INT4 modeM)
static UNUSED int SEOBNRv4HMROMCoreModes(SphHarmFrequencySeries **hlm_list, REAL8 phiRef, REAL8 fRef, REAL8 distance, REAL8 Mtot_sec, REAL8 q, REAL8 chi1, REAL8 chi2, const REAL8Sequence *freqs, REAL8 deltaF, INT4 nk_max, UINT4 nModes, REAL8 sign_odd_modes)
Core function for computing the ROM waveform.
static UINT8 Setup_EOBROM__std_mode_array_structure(LALValue *ModeArray, UINT4 nModes)
ModeArray is a structure which allows to select the modes to include in the waveform.
const REAL8 Mf_low_lm[NMODES]
static UNUSED int spline_to_gsl_vectors(gsl_spline *s, gsl_vector **x, gsl_vector **y)
void XLALDestroyValue(LALValue *value)
#define XLAL_FILE_RESOLVE_PATH(fname)
COMPLEX16FrequencySeries * XLALCreateCOMPLEX16FrequencySeries(const CHAR *name, const LIGOTimeGPS *epoch, REAL8 f0, REAL8 deltaF, const LALUnit *sampleUnits, size_t length)
void XLALDestroyCOMPLEX16FrequencySeries(COMPLEX16FrequencySeries *series)
void XLALH5FileClose(LALH5File UNUSED *file)
LALH5File * XLALH5GroupOpen(LALH5File UNUSED *file, const char UNUSED *name)
LALH5File * XLALH5FileOpen(const char UNUSED *path, const char UNUSED *mode)
void * XLALCalloc(size_t m, size_t n)
void * XLALMalloc(size_t n)
int XLALSimIMRSEOBNRv4HMROM(UNUSED struct tagCOMPLEX16FrequencySeries **hptilde, UNUSED struct tagCOMPLEX16FrequencySeries **hctilde, UNUSED REAL8 phiRef, UNUSED REAL8 deltaF, REAL8 fLow, UNUSED REAL8 fHigh, UNUSED REAL8 fRef, UNUSED REAL8 distance, UNUSED REAL8 inclination, REAL8 m1SI, REAL8 m2SI, REAL8 chi1, REAL8 chi2, UNUSED INT4 nk_max, UNUSED UINT4 nModes, bool use_hybridization, LALDict *LALParams)
Compute waveform in LAL format for the SEOBNRv4HM_ROM model.
int XLALSimIMRSEOBNRv4HMROMFrequencySequence(UNUSED struct tagCOMPLEX16FrequencySeries **hptilde, UNUSED struct tagCOMPLEX16FrequencySeries **hctilde, const REAL8Sequence *freqs, UNUSED REAL8 phiRef, UNUSED REAL8 fRef, UNUSED REAL8 distance, UNUSED REAL8 inclination, REAL8 m1SI, REAL8 m2SI, REAL8 chi1, REAL8 chi2, UNUSED INT4 nk_max, UNUSED UINT4 nModes, LALDict *LALParams)
Compute waveform polarizations at user specified frequencies for the SEOBNRv4HM_ROM model.
int XLALSimIMRSEOBNRv4HMROM_Modes(SphHarmFrequencySeries **hlm, UNUSED REAL8 phiRef, UNUSED REAL8 deltaF, REAL8 fLow, UNUSED REAL8 fHigh, REAL8 fRef, REAL8 distance, REAL8 m1SI, REAL8 m2SI, REAL8 chi1, REAL8 chi2, UNUSED INT4 nk_max, UNUSED UINT4 nModes, bool use_hybridization)
Compute modes in LAL format for the SEOBNRv4HM_ROM model.
int XLALSimIMRSEOBNRv4HMROMFrequencySequence_Modes(SphHarmFrequencySeries **hlm, const REAL8Sequence *freqs, UNUSED REAL8 phiRef, UNUSED REAL8 fRef, UNUSED REAL8 distance, UNUSED REAL8 inclination, REAL8 m1SI, REAL8 m2SI, REAL8 chi1, REAL8 chi2, UNUSED INT4 nk_max, UNUSED UINT4 nModes, LALDict *LALParams)
Compute waveform modes at user specified frequencies for the SEOBNRv4HM_ROM model.
#define LAL_SIM_L_MAX_MODE_ARRAY
Maximum L spherical harmonic mode that is supported in Mode Array.
@ LAL_SIM_INSPIRAL_SPIN_ORDER_35PN
int XLALSimInspiralTaylorF2AlignedPhasing(PNPhasingSeries **pfa, const REAL8 m1, const REAL8 m2, const REAL8 chi1, const REAL8 chi2, LALDict *extraPars)
Returns structure containing TaylorF2 phasing coefficients for given physical parameters.
int XLALSimAddModeFD(COMPLEX16FrequencySeries *hptilde, COMPLEX16FrequencySeries *hctilde, COMPLEX16FrequencySeries *hlmtilde, REAL8 theta, REAL8 phi, INT4 l, INT4 m, INT4 sym)
Helper function to add a mode to hplus, hcross in Fourier domain copies the function XLALSimAddMode,...
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 * XLALUnitDivide(LALUnit *output, const LALUnit *unit1, const LALUnit *unit2)
LALUnit * XLALUnitMultiply(LALUnit *output, const LALUnit *unit1, const LALUnit *unit2)
#define XLAL_ERROR_VOID(...)
#define XLAL_PRINT_INFO(...)
int int int XLALPrintInfo(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
#define XLAL_CHECK(assertion,...)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
#define XLAL_PRINT_ERROR(...)
LIGOTimeGPS * XLALGPSAdd(LIGOTimeGPS *epoch, REAL8 dt)
int pthread_once(pthread_once_t *once_control, void(*init_routine)(void))
gsl_interp_accel * acc_amp
gsl_interp_accel * acc_phi
struct tagSphHarmFrequencySeries * next
next pointer
COMPLEX16FrequencySeries * mode
The sequences of sampled data.
gsl_bspline_workspace * bwx
gsl_bspline_workspace * bwz
gsl_bspline_workspace * bwy
SEOBNRROMdataDS_submodel * lqhs
SEOBNRROMdataDS_submodel * lowf
SEOBNRROMdataDS_submodel * hqhs
SEOBNRROMdataDS_submodel * hqls
SEOBNRROMdataDS_submodel * lqls