39 #include <lal/XLALError.h>
41 #include <gsl/gsl_math.h>
42 #include <gsl/gsl_multifit.h>
43 #include <gsl/gsl_interp.h>
44 #include <gsl/gsl_fit.h>
47 #ifdef LAL_HDF5_ENABLED
48 #include <lal/H5FileIO.h>
51 UNUSED
static int read_vector(
const char dir[],
const char fname[], gsl_vector *v);
52 UNUSED
static int read_matrix(
const char dir[],
const char fname[], gsl_matrix *
m);
57 UNUSED
static 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);
66 #ifdef LAL_HDF5_ENABLED
67 UNUSED
static int CheckVectorFromHDF5(
LALH5File *
file,
const char name[],
const double *v,
size_t n);
70 UNUSED
static int ReadHDF5LongVectorDataset(
LALH5File *
file,
const char *
name, gsl_vector_long **
data);
71 UNUSED
static int ReadHDF5LongMatrixDataset(
LALH5File *
file,
const char *
name, gsl_matrix_long **
data);
72 UNUSED
static void PrintInfoStringAttribute(
LALH5File *
file,
const char attribute[]);
73 UNUSED
static int ROM_check_version_number(
LALH5File *
file,
INT4 version_major_in,
INT4 version_minor_in,
INT4 version_micro_in);
74 UNUSED
static int ROM_check_canonical_file_basename(
LALH5File *
file,
const char file_name[],
const char attribute[]);
84 gsl_bspline_workspace *bwx,
85 gsl_bspline_workspace *bwy,
86 gsl_bspline_workspace *bwz
95 gsl_bspline_workspace *bwx,
96 gsl_bspline_workspace *bwy
99 UNUSED
static gsl_vector *
Fit_cubic(
const gsl_vector *xi,
const gsl_vector *yi);
105 const double Mtot_sec,
112 const double Mtot_sec,
120 static int read_vector(
const char dir[],
const char fname[], gsl_vector *v) {
121 size_t size = strlen(dir) + strlen(fname) + 2;
123 snprintf(
path, size,
"%s/%s", dir, fname);
125 FILE *f = fopen(
path,
"rb");
128 int ret = gsl_vector_fread(f, v);
138 static int read_matrix(
const char dir[],
const char fname[], gsl_matrix *
m) {
139 size_t size = strlen(dir) + strlen(fname) + 2;
141 snprintf(
path, size,
"%s/%s", dir, fname);
143 FILE *f = fopen(
path,
"rb");
146 int ret = gsl_matrix_fread(f,
m);
156 #ifdef LAL_HDF5_ENABLED
157 static int CheckVectorFromHDF5(
LALH5File *
file,
const char name[],
const double *v,
size_t n) {
158 gsl_vector *temp = NULL;
159 ReadHDF5RealVectorDataset(
file,
name, &temp);
164 for (
size_t i=0;
i<temp->size;
i++)
165 if (gsl_vector_get(temp,
i) != v[
i])
167 gsl_vector_free(temp);
189 if (dimLength == NULL) {
193 if (dimLength->
length != 1) {
198 n = dimLength->
data[0];
202 *
data = gsl_vector_alloc(n);
208 else if ((*data)->size != n) {
241 if (dimLength == NULL) {
245 if (dimLength->
length != 2) {
250 n1 = dimLength->
data[0];
251 n2 = dimLength->
data[1];
255 *
data = gsl_matrix_alloc(n1, n2);
261 else if ((*data)->size1 != n1 || (*data)->size2 != n2) {
294 if (dimLength == NULL) {
298 if (dimLength->
length != 1) {
303 n = dimLength->
data[0];
307 *
data = gsl_vector_long_alloc(n);
313 else if ((*data)->size != n) {
346 if (dimLength == NULL) {
350 if (dimLength->
length != 2) {
355 n1 = dimLength->
data[0];
356 n2 = dimLength->
data[1];
360 *
data = gsl_matrix_long_alloc(n1, n2);
366 else if ((*data)->size1 != n1 || (*data)->size2 != n2) {
381 static void PrintInfoStringAttribute(
LALH5File *
file,
const char attribute[]) {
390 static int ROM_check_version_number(
LALH5File *
file,
INT4 version_major_in,
INT4 version_minor_in,
INT4 version_micro_in) {
400 if ((version_major_in != version_major) || (version_minor_in != version_minor) || (version_micro_in != version_micro)) {
402 version_major_in, version_minor_in, version_micro_in, version_major, version_minor, version_micro);
405 XLALPrintInfo(
"Reading ROM data version %d.%d.%d.\n", version_major, version_minor, version_micro);
410 static int ROM_check_canonical_file_basename(
LALH5File *
file,
const char file_name[],
const char attribute[]) {
414 char *canonical_file_basename =
XLALMalloc(len);
417 if (strcmp(canonical_file_basename,
file_name) != 0) {
422 XLALPrintInfo(
"ROM canonical_file_basename %s\n", canonical_file_basename);
439 gsl_bspline_workspace *bwx,
440 gsl_bspline_workspace *bwy,
441 gsl_bspline_workspace *bwz
444 gsl_vector *Bx4 = gsl_vector_alloc(4);
445 gsl_vector *By4 = gsl_vector_alloc(4);
446 gsl_vector *Bz4 = gsl_vector_alloc(4);
448 size_t isx, isy, isz;
449 size_t iex, iey, iez;
455 gsl_bspline_eval_nonzero(eta, Bx4, &isx, &iex, bwx);
456 gsl_bspline_eval_nonzero(chi1, By4, &isy, &iey, bwy);
457 gsl_bspline_eval_nonzero(chi2, Bz4, &isz, &iez, bwz);
466 for (
int i=0;
i<4;
i++)
467 for (
int j=0; j<4; j++)
468 for (
int k=0; k<4; k++) {
472 double cijk = gsl_vector_get(v, (ii*ncy + jj)*ncz + kk);
473 sum += cijk * gsl_vector_get(Bx4,
i) * gsl_vector_get(By4, j) * gsl_vector_get(Bz4, k);
476 gsl_vector_free(Bx4);
477 gsl_vector_free(By4);
478 gsl_vector_free(Bz4);
492 gsl_bspline_workspace *bwx,
493 gsl_bspline_workspace *bwy
495 gsl_matrix
c = gsl_matrix_view_vector(v, ncx, ncy).matrix;
498 gsl_vector *Bx4 = gsl_vector_alloc(4);
499 gsl_vector *By4 = gsl_vector_alloc(4);
508 gsl_bspline_eval_nonzero(eta, Bx4, &isx, &iex, bwx);
509 gsl_bspline_eval_nonzero(chi, By4, &isy, &iey, bwy);
513 for (
int i=0;
i<4;
i++)
514 for (
int j=0; j<4; j++)
515 sum += gsl_matrix_get(&
c, isx +
i, isy + j) * gsl_vector_get(Bx4,
i) * gsl_vector_get(By4, j);
517 gsl_vector_free(Bx4);
518 gsl_vector_free(By4);
524 static gsl_vector *
Fit_cubic(
const gsl_vector *xi,
const gsl_vector *yi) {
525 const int n = xi->size;
528 gsl_matrix *X = gsl_matrix_alloc(n,
p);
529 gsl_vector *
y = gsl_vector_alloc(n);
530 gsl_vector *
c = gsl_vector_alloc(
p);
531 gsl_matrix *cov = gsl_matrix_alloc(
p,
p);
534 for (
int i=0;
i < n;
i++) {
535 double xval = gsl_vector_get(xi,
i);
536 double xval2 = xval*xval;
537 double xval3 = xval2*xval;
538 gsl_matrix_set(X,
i, 0, 1.0);
539 gsl_matrix_set(X,
i, 1, xval);
540 gsl_matrix_set(X,
i, 2, xval2);
541 gsl_matrix_set(X,
i, 3, xval3);
543 double yval = gsl_vector_get(yi,
i);
544 gsl_vector_set (
y,
i, yval);
547 gsl_multifit_linear_workspace *work = gsl_multifit_linear_alloc(n,
p);
548 gsl_multifit_linear(X,
y,
c, cov, &chisq, work);
551 gsl_multifit_linear_free(work);
553 gsl_matrix_free(cov);
562 return !gsl_fcmp(
x,
y, epsilon);
575 if (fabs(*
x - X) < epsilon)
582 const double Mtot_sec,
590 double m1_SI = Mtot_SI *
q / (1. +
q);
591 double m2_SI = Mtot_SI * 1. / (1. +
q);
597 const double Mtot_sec,
604 double q = (1. + sqrt(1. - 4. * eta) - 2. * eta) / (2. * eta);
620 for(
i=0 ;
i<count ;
i++)
621 len += strlen(va_arg(ap,
char*));
630 for(
i=0 ;
i<count ;
i++)
632 char *
s = va_arg(ap,
char*);
633 strcpy(merged+null_pos,
s);
634 null_pos += strlen(
s);
651 return_value = 1 / (1 + exp_value);
658 for(
unsigned int i = 0;
i < freqs->size;
i++){
659 if(freqs->data[
i] <= freq_1){
660 out_fun->data[
i] = 0.;
662 else if((freqs->data[
i]>freq_1) && (freqs->data[
i]<freq_2)){
663 out_fun->data[
i] =
sigmoid(- (freq_2 - freq_1)/(freqs->data[
i]-freq_1) - (freq_2 - freq_1)/(freqs->data[
i]-freq_2));
666 out_fun->data[
i] = 1.;
675 for(
unsigned int i = 0;
i < freqs_in_1->size;
i++){
676 if(freqs_in_1->data[
i]<freq_1){
680 for(
unsigned int i = freqs_in_2->size -1;
i > 0;
i--){
681 if(freqs_in_2->data[
i]>=freq_1){
691 REAL8 diff = fabs(freq-freq_array->data[index]);
692 for(
unsigned int i = 1;
i < freq_array->size;
i++){
693 if(fabs(freq-freq_array->data[
i])< diff){
694 diff = fabs(freq-freq_array->data[
i]);
702 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){
704 gsl_vector *bld_2 = gsl_vector_calloc(out_fun->size);
707 UNUSED
UINT4 ret =
blend(freqs_out, bld_2,freq_1,freq_2);
709 gsl_interp_accel *acc = gsl_interp_accel_alloc ();
710 gsl_spline *spline = gsl_spline_alloc (gsl_interp_cspline, freq_in_1->size);
711 gsl_spline_init (spline, freq_in_1->data, fun_in_1->data, freq_in_1->size);
720 while(freqs_out->data[
i]<=freq_2){
722 inter_func = gsl_spline_eval (spline, freqs_out->data[
i], acc);
724 out_fun->data[
i] = inter_func*(1.-bld_2->data[
i]);
727 gsl_spline_free (spline);
732 spline = gsl_spline_alloc (gsl_interp_cspline, freq_in_2->size);
733 gsl_spline_init (spline, freq_in_2->data, fun_in_2->data, freq_in_2->size);
734 i = freqs_out->size-1;
735 while(freqs_out->data[
i]>freq_2){
736 inter_func = gsl_spline_eval (spline, freqs_out->data[
i], acc);
737 out_fun->data[
i] = inter_func;
743 while((freqs_out->data[
i]>=freq_1)&&(freqs_out->data[
i]<=freq_2)){
744 inter_func = gsl_spline_eval (spline, freqs_out->data[
i], acc);
745 out_fun->data[
i] += inter_func*bld_2->data[
i];
751 gsl_vector_free(bld_2);
752 gsl_spline_free (spline);
753 gsl_interp_accel_free(acc);
765 if((f_align_start<f_array_1->
data[0]) || (f_align_start<f_array_2->
data[0]) || (f_align_end>f_array_1->data[f_array_1->size-1]) || (f_align_end>f_array_2->data[f_array_2->size-1])) {
772 gsl_interp_accel *acc_1 = gsl_interp_accel_alloc();
773 gsl_spline *spline_1 = gsl_spline_alloc(gsl_interp_cspline, phase_1->size);
774 gsl_spline_init(spline_1, f_array_1->data, phase_1->data, phase_1->size);
775 gsl_interp_accel *acc_2 = gsl_interp_accel_alloc();
776 gsl_spline *spline_2 = gsl_spline_alloc(gsl_interp_cspline, phase_2->size);
777 gsl_spline_init(spline_2, f_array_2->data, phase_2->data, phase_2->size);
778 gsl_vector* delta_phi = gsl_vector_alloc(npt_fit);
779 gsl_vector* freq_delta_phi = gsl_vector_alloc(npt_fit);
782 for(
unsigned int i=0;
i<freq_delta_phi->size;
i++){
783 f = f_align_start + ((double)
i)/(freq_delta_phi->size - 1) * (f_align_end-f_align_start);
784 freq_delta_phi->data[
i] = f;
785 delta_phi->data[
i] = gsl_spline_eval(spline_2, f, acc_2) - gsl_spline_eval(spline_1, f, acc_1);
787 REAL8 c0,
c1, cov00, cov01, cov11, chisq;
788 gsl_fit_linear(freq_delta_phi->data, 1, delta_phi->data, 1, freq_delta_phi->size, &
c0, &
c1, &cov00, &cov01, &cov11, &chisq);
793 for(
unsigned int i = 0;
i < f_array_1->size;
i++){
794 phase_1->data[
i] = phase_1->data[
i] + (
c1*f_array_1->data[
i] +
c0);
797 gsl_vector_free(delta_phi);
798 gsl_vector_free(freq_delta_phi);
799 gsl_spline_free(spline_1);
800 gsl_interp_accel_free(acc_1);
801 gsl_spline_free(spline_2);
802 gsl_interp_accel_free(acc_2);
817 gsl_vector_fprintf(
fp, v,
"%g");
823 for (
size_t i=0;
i <
s->size;
i++) {
831 const char filename[],
835 gsl_vector *v = gsl_vector_alloc(mode->
data->
length);
836 double (*part_fun_ptr)(
double complex);
838 part_fun_ptr = creal;
840 part_fun_ptr = cimag;
842 gsl_vector_set(v,
i, part_fun_ptr(mode->
data->
data[
i]));
855 if((f_align_start<f_array_1->
data[0]) || (f_align_start<f_array_2->
data[0]) || (f_align_end>f_array_1->data[f_array_1->size-1]) || (f_align_end>f_array_2->data[f_array_2->size-1])) {
862 gsl_interp_accel *acc_1 = gsl_interp_accel_alloc();
863 gsl_spline *spline_1 = gsl_spline_alloc(gsl_interp_cspline, phase_1->size);
864 gsl_spline_init(spline_1, f_array_1->data, phase_1->data, phase_1->size);
865 gsl_interp_accel *acc_2 = gsl_interp_accel_alloc();
866 gsl_spline *spline_2 = gsl_spline_alloc(gsl_interp_cspline, phase_2->size);
867 gsl_spline_init(spline_2, f_array_2->data, phase_2->data, phase_2->size);
868 gsl_vector* delta_phi = gsl_vector_alloc(npt_fit);
869 gsl_vector* freq_delta_phi = gsl_vector_alloc(npt_fit);
872 for(
unsigned int i=0;
i<freq_delta_phi->size;
i++){
873 f = f_align_start + ((double)
i)/(freq_delta_phi->size - 1) * (f_align_end-f_align_start);
874 delta_phi->data[
i] = gsl_spline_eval(spline_2, f, acc_2) - gsl_spline_eval(spline_1, f, acc_1) - (2*
LAL_PI*Deltat22*f + modeM/2.*Deltaphi22);
878 REAL8 av_phase_diff = 0.;
879 for(
unsigned int i = 0;
i < freq_delta_phi->size;
i++){
880 av_phase_diff += delta_phi->data[
i];
882 av_phase_diff = av_phase_diff / (delta_phi->size);
888 for(
unsigned int i = 0;
i < f_array_1->size;
i++){
889 phase_1->data[
i] = phase_1->data[
i] + (2*
LAL_PI*Deltat22*f_array_1->data[
i] + modeM/2.*Deltaphi22 + pishift);
893 gsl_vector_free(delta_phi);
894 gsl_vector_free(freq_delta_phi);
895 gsl_spline_free(spline_1);
896 gsl_interp_accel_free(acc_1);
897 gsl_spline_free(spline_2);
898 gsl_interp_accel_free(acc_2);
915 modefreqVec.
data = &modeFreq;
916 REAL8 spin1[3] = {0., 0., chi1z};
917 REAL8 spin2[3] = {0., 0., chi2z};
920 return Ms * creal(modefreqVec.
data[0]);
934 modefreqVec.
data = &modeFreq;
935 REAL8 spin1[3] = {0., 0., chi1z};
936 REAL8 spin2[3] = {0., 0., chi2z};
939 return Ms * creal(modefreqVec.
data[0]);
945 gsl_vector* phaseout,
948 int N = phasein->size;
949 double*
p = phasein->data;
950 double* pmod = (
double*) malloc(
sizeof(
double) *
N);
951 int* jumps = (
int*) malloc(
sizeof(
int) *
N);
952 int* cumul = (
int*) malloc(
sizeof(
int) *
N);
955 for(
int i=0;
i<
N;
i++) {
962 for(
int i=1;
i<
N;
i++) {
963 d = pmod[
i] - pmod[
i-1];
972 for(
int i=1;
i<
N;
i++) {
978 double* pout = phaseout->data;
979 for(
int i=0;
i<
N;
i++) {
struct tagLALH5File LALH5File
struct tagLALH5Dataset LALH5Dataset
INT4 XLALSimIMREOBGenerateQNMFreqV5(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,...
static UNUSED void test_save_gsl_vector(const char filename[], gsl_vector *v)
static UNUSED UINT8 compute_i_at_f(gsl_vector *freq_array, REAL8 freq)
static UNUSED gsl_vector * Fit_cubic(const gsl_vector *xi, const gsl_vector *yi)
static UNUSED void nudge(REAL8 *x, REAL8 X, REAL8 epsilon)
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 REAL8 Get_omegaQNM_SEOBNRv5(REAL8 q, REAL8 chi1z, REAL8 chi2z, UINT4 l, UINT4 m)
static UNUSED double SEOBNRROM_Ringdown_Mf_From_Mtot_q(const double Mtot_sec, const double q, const double chi1, const double chi2, Approximant apx)
static UNUSED void test_save_gsl_spline(const char filename[], gsl_spline *s)
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 int read_vector(const char dir[], const char fname[], gsl_vector *v)
static UNUSED void test_save_cmplx_freq_series(COMPLEX16FrequencySeries *mode, const char filename[], bool save_real_part)
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 UINT4 blend(gsl_vector *freqs, gsl_vector *out_fun, REAL8 freq_1, REAL8 freq_2)
static UNUSED double SEOBNRROM_Ringdown_Mf_From_Mtot_Eta(const double Mtot_sec, const double eta, const double chi1, const double chi2, Approximant apx)
static UNUSED char * concatenate_strings(int count,...)
static UNUSED REAL8 sigmoid(REAL8 x)
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 int read_matrix(const char dir[], const char fname[], gsl_matrix *m)
static UNUSED REAL8 Interpolate_Coefficent_Matrix(gsl_vector *v, REAL8 eta, REAL8 chi, int ncx, int ncy, gsl_bspline_workspace *bwx, gsl_bspline_workspace *bwy)
static UNUSED bool approximately_equal(REAL8 x, REAL8 y, REAL8 epsilon)
double XLALSimInspiralGetFinalFreq(REAL8 m1, REAL8 m2, const REAL8 S1x, const REAL8 S1y, const REAL8 S1z, const REAL8 S2x, const REAL8 S2y, const REAL8 S2z, Approximant approximant)
Function that gives the default ending frequencies of the given approximant.
static vector d(const double L_norm, const double J_norm, const vector roots)
Internal function that returns the coefficients "d_0", "d_2" and "d_4" from 1703.03967 corresponding ...
static REAL8 sum(REAL8 *arr1, REAL8 *arr2, int k)
void XLALH5DatasetFree(LALH5Dataset UNUSED *dset)
UINT4Vector * XLALH5DatasetQueryDims(LALH5Dataset UNUSED *dset)
int XLALH5AttributeQueryStringValue(char UNUSED *value, size_t UNUSED size, const LALH5Generic UNUSED object, const char UNUSED *key)
LALTYPECODE XLALH5DatasetQueryType(LALH5Dataset UNUSED *dset)
int XLALH5AttributeQueryScalarValue(void UNUSED *value, const LALH5Generic UNUSED object, const char UNUSED *key)
LALH5Dataset * XLALH5DatasetRead(LALH5File UNUSED *file, const char UNUSED *name)
int XLALH5DatasetQueryData(void UNUSED *data, LALH5Dataset UNUSED *dset)
int XLALH5FileQueryStringAttributeValue(char UNUSED *value, size_t UNUSED size, LALH5File UNUSED *file, const char UNUSED *key)
void * XLALCalloc(size_t m, size_t n)
void * XLALMalloc(size_t n)
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.
Approximant
Enum that specifies the PN approximant to be used in computing the waveform.
@ SEOBNRv4
Spin nonprecessing EOBNR model v4.
@ SEOBNRv5_ROM
Time domain, precessing phenomenological IMR waveform model with subdominant modes ([arXiv: 20XY....
void XLALDestroyUINT4Vector(UINT4Vector *vector)
#define XLAL_PRINT_INFO(...)
int int int XLALPrintInfo(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1