LALSimulation  5.4.0.1-fe68b98
LALSimIMREOBNRv2HMROMUtilities.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Sylvain Marsat
3  * Reduced Order Model for EOBNRv2HM
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with with program; see the file COPYING. If not, write to the
17  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18  * MA 02110-1301 USA
19  */
20 
21 /**
22  * \author Sylvain Marsat
23  *
24  * \file
25  *
26  * \brief C code for structures EOBNRv2HM reduced order model (non-spinning version).
27  * See CQG 31 195010, 2014, arXiv:1402.4146 for details on the reduced order method.
28  * See arXiv:1106.1021 for the EOBNRv2HM model.
29  *
30  * Borrows from the SEOBNR ROM LAL code written by Michael Puerrer and John Veitch.
31  *
32  * The binary data files are available at [TBD].
33  * Put the untared data into a location in your LAL_DATA_PATH.
34  *
35  * Parameter ranges:
36  * q = 1-11.98
37  * No spin
38  * Mtot >= 8Msun for fstart=10Hz
39  *
40  */
41 
42 
43 /*****************************************************************************/
44 /**************************** General definitions ****************************/
45 
46 #define nk_amp 10 /* number of SVD-modes == number of basis functions for amplitude */
47 #define nk_phi 20 /* number of SVD-modes == number of basis functions for phase */
48 
49 /* Contrarily to SEOBNR, the frequencies used by the SVD for each mode are to be loaded as data in the mode-by-mode loop (like the coefficients and reduced basis) */
50 /* Define the number of points in frequency used by the SVD, identical for all modes */
51 #define nbfreq 300
52 /* Define the number of training waveforms used by the SVD, identical for all modes */
53 #define nbwf 301
54 
55 
56 /***************************************************/
57 /*************** Type definitions ******************/
58 
59 typedef struct tagSplineList {
60  gsl_spline* spline; /* The gsl spline */
61  gsl_interp_accel* accel; /* The gsl accelerator */
62  UINT4 i; /* Index in the list */
63  struct tagSplineList* next; /* Pointer to the next list element */
64 } SplineList;
65 
66 typedef struct tagEOBNRHMROMdata
67 {
68  gsl_vector* q;
69  gsl_vector* freq;
70  gsl_matrix* Camp;
71  gsl_matrix* Cphi;
72  gsl_matrix* Bamp;
73  gsl_matrix* Bphi;
74  gsl_vector* shifttime;
75  gsl_vector* shiftphase;
77 
78 typedef struct tagEOBNRHMROMdata_interp
79 {
80  SplineList* Camp_interp; /* List of splines for the amp coefficients - SplineList, index of reduced basis */
81  SplineList* Cphi_interp; /* List of splines for the phase coefficients - SplineList, index of reduced basis */
82  SplineList* shifttime_interp; /* interpolated shift in time - SplineList with one element */
83  SplineList* shiftphase_interp; /* interpolated shift in phase - SplineList with one element */
85 
86 typedef struct tagEOBNRHMROMdata_coeff
87 {
88  gsl_vector* Camp_coeff;
89  gsl_vector* Cphi_coeff;
90  double* shifttime_coeff;
93 
94 typedef struct tagListmodesEOBNRHMROMdata
95 {
96  EOBNRHMROMdata* data; /* The ROM data. */
97  UINT4 l; /* Node mode l */
98  INT4 m; /* Node submode m */
99  struct tagListmodesEOBNRHMROMdata* next; /* next pointer */
101 
102 typedef struct tagListmodesEOBNRHMROMdata_interp
103 {
104  EOBNRHMROMdata_interp* data_interp; /* The splines built from the coefficients. */
105  UINT4 l; /* Node mode l */
106  INT4 m; /* Node submode m */
107  struct tagListmodesEOBNRHMROMdata_interp* next; /* next pointer */
109 
110 
111 /****************************************************************************/
112 /******************************** Prototypes ********************************/
113 
114 /* Function to read data from files */
115 static INT4 Read_Data_Mode(const char dir[], const INT4 mode[2], EOBNRHMROMdata *data);
116 
117 /* Functions to initialize and cleanup data structures */
119 static void EOBNRHMROMdata_interp_Init(EOBNRHMROMdata_interp **data_interp);
120 static void EOBNRHMROMdata_coeff_Init(EOBNRHMROMdata_coeff **data_coeff);
121 
123 static void EOBNRHMROMdata_interp_Cleanup(EOBNRHMROMdata_interp *data_interp);
124 static void EOBNRHMROMdata_coeff_Cleanup(EOBNRHMROMdata_coeff *data_coeff);
125 
126 /* Function to add modes for frequency-domain structures */
128 
129 /* Functions associated to list manipulations */
131  SplineList* appended, /* List structure to prepend to */
132  gsl_spline* spline, /* spline to contain */
133  gsl_interp_accel* accel, /* accelerator to contain */
134  UINT4 i /* index in the list */
135 );
137  SplineList* const splinelist, /* List structure to get a particular mode from */
138  const UINT4 i /* index in the list */
139 );
140 static void SplineList_Destroy(
141  SplineList* list /* List structure to destroy; notice that the content is destroyed too */
142 );
144  ListmodesEOBNRHMROMdata* appended, /* List structure to prepend to */
145  EOBNRHMROMdata* indata, /* data to contain */
146  UINT4 l, /*< major mode number */
147  INT4 m /*< minor mode number */
148 );
150  ListmodesEOBNRHMROMdata* const list, /* List structure to get a particular mode from */
151  UINT4 l, /*< major mode number */
152  INT4 m /*< minor mode number */
153 );
154 /* Note: we do not add a ListmodesEOBNRHMROMdata_Destroy function,
155  * as the only ListmodesEOBNRHMROMdata will be persistent and never destroyed until the program ends */
157  ListmodesEOBNRHMROMdata_interp* appended, /* List structure to prepend to */
158  EOBNRHMROMdata_interp* data, /* data to contain */
159  UINT4 l, /* major mode number */
160  INT4 m /* minor mode number */
161 );
163  ListmodesEOBNRHMROMdata_interp* const list, /* List structure to get a particular mode from */
164  UINT4 l, /*< major mode number */
165  INT4 m /*< minor mode number */
166 );
167 /* Note: we do not add a ListmodesEOBNRHMROMdata_interp_Destroy function,
168  * as the only ListmodesEOBNRHMROMdata_interp will be persistent and never destroyed until the program ends */
169 
170 
171 /************************************************************************************/
172 /******************************** Internal functions ********************************/
173 
174 /* Read binary ROM data for frequency vectors, coefficients matrices, basis functions matrices, and shiftvectors in time and phase */
175 static INT4 Read_Data_Mode(const char dir[], const INT4 mode[2], EOBNRHMROMdata *data) {
176  /* Load binary data for amplitude and phase spline coefficients as computed in Mathematica */
177  INT4 ret = XLAL_SUCCESS;
178  size_t size = strlen(dir) + 64;
179  char *file_q = XLALMalloc(size);
180  char *file_freq = XLALMalloc(size);
181  char *file_Camp = XLALMalloc(size);
182  char *file_Cphi = XLALMalloc(size);
183  char *file_Bamp = XLALMalloc(size);
184  char *file_Bphi = XLALMalloc(size);
185  char *file_shifttime = XLALMalloc(size);
186  char *file_shiftphase = XLALMalloc(size);
187  snprintf(file_q, size, "%s", "EOBNRv2HMROM_q.dat"); /* The q vector is the same for all modes */
188  snprintf(file_freq, size, "%s%d%d%s", "EOBNRv2HMROM_freq_", mode[0], mode[1], ".dat");
189  snprintf(file_Camp, size, "%s%d%d%s", "EOBNRv2HMROM_Camp_", mode[0], mode[1], ".dat");
190  snprintf(file_Cphi, size, "%s%d%d%s", "EOBNRv2HMROM_Cphi_", mode[0], mode[1], ".dat");
191  snprintf(file_Bamp, size, "%s%d%d%s", "EOBNRv2HMROM_Bamp_", mode[0], mode[1], ".dat");
192  snprintf(file_Bphi, size, "%s%d%d%s", "EOBNRv2HMROM_Bphi_", mode[0], mode[1], ".dat");
193  snprintf(file_shifttime, size, "%s%d%d%s", "EOBNRv2HMROM_shifttime_", mode[0], mode[1], ".dat");
194  snprintf(file_shiftphase, size, "%s%d%d%s", "EOBNRv2HMROM_shiftphase_", mode[0], mode[1], ".dat");
195  ret |= read_vector(dir, file_q, data->q);
196  ret |= read_vector(dir, file_freq, data->freq);
197  ret |= read_matrix(dir, file_Camp, data->Camp);
198  ret |= read_matrix(dir, file_Cphi, data->Cphi);
199  ret |= read_matrix(dir, file_Bamp, data->Bamp);
200  ret |= read_matrix(dir, file_Bphi, data->Bphi);
201  ret |= read_vector(dir, file_shifttime, data->shifttime);
202  ret |= read_vector(dir, file_shiftphase, data->shiftphase);
203  XLALFree(file_q);
204  XLALFree(file_freq);
205  XLALFree(file_Camp);
206  XLALFree(file_Cphi);
207  XLALFree(file_Bamp);
208  XLALFree(file_Bphi);
209  XLALFree(file_shifttime);
210  XLALFree(file_shiftphase);
211  return(ret);
212 }
213 
214 
215 /********************* Functions to initialize and cleanup data structures ********************/
217  if(!data) exit(1);
218  /* Create storage for structures */
219  if(!*data) *data=XLALMalloc(sizeof(EOBNRHMROMdata));
220  else
221  {
223  }
224  (*data)->q = gsl_vector_alloc(nbwf);
225  (*data)->freq = gsl_vector_alloc(nbfreq);
226  (*data)->Camp = gsl_matrix_alloc(nk_amp,nbwf);
227  (*data)->Cphi = gsl_matrix_alloc(nk_phi,nbwf);
228  (*data)->Bamp = gsl_matrix_alloc(nbfreq,nk_amp);
229  (*data)->Bphi = gsl_matrix_alloc(nbfreq,nk_phi);
230  (*data)->shifttime = gsl_vector_alloc(nbwf);
231  (*data)->shiftphase = gsl_vector_alloc(nbwf);
232 }
234  if(!data_interp) exit(1);
235  /* Create storage for structures */
236  if(!*data_interp) *data_interp=XLALMalloc(sizeof(EOBNRHMROMdata_interp));
237  else
238  {
239  EOBNRHMROMdata_interp_Cleanup(*data_interp);
240  }
241  (*data_interp)->Camp_interp = NULL;
242  (*data_interp)->Cphi_interp = NULL;
243  (*data_interp)->shifttime_interp = NULL;
244  (*data_interp)->shiftphase_interp = NULL;
245 }
247  if(!data_coeff) exit(1);
248  /* Create storage for structures */
249  if(!*data_coeff) *data_coeff=XLALMalloc(sizeof(EOBNRHMROMdata_coeff));
250  else
251  {
252  EOBNRHMROMdata_coeff_Cleanup(*data_coeff);
253  }
254  (*data_coeff)->Camp_coeff = gsl_vector_alloc(nk_amp);
255  (*data_coeff)->Cphi_coeff = gsl_vector_alloc(nk_phi);
256  (*data_coeff)->shifttime_coeff = XLALMalloc(sizeof(double));
257  (*data_coeff)->shiftphase_coeff = XLALMalloc(sizeof(double));
258 }
259 static void EOBNRHMROMdata_Cleanup(EOBNRHMROMdata *data /* data to destroy */) {
260  if(data->q) gsl_vector_free(data->q);
261  if(data->freq) gsl_vector_free(data->freq);
262  if(data->Camp) gsl_matrix_free(data->Camp);
263  if(data->Cphi) gsl_matrix_free(data->Cphi);
264  if(data->Bamp) gsl_matrix_free(data->Bamp);
265  if(data->Bphi) gsl_matrix_free(data->Bphi);
266  if(data->shifttime) gsl_vector_free(data->shifttime);
267  if(data->shiftphase) gsl_vector_free(data->shiftphase);
268  XLALFree(data);
269 }
271  if(data_coeff->Camp_coeff) gsl_vector_free(data_coeff->Camp_coeff);
272  if(data_coeff->Cphi_coeff) gsl_vector_free(data_coeff->Cphi_coeff);
273  if(data_coeff->shifttime_coeff) free(data_coeff->shifttime_coeff);
274  if(data_coeff->shiftphase_coeff) free(data_coeff->shiftphase_coeff);
275  XLALFree(data_coeff);
276 }
278  if(data_interp->Camp_interp) SplineList_Destroy(data_interp->Camp_interp);
279  if(data_interp->Cphi_interp) SplineList_Destroy(data_interp->Cphi_interp);
280  if(data_interp->shifttime_interp) SplineList_Destroy(data_interp->shifttime_interp);
281  if(data_interp->shiftphase_interp) SplineList_Destroy(data_interp->shiftphase_interp);
282  XLALFree(data_interp);
283 }
284 
285 
286 /********************* Function to add modes for frequency-domain structures ********************/
287 
288 /* Helper function to add a mode to hplus, hcross in Fourier domain
289  * - copies the function XLALSimAddMode, which was done only for TD structures */
291  /* Deleted the definition of the string 'func': usage ? */
292  COMPLEX16 Y;
293  UINT4 j;
294  COMPLEX16 hlmtildevalue;
295 
296  /* Checks LAL_CHECK_VALID_SERIES and LAL_CHECK_CONSISTENT_TIME_SERIES removed
297  * - they do not seem available for frequency series ? */
298 
299  INT4 minus1l; /* (-1)^l */
300  if ( l%2 ) minus1l = -1;
301  else minus1l = 1;
302  if ( sym ) { /* equatorial symmetry: add in -m mode */
303  Y = XLALSpinWeightedSphericalHarmonic(theta, phi, -2, l, m);
304  COMPLEX16 Ymstar = conj(XLALSpinWeightedSphericalHarmonic(theta, phi, -2, l, -m));
305  COMPLEX16 factorp = 1./2*(Y + minus1l*Ymstar);
306  COMPLEX16 factorc = I/2*(Y - minus1l*Ymstar);
307  COMPLEX16* datap = hptilde->data->data;
308  COMPLEX16* datac = hctilde->data->data;
309  for ( j = 0; j < hlmtilde->data->length; ++j ) {
310  hlmtildevalue = (hlmtilde->data->data[j]);
311  datap[j] += factorp*hlmtildevalue;
312  datac[j] += factorc*hlmtildevalue;
313  }
314  }
315  else { /* not adding in the -m mode */
316  Y = XLALSpinWeightedSphericalHarmonic(theta, phi, -2, l, m);
317  COMPLEX16 factorp = 1./2*Y;
318  COMPLEX16 factorc = I/2*Y;
319  COMPLEX16* datap = hptilde->data->data;
320  COMPLEX16* datac = hctilde->data->data;
321  for ( j = 0; j < hlmtilde->data->length; ++j ) {
322  hlmtildevalue = (hlmtilde->data->data[j]);
323  datap[j] += factorp*hlmtildevalue;
324  datac[j] += factorc*hlmtildevalue;
325  }
326  }
327 
328  return 0;
329 }
330 
331 /********************* Functions for list structures ********************/
332 
333 /***************** Functions for the SplineList structure ****************/
334 
335 /* Prepend a node to a linked list of splines, or create a new head */
337  SplineList* appended, /* List structure to prepend to */
338  gsl_spline* spline, /* spline to contain */
339  gsl_interp_accel* accel, /* accelerator to contain */
340  UINT4 i /* index in the list */)
341 {
342  SplineList* splinelist;
343  /* Check if the node with this index already exists */
344  splinelist = appended;
345  while( splinelist ){
346  if( i == splinelist->i ){
347  break;
348  }
349  splinelist = splinelist->next;
350  }
351  if( splinelist ){ /* We don't allow for the case where the index already exists*/
352  XLALPrintError("Error: Tried to add an already existing index to a SplineList");
353  return(NULL);
354  } else { /* In that case, we do NOT COPY the input spline, which therefore can't be
355  used anywhere else; this will be acceptable as these operations will only be done
356  when initializing the data */
357  splinelist = XLALMalloc( sizeof(SplineList) );
358  }
359  splinelist->i = i;
360  if( spline ){
361  splinelist->spline = spline;
362  } else {
363  splinelist->spline = NULL;
364  }
365  if( accel ){
366  splinelist->accel = accel;
367  } else {
368  splinelist->accel = NULL;
369  }
370  if( appended ){
371  splinelist->next = appended;
372  } else {
373  splinelist->next = NULL;
374  }
375  return splinelist;
376 }
377 /* Get the element of a SplineList with a given index */
379  SplineList* const splinelist, /* List structure to get element from */
380  const UINT4 i ) /* Index looked for */
381 {
382  if( !splinelist ) return NULL;
383 
384  SplineList* itr = splinelist;
385  while( itr->i != i ){
386  itr = itr->next;
387  if( !itr ) return NULL;
388  }
389  return itr; /* The element returned is itself a pointer to a SplineList */
390 }
391 /* Delete list from given pointer to the end of the list */
392 static void SplineList_Destroy( SplineList* splinelist ) /* Head of linked list to destroy */
393 {
394  SplineList* pop;
395  while( (pop = splinelist) ){
396  if( pop->spline ){ /* Internal spline and accelerator are freed */
397  gsl_spline_free( pop->spline );
398  }
399  if( pop->accel ){
400  gsl_interp_accel_free( pop->accel );
401  }
402  /* Notice that the index i is not freed, like in SphHarmTimeSeries struct indices l and m */
403  splinelist = pop->next;
404  XLALFree( pop );
405  }
406 }
407 
408 /***************** Functions for the ListmodesEOBNRHMROMdata structure ****************/
410  ListmodesEOBNRHMROMdata* appended, /* List structure to prepend to */
411  EOBNRHMROMdata* data, /* data to contain */
412  const UINT4 l, /* major mode number */
413  const INT4 m /* minor mode number */)
414 {
416  /* Check if the node with this mode already exists */
417  list = appended;
418  while( list ){
419  if( l == list->l && m == list->m ){
420  break;
421  }
422  list = list->next;
423  }
424  if( list ){ /* We don't allow for the case where the mode already exists in the list*/
425  XLALPrintError("Error: Tried to add an already existing mode to a ListmodesEOBNRHMROMdata ");
426  return(NULL);
427  } else { /* In that case, we do NOT COPY the input interpolated data, which therefore can't be
428  used anywhere else; this will be acceptable as these operations will only be done
429  when interpolating the initialization data */
430  list = XLALMalloc( sizeof(ListmodesEOBNRHMROMdata) );
431  }
432  list->l = l;
433  list->m = m;
434  if( data ){
435  list->data = data;
436  } else {
437  list->data = NULL;
438  }
439  if( appended ){
440  list->next = appended;
441  } else {
442  list->next = NULL;
443  }
444  return list;
445 }
446 /* Get the element of a ListmodesEOBNRHMROMdata with a given index */
448  ListmodesEOBNRHMROMdata* const list, /* List structure to get a particular mode from */
449  UINT4 l, /*< major mode number */
450  INT4 m /*< minor mode number */ )
451 {
452  if( !list ) return NULL;
453 
454  ListmodesEOBNRHMROMdata *itr = list;
455  while( itr->l != l || itr->m != m ){
456  itr = itr->next;
457  if( !itr ) return NULL;
458  }
459  return itr; /* The element returned is itself a pointer to a ListmodesEOBNRHMROMdata */
460 }
461 /* Note: we do not add a ListmodesEOBNRHMROMdata_Destroy function,
462  * as the only ListmodesEOBNRHMROMdata will be persistent and never destroyed until the program ends */
463 
464 
465 /***************** Functions for the ListmodesEOBNRHMROMdata_interp structure ****************/
467  ListmodesEOBNRHMROMdata_interp* appended, /* List structure to prepend to */
468  EOBNRHMROMdata_interp* data_interp, /* data to contain */
469  UINT4 l, /* major mode number */
470  INT4 m /* minor mode number */)
471 {
473  /* Check if the node with this mode already exists */
474  list = appended;
475  while( list ){
476  if( l == list->l && m == list->m ){
477  break;
478  }
479  list = list->next;
480  }
481  if( list ){ /* We don't allow for the case where the mode already exists in the list*/
482  XLALPrintError("Error: Tried to add an already existing mode to a ListmodesEOBNRHMROMdata_interp ");
483  return(NULL);
484  } else { /* In that case, we do NOT COPY the input interpolated data, which therefore can't be
485  used anywhere else; this will be acceptable as these operations will only be done
486  when interpolating the initialization data */
487  list = XLALMalloc( sizeof(ListmodesEOBNRHMROMdata_interp) );
488  }
489  list->l = l;
490  list->m = m;
491  if( data_interp ){
492  list->data_interp = data_interp;
493  } else {
494  list->data_interp = NULL;
495  }
496  if( appended ){
497  list->next = appended;
498  } else {
499  list->next = NULL;
500  }
501  return list;
502 }
503 /* Get the element of a ListmodesEOBNRHMROMdata with a given index */
505  ListmodesEOBNRHMROMdata_interp* const list, /* List structure to get a particular mode from */
506  UINT4 l, /*< major mode number */
507  INT4 m /*< minor mode number */ )
508 {
509  if( !list ) return NULL;
510 
511  ListmodesEOBNRHMROMdata_interp *itr = list;
512  while( itr->l != l || itr->m != m ){
513  itr = itr->next;
514  if( !itr ) return NULL;
515  }
516  return itr; /* The element returned is itself a pointer to a ListmodesEOBNRHMROMdata_interp */
517 }
518 /* Note: we do not add a ListmodesEOBNRHMROMdata_interp_Destroy function,
519  * as the only ListmodesEOBNRHMROMdata_interp will be persistent and never destroyed until the program ends */
static SplineList * SplineList_GetElement(SplineList *const splinelist, const UINT4 i)
static void SplineList_Destroy(SplineList *list)
static void EOBNRHMROMdata_coeff_Init(EOBNRHMROMdata_coeff **data_coeff)
static void EOBNRHMROMdata_interp_Cleanup(EOBNRHMROMdata_interp *data_interp)
static ListmodesEOBNRHMROMdata * ListmodesEOBNRHMROMdata_GetMode(ListmodesEOBNRHMROMdata *const list, UINT4 l, INT4 m)
static void EOBNRHMROMdata_Cleanup(EOBNRHMROMdata *data)
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)
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)
int l
Definition: bh_qnmode.c:135
double i
Definition: bh_ringdown.c:118
double theta
Definition: bh_sphwf.c:118
sigmaKerr data[0]
double complex COMPLEX16
double REAL8
uint32_t UINT4
int32_t INT4
void * XLALMalloc(size_t n)
void XLALFree(void *p)
static const INT4 m
COMPLEX16 XLALSpinWeightedSphericalHarmonic(REAL8 theta, REAL8 phi, int s, int l, int m)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
XLAL_SUCCESS
COMPLEX16Sequence * data
COMPLEX16 * data
struct tagListmodesEOBNRHMROMdata_interp * next
struct tagListmodesEOBNRHMROMdata * next
gsl_interp_accel * accel
struct tagSplineList * next