34#include <lal/XLALGSL.h>
35#include <lal/LALInspiral.h>
36#include <lal/LALEOBNRv2Waveform.h>
38#include <gsl/gsl_vector.h>
39#include <gsl/gsl_matrix.h>
40#include <gsl/gsl_spline.h>
41#include <gsl/gsl_linalg.h>
55 return 10.67 - 41.41 * eta + 76.1 * eta*eta;
65 return 3.383 + 3.847 * eta + 8.979 * eta * eta;
75 return 5.57 - 49.86 * eta + 154.3 * eta * eta;
85 return 6.693 - 34.47 * eta + 102.7 * eta*eta;
106 return eta * ( 1.422 + 0.3013 * eta + 1.246 * eta * eta );
110 return eta * sqrt( 1.0 - 4. * eta ) * (0.4832 - 0.01032 * eta);
120 return eta * sqrt(1.-4.*eta) * ( 0.5761 - 0.09638 * eta + 2.715*eta*eta );
130 return eta * (0.354 - 1.779 * eta + 2.834 * eta*eta );
140 return eta * sqrt(1.-4.*eta) * ( 0.1353 - 0.1485 * eta );
161 return -0.01 * eta * ( 0.1679 + 1.44 * eta - 2.001 * eta * eta );
165 return -0.01 * eta * sqrt(1.-4.*eta) * (0.1867 + 0.6094 * eta );
175 return -0.01 * eta * sqrt(1.-4.*eta) * (0.2518 - 0.8145*eta + 5.731*eta*eta);
185 return -0.01 * eta * (0.1813 - 0.9935 * eta + 1.858 * eta * eta );
195 return -0.01 * eta * sqrt(1.-4.*eta) * ( 0.09051 - 0.1604 * eta );
216 return 0.2733 + 0.2316 * eta + 0.4463 * eta * eta;
220 return 0.2907 - 0.08338 * eta + 0.587 * eta*eta;
230 return 0.4539 + 0.5376 * eta + 1.042 * eta*eta;
240 return 0.6435 - 0.05103 * eta + 2.216 * eta*eta;
250 return 0.8217 + 0.2346 * eta + 2.599 * eta*eta;
271 return 0.005862 + 0.01506 * eta + 0.02625 * eta * eta;
275 return 0.00149 + 0.09197 * eta - 0.1909 * eta*eta;
285 return 0.01074 + 0.0293 * eta + 0.02066 * eta*eta;
295 return 0.01486 + 0.08529 * eta - 0.2174 * eta * eta;
305 return 0.01775 + 0.09801 * eta - 0.1686 * eta*eta;
337 if (
l != 2 ||
m != 2 )
345 memset( coeffs, 0,
sizeof( *coeffs ) );
347 coeffs->
a1 = -4.55919 + 18.761 * eta - 24.226 * eta*eta;
348 coeffs->
a2 = 37.683 - 201.468 * eta + 324.591 * eta*eta;
349 coeffs->
a3 = - 39.6024 + 228.899 * eta - 387.222 * eta * eta;
364 REAL8 rOmega, rOmegaSq;
374 rOmegaSq = rOmega*rOmega;
379 mag = 1. + (
p*
p / rOmegaSq) * ( coeffs->a1
380 + coeffs->a2 /
r + coeffs->a3 / (
r*sqrt(
r))
381 + coeffs->a4 / (
r*
r) );
383 phase = coeffs->b1 *
p / rOmega + coeffs->b2 *
p*
p*
p/rOmega;
385 *nqc =
crect( mag * cos(phase), mag * sin(phase) );
422 REAL8 omega, omegaDot;
425 REAL8 nromega, nromegaDot;
427 REAL8 nrDeltaT, nrTimePeak;
430 gsl_spline *spline = NULL;
431 gsl_interp_accel *acc = NULL;
434 gsl_matrix *qMatrix = NULL, *pMatrix = NULL;
435 gsl_vector *aCoeff = NULL, *bCoeff = NULL;
437 gsl_vector *amps = NULL, *omegaVec = NULL;
439 gsl_permutation *perm1 = NULL, *perm2 = NULL;
453 for (
i = 0;
i < time->length;
i++ )
456 q1LM->
data[
i] = q1->data[
i] * amplitude->data[
i];
457 q2LM->
data[
i] = q2->data[
i] * amplitude->data[
i];
458 q3LM->
data[
i] = q3->data[
i] * amplitude->data[
i];
464 qMatrix = gsl_matrix_alloc( 3, 3 );
465 aCoeff = gsl_vector_alloc( 3 );
466 amps = gsl_vector_alloc( 3 );
467 perm1 = gsl_permutation_alloc( 3 );
470 pMatrix = gsl_matrix_alloc( 2, 2 );
471 bCoeff = gsl_vector_alloc( 2 );
472 omegaVec = gsl_vector_alloc( 2 );
473 perm2 = gsl_permutation_alloc( 2 );
476 if ( !qMatrix || !aCoeff || !amps || !pMatrix || !bCoeff || !omegaVec )
478 gsl_matrix_free( qMatrix );
479 gsl_vector_free( amps );
480 gsl_vector_free( aCoeff );
481 gsl_permutation_free( perm1 );
482 gsl_matrix_free( pMatrix );
483 gsl_vector_free( omegaVec );
484 gsl_vector_free( bCoeff );
485 gsl_permutation_free( perm2 );
501 nrTimePeak = timePeak + nrDeltaT;
505 spline = gsl_spline_alloc( gsl_interp_cspline, amplitude->length );
506 acc = gsl_interp_accel_alloc();
509 gsl_spline_init( spline, time->data, q1LM->
data, q1LM->
length );
510 gsl_matrix_set( qMatrix, 0, 0, gsl_spline_eval( spline, nrTimePeak, acc ) );
511 gsl_matrix_set( qMatrix, 1, 0, gsl_spline_eval_deriv( spline, nrTimePeak, acc ) );
512 gsl_matrix_set( qMatrix, 2, 0, gsl_spline_eval_deriv2( spline, nrTimePeak, acc ) );
515 gsl_spline_init( spline, time->data, q2LM->
data, q2LM->
length );
516 gsl_interp_accel_reset( acc );
517 gsl_matrix_set( qMatrix, 0, 1, gsl_spline_eval( spline, nrTimePeak, acc ) );
518 gsl_matrix_set( qMatrix, 1, 1, gsl_spline_eval_deriv( spline, nrTimePeak, acc ) );
519 gsl_matrix_set( qMatrix, 2, 1, gsl_spline_eval_deriv2( spline, nrTimePeak, acc ) );
522 gsl_spline_init( spline, time->data, q3LM->
data, q3LM->
length );
523 gsl_interp_accel_reset( acc );
524 gsl_matrix_set( qMatrix, 0, 2, gsl_spline_eval( spline, nrTimePeak, acc ) );
525 gsl_matrix_set( qMatrix, 1, 2, gsl_spline_eval_deriv( spline, nrTimePeak, acc ) );
526 gsl_matrix_set( qMatrix, 2, 2, gsl_spline_eval_deriv2( spline, nrTimePeak, acc ) );
529 gsl_spline_init( spline, time->data, amplitude->data, amplitude->length );
530 gsl_interp_accel_reset( acc );
531 a = gsl_spline_eval( spline, nrTimePeak, acc );
532 aDot = gsl_spline_eval_deriv( spline, nrTimePeak, acc );
533 aDDot = gsl_spline_eval_deriv2( spline, nrTimePeak, acc );
543 gsl_vector_set( amps, 0, nra -
a );
544 gsl_vector_set( amps, 1, - aDot );
545 gsl_vector_set( amps, 2, nraDDot - aDDot );
549 gsl_linalg_LU_decomp( qMatrix, perm1, &signum );
550 gsl_linalg_LU_solve( qMatrix, perm1, amps, aCoeff );
555 gsl_spline_init( spline, time->data, p1->data, p1->length );
556 gsl_interp_accel_reset( acc );
557 gsl_matrix_set( pMatrix, 0, 0, - gsl_spline_eval_deriv( spline, nrTimePeak, acc ) );
558 gsl_matrix_set( pMatrix, 1, 0, - gsl_spline_eval_deriv2( spline, nrTimePeak, acc ) );
561 gsl_spline_init( spline, time->data, p2->data, p2->length );
562 gsl_interp_accel_reset( acc );
563 gsl_matrix_set( pMatrix, 0, 1, - gsl_spline_eval_deriv( spline, nrTimePeak, acc ) );
564 gsl_matrix_set( pMatrix, 1, 1, - gsl_spline_eval_deriv2( spline, nrTimePeak, acc ) );
567 gsl_spline_init( spline, time->data, phase->data, phase->length );
568 gsl_interp_accel_reset( acc );
569 omega = gsl_spline_eval_deriv( spline, nrTimePeak, acc );
570 omegaDot = gsl_spline_eval_deriv2( spline, nrTimePeak, acc );
573 if ( omega * omegaDot > 0.0 )
575 omega = fabs( omega );
576 omegaDot = fabs( omegaDot );
580 omega = fabs( omega );
581 omegaDot = - fabs( omegaDot );
592 gsl_vector_set( omegaVec, 0, nromega - omega );
593 gsl_vector_set( omegaVec, 1, nromegaDot - omegaDot );
596 gsl_linalg_LU_decomp( pMatrix, perm2, &signum );
597 gsl_linalg_LU_solve( pMatrix, perm2, omegaVec, bCoeff );
600 coeffs->a1 = gsl_vector_get( aCoeff, 0 );
601 coeffs->a2 = gsl_vector_get( aCoeff, 1 );
602 coeffs->a3 = gsl_vector_get( aCoeff, 2 );
603 coeffs->b1 = gsl_vector_get( bCoeff, 0 );
604 coeffs->b2 = gsl_vector_get( bCoeff, 1 );
607 gsl_matrix_free( qMatrix );
608 gsl_vector_free( amps );
609 gsl_vector_free( aCoeff );
610 gsl_permutation_free( perm1 );
612 gsl_matrix_free( pMatrix );
613 gsl_vector_free( omegaVec );
614 gsl_vector_free( bCoeff );
615 gsl_permutation_free( perm2 );
617 gsl_spline_free( spline );
618 gsl_interp_accel_free( acc );
static REAL8 GetNRPeakADDot(INT4 l, INT4 m, REAL8 eta)
int XLALCalculateNQCCoefficients(REAL8Vector *restrict amplitude, REAL8Vector *restrict phase, REAL8Vector *restrict q1, REAL8Vector *restrict q2, REAL8Vector *restrict q3, REAL8Vector *restrict p1, REAL8Vector *restrict p2, INT4 l, INT4 m, REAL8 timePeak, REAL8 deltaT, REAL8 eta, EOBNonQCCoeffs *restrict coeffs)
static REAL8 GetNRPeakAmplitude(INT4 l, INT4 m, REAL8 eta)
int XLALEOBNonQCCorrection(COMPLEX16 *restrict nqc, REAL8Vector *restrict values, const REAL8 omega, EOBNonQCCoeffs *restrict coeffs)
static REAL8 GetNRPeakOmega(INT4 l, INT4 m, REAL8 eta)
static REAL8 GetNRPeakOmegaDot(INT4 l, INT4 m, REAL8 eta)
#define XLAL_CALLGSL(statement)
REAL8Vector * XLALCreateREAL8Vector(UINT4 length)
void XLALDestroyREAL8Vector(REAL8Vector *vector)
#define XLAL_ERROR_REAL8(...)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
#define XLAL_IS_REAL8_FAIL_NAN(val)