31#include <gsl/gsl_errno.h>
32#include <gsl/gsl_math.h>
33#include <gsl/gsl_odeiv.h>
34#include <lal/LALStdlib.h>
35#include <lal/LALConstants.h>
36#include <lal/AVFactories.h>
37#include <lal/LALInspiral.h>
38#include <lal/FindChirp.h>
39#include <lal/FindChirpPTF.h>
42#define UNUSED __attribute__ ((unused))
94 const REAL8 omega_1_3 = pow( omega, 1.0/3.0 );
95 const REAL8 omega_2_3 = omega_1_3 * omega_1_3;
96 const REAL8 omega_4_3 = omega * omega_1_3;
97 const REAL8 omega_5_3 = omega_4_3 * omega_1_3;
98 const REAL8 omega_7_3 = omega_5_3 * omega_2_3;
99 const REAL8 omega_6_3 = omega * omega;
100 const REAL8 omega_11_3 = omega_7_3 * omega_4_3;
104 const REAL8 LNhat_coeff = omega_1_3 * pn_params->
LNhat;
107 const REAL8 LNhat_cross_S1_x = LNhaty * S1z - LNhatz * S1y;
108 const REAL8 LNhat_cross_S1_y = LNhatz * S1x - LNhatx * S1z;
109 const REAL8 LNhat_cross_S1_z = LNhatx * S1y - LNhaty * S1x;
112 const REAL8 LNhat_dot_S1 = LNhatx * S1x + LNhaty * S1y + LNhatz * S1z;
115 const REAL8 OmegaLx = - LNhat_coeff * S1_spin_orbit_coeff * S1x;
116 const REAL8 OmegaLy = - LNhat_coeff * S1_spin_orbit_coeff * S1y;
117 const REAL8 OmegaLz = - LNhat_coeff * S1_spin_orbit_coeff * S1z;
120 const REAL8 OmegaL_dot_LNhat =
121 OmegaLx * LNhatx + OmegaLy * LNhaty + OmegaLz * LNhatz;
124 const REAL8 Omegaex = OmegaLx - OmegaL_dot_LNhat * LNhatx;
125 const REAL8 Omegaey = OmegaLy - OmegaL_dot_LNhat * LNhaty;
126 const REAL8 Omegaez = OmegaLz - OmegaL_dot_LNhat * LNhatz;
129 const REAL8 dS1x_dt = S1_spin_orbit_coeff * LNhat_cross_S1_x;
130 const REAL8 dS1y_dt = S1_spin_orbit_coeff * LNhat_cross_S1_y;
131 const REAL8 dS1z_dt = S1_spin_orbit_coeff * LNhat_cross_S1_z;
134 const REAL8 dLNhatx_dt = LNhat_coeff * dS1x_dt;
135 const REAL8 dLNhaty_dt = LNhat_coeff * dS1y_dt;
136 const REAL8 dLNhatz_dt = LNhat_coeff * dS1z_dt;
139 const REAL8 de1x_dt = Omegaey * e1z - Omegaez * e1y;
140 const REAL8 de1y_dt = Omegaez * e1x - Omegaex * e1z;
141 const REAL8 de1z_dt = Omegaex * e1y - Omegaey * e1x;
144 const REAL8 domega_dt = omega_11_3 * (
153 + pn_params->
orbital->
data[7] * omega_6_3 * log( omega )
157 * pn_params->
spin->
data[0] * LNhat_dot_S1) * omega
163 const REAL8 dPhi_dt = omega;
174 dydt[5] = dLNhatx_dt;
175 dydt[6] = dLNhaty_dt;
176 dydt[7] = dLNhatz_dt;
188 REAL4 m_total = m1 + m2;
189 REAL4 eta = (m1 * m2) / (m_total * m_total);
190 const UINT4 max_pn_order = 9;
200 c[0] = (96.0/5.0) * eta;
206 c[2] =
c[0] * (-1.0/336.0) * (743.0 + 924.0 * eta);
212 c[4] =
c[0] * (34103.0 + 122949.0 * eta + 59472.0 * eta * eta)
216 c[5] =
c[0] * (-1.0/672.0) * (4159.0 + 15876.0 * eta) *
LAL_PI;
219 c[6] =
c[0] * ( 16447322263.0/139708800.0
222 + ( -273811877.0/1088640.0 + 451.0/48.0 *
LAL_PI *
LAL_PI
223 - (88.0 * 1039.0)/(3.0 * 4620.0) ) * eta
224 + 541.0/896.0 * eta * eta
225 - 5605.0/2592.0 * eta * eta * eta
226 - 856.0/105.0 * log(16.0) );
229 c[7] =
c[0] * (-1712.0/315.0);
232 c[8] =
c[0] * (-13245.0 + 717350.0 * eta + 731960.0 * eta * eta)
244 const REAL4 m_total = m1 + m2;
245 const REAL4 m1_5 = m1 * m1 * m1 * m1 * m1;
246 const REAL4 m2_5 = m2 * m2 * m2 * m2 * m2;
247 const UINT4 max_spin_order = 6;
257 c[0] = (-1.0 / (12.0 * m_total * m_total)) * ( 113.0 + 75.0 * (m2/m1) );
260 c[1] = (-1.0 / (12.0 * m_total * m_total)) * ( 113.0 + 75.0 * (m1/m2) );
263 c[2] = -247.0 / (48.0 * m_total * m_total * m1 * m2);
266 c[3] = 721.0 / (48.0 * m_total * m_total * m1 * m2);
271 / ( 2.0 * m1_5 * chi1 * chi1 * m_total * m_total );
278 / ( 2.0 * m2_5 * chi2 * chi2 * m_total * m_total );
293 const REAL4 m_total = m1 + m2;
294 const REAL4 mu = m1 * m2 / m_total;
295 const REAL4 eta =
mu / m_total;
296 const REAL4 m1_5 = m1 * m1 * m1 * m1 * m1;
297 const REAL4 m2_5 = m2 * m2 * m2 * m2 * m2;
298 const UINT4 max_pn_order = 9;
314 c[2] =
c[0] * (-1.0/6.0) * (9.0 + eta);
320 c[4] =
c[0] * (3.0/24.0) * (-81.0 + 57.0 * eta - eta * eta);
329 - 155.0/96.0 * eta * eta
330 - 35.0/5184.0 * eta * eta * eta);
334 c[7] =
c[0] * (3.0 * Q1)
335 / (2.0 * m1_5 * chi1 * chi1 * m_total * m_total );
341 c[8] =
c[0] * (3.0 * Q2)
342 / (2.0 * m2_5 * chi2 * chi2 * m_total * m_total );
353 REAL4 m_total = ma + mb;
354 REAL4 eta = (ma * mb) / (m_total * m_total);
355 return (eta/2.0) * ( 4.0 + 3.0 * ma/mb );
362 REAL4 m_total = m1 + m2;
363 REAL4 eta = (m1 * m2) / (m_total * m_total);
364 return -1.0 / (eta * m_total * m_total);
377 const REAL8 m_total = m1 + m2;
380 const REAL8 mag_S1 = m1 * m1 * chi1;
381 const REAL8 mag_S2 = m2 * m2 * chi2;
384 const REAL8 LNhat_dot_Seff
385 = ( 1.0 + (3.0 * m2) / (4.0 * m1) ) * LNhat_dot_S1
386 + ( 1.0 + (3.0 * m1) / (4.0 * m2) ) * LNhat_dot_S2;
389 const REAL8 omega_1_3 = pow( omega, 1.0/3.0 );
390 const REAL8 omega_minus1_3 = 1.0 / omega_1_3;
391 const REAL8 omega_2_3 = omega_1_3 * omega_1_3;
392 const REAL8 omega_4_3 = omega * omega_1_3;
393 const REAL8 omega_5_3 = omega_4_3 * omega_1_3;
398 = pn_params->
data[0] * omega_minus1_3
400 + pn_params->
data[2] * omega_1_3
401 + pn_params->
data[3] * omega_2_3
402 + pn_params->
data[4] * omega
403 + pn_params->
data[5] * omega_4_3
404 + pn_params->
data[6] * omega_5_3
407 * 20.0 * LNhat_dot_Seff * omega_2_3 / (3.0 * m_total * m_total)
409 + (-1.0/2.0) * ( S1_dot_S2 - 3.0 * LNhat_dot_S1 * LNhat_dot_S2 )
410 * omega_5_3 / (m_total * m_total)
412 + pn_params->
data[7] * omega
413 * ( 3.0 * LNhat_dot_S1 * LNhat_dot_S1 - mag_S1 * mag_S1 )
415 + pn_params->
data[8] * omega
416 * ( 3.0 * LNhat_dot_S2 * LNhat_dot_S2 - mag_S2 * mag_S2 );
418 return (
REAL4) energy;
446 REAL8 dE_dt, dE_dt_n_1=0, dE_dt_n_2=0;
452 const REAL8 m_total = m1 + m2;
454 const REAL8 freq_step = geometrized_m_total *
LAL_PI;
456 const REAL8 omegam_to_hz = 1.0 / freq_step;
457 const INT4 num_evolution_variables = 11;
480 const gsl_odeiv_step_type* solver_type
481 = gsl_odeiv_step_rkf45;
482 gsl_odeiv_step* solver_step
483 = gsl_odeiv_step_alloc( solver_type, num_evolution_variables );
484 gsl_odeiv_control* solver_control
485 = gsl_odeiv_control_standard_new( 1.0e-5, 1.0e-5, 1.0, 1.0 );
486 gsl_odeiv_evolve* solver_evolve
487 = gsl_odeiv_evolve_alloc( num_evolution_variables );
488 gsl_odeiv_system solver_system;
491 solver_system.jacobian = NULL;
492 solver_system.dimension = num_evolution_variables;
493 solver_system.params = (
void*) pn_params_ptr;
501 pn_params.
mag_S1 = m1 * m1 * chi1;
507 omega =
y[1] =
f_min / omegam_to_hz;
508 S1x =
y[2] = sqrt( 1 - kappa * kappa ) * pn_params.
mag_S1 ;
510 S1z =
y[4] = kappa * pn_params.
mag_S1 ;
526 memset ( PTFomega_2_3->
data, 0,
N *
sizeof(
REAL4));
528 memset ( PTFe1->
data, 0, 3 *
N *
sizeof(
REAL4));
529 memset ( PTFe2->
data, 0, 3 *
N *
sizeof(
REAL4));
538 XLALPrintError(
"XLAL Error: output too short for PTF waveform\n" );
545 PTFomega_2_3->
data[
i] = (
REAL4) (pow( omega, 2.0/3.0 ));
560 errcode = gsl_odeiv_evolve_apply(
561 solver_evolve, solver_control, solver_step, &solver_system,
562 &t, t_next, &step_size,
y );
565 if ( errcode != GSL_SUCCESS )
581 e2x = LNhaty * e1z - LNhatz * e1y;
582 e2y = LNhatz * e1x - LNhatx * e1z;
583 e2z = LNhatx * e1y - LNhaty * e1x;
586 if ( isnan( Phi ) || isnan( omega ) || isnan( LNhatx ) ||
587 isnan( LNhaty ) || isnan( LNhatz ) || isnan( e1x ) ||
588 isnan( e1y ) || isnan( e1z ) )
591 N_steps = ((
i-2) * dE_dt_n_1 - (
i-1) * dE_dt_n_2) /
592 ( dE_dt_n_1 - dE_dt_n_2) -
i + 1;
608 0, 0, m1, m2, chi1, 0, orbital_energy_coeffs);
609 dE_dt_n_2 = dE_dt_n_1 * 1.01;
613 dE_dt_n_2 = dE_dt_n_1;
615 0, 0, m1, m2, chi1, 0, orbital_energy_coeffs);
621 if ( dydt[1] <= 0 )
break;
626 0, 0, m1, m2, chi1, 0, orbital_energy_coeffs )) >= 0 )
break;
629 InspTmplt->
fFinal = omega * omegam_to_hz;
635 gsl_odeiv_evolve_free( solver_evolve );
636 gsl_odeiv_control_free( solver_control );
637 gsl_odeiv_step_free( solver_step );
652 memmove( PTFomega_2_3->
data + len, PTFomega_2_3->
data,
i *
sizeof(
REAL4) );
654 memmove( PTFe1->
data + len, PTFe1->
data, (2 *
N +
i) *
sizeof(
REAL4) );
655 memmove( PTFe2->
data + len, PTFe2->
data, (2 *
N +
i) *
sizeof(
REAL4) );
658 memset ( PTFomega_2_3->
data, 0, len *
sizeof(
REAL4));
659 memset ( PTFphi->
data, 0, len *
sizeof(
REAL4));
660 memset ( PTFe1->
data, 0, len *
sizeof(
REAL4));
661 memset ( PTFe2->
data, 0, len *
sizeof(
REAL4));
664 if ( errcode == GSL_SUCCESS )
INT4 XLALFindChirpPTFWaveform(REAL4Vector *PTFphi, REAL4Vector *PTFomega_2_3, REAL4VectorSequence *PTFe1, REAL4VectorSequence *PTFe2, InspiralTemplate *InspTmplt, REAL8 deltaT)
REAL4Vector * XLALPTFOmegaPNCoeffsSpin(REAL4 m1, REAL4 m2, REAL4 chi1, REAL4 chi2, REAL4 Q1, REAL4 Q2)
REAL4Vector * XLALPTFOmegaPNCoeffsEnergy(REAL4 m1, REAL4 m2, REAL4 chi1, REAL4 chi2, REAL4 Q1, REAL4 Q2)
REAL4Vector * XLALPTFOmegaPNCoeffsOrbital(REAL4 m1, REAL4 m2)
REAL4Vector * XLALCreateREAL4Vector(UINT4 length)
void XLALDestroyREAL4Vector(REAL4Vector *vector)
#define XLAL_ERROR_NULL(...)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
The inspiral waveform parameter structure containing information about the waveform to be generated.
REAL8 mass1
Mass of the primary in solar mass (input/output)
REAL8 fFinal
final frequency reached, in units of Hz (output)
REAL8 tC
total chirp time seconds (output)
REAL8 mass2
Mass of the secondary in solar mass (mass1 need not be larger than mass2 (input/output)
REAL8 fLower
lower frequency cutoff of the detector in Hz (input)
REAL8 chi
dimensionless spin of black hole (ie mass1)
REAL8 kappa
cosine of angle between spin of mass1 and orb ang mom