1#include <lal/LALSTPNWaveformFrameless.h>
2#include <lal/LALSTPNWaveformErrors.h>
3#include <lal/LALAdaptiveRungeKuttaIntegrator.h>
6#define UNUSED(expr) do { (void)(expr); } while (0)
8typedef struct LALSTPNstructparams {
10 REAL8 wdotnew, wdotorb[9], wspin15, wspin20;
11 REAL8 LNhdot15, LNhdot20;
12 REAL8 S1dot15, S2dot15, Sdot20;
20 if( !
params || !mparams || !paramsInit )
31 mparams->
m2m1 = m2 / m1;
32 mparams->
m1m2 = m1 / m2;
34 mparams->
eta = (m1 * m2) / (m1 + m2) / (m1 + m2);
57 for(
int j =
params->order + 1; j <= 8; j++)
66 mparams->
S1dot15 = (4.0 + 3.0 * mparams->
m2m1) / 2.0 ;
67 mparams->
S2dot15 = (4.0 + 3.0 * mparams->
m1m2) / 2.0 ;
82 mparams->
epnorb[4] = (1.0/24.0)
94 mparams->
epnorb[6] = ( - (675.0/64.0) + ( (209323.0/4032.0)
115 double dvalues[],
void *mparams)
123 v = pow(omega,(1./3.));
126 +
params->epnorb[1] + (4.0/3.0) * v * (
params->epnorb[2]
127 + (5.0/4.0) * v * (
params->epnorb[3] + (6.0/5.0) * v * (
params->epnorb[4]
128 + (7.0/6.0) * v * (
params->epnorb[5] + (8.0/7.0) * v * (
params->epnorb[6]
129 + (9.0/8.0) * v * (
params->epnorb[7]
130 + (10.0/9.0)* v *
params->epnorb[8] )))))) );
132 if (
params->wspin15 != 0.0)
134 REAL8 LNhx, LNhy, LNhz, S1x, S1y, S1z, S2x, S2y, S2z;
135 REAL8 v2, dotLNS1, dotLNS2;
137 LNhx = values[2]; LNhy = values[3]; LNhz = values[4] ;
138 S1x = values[5]; S1y = values[6]; S1z = values[7] ;
139 S2x = values[8]; S2y = values[9]; S2z = values[10];
143 dotLNS1 = (LNhx*S1x + LNhy*S1y + LNhz*S1z);
144 dotLNS2 = (LNhx*S2x + LNhy*S2y + LNhz*S2z);
147 * ( (8.0/3.0 + 2.0*
params->m2m1)*dotLNS1
148 + (8.0/3.0 + 2.0*
params->m1m2)*dotLNS2 );
150 if (
params->wspin20 != 0.0)
154 dotS1S2 = (S1x*S2x + S1y*S2y + S1z*S2z);
155 test += -(v*v2) * (dotS1S2 - 3.0 * dotLNS1 * dotLNS2);
163 else if (dvalues[1] < 0.0)
167 else if (isnan(omega))
178 const double values[],
double dvalues[],
void *mparams)
181 REAL8 omega, LNhx, LNhy, LNhz, S1x, S1y, S1z, S2x, S2y, S2z, E1x, E1y, E1z;
182 REAL8 ds, domega, dLNhx, dLNhy, dLNhz, dS1x, dS1y, dS1z, dS2x, dS2y, dS2z;
183 REAL8 dE1x, dE1y, dE1z;
186 REAL8 v, v2, v3, v4, v7, v11;
187 REAL8 dotLNS1, dotLNS2, dotS1S2;
189 REAL8 LNmag, crossx, crossy, crossz;
198 LNhx = values[2]; LNhy = values[3]; LNhz = values[4] ;
199 S1x = values[5]; S1y = values[6]; S1z = values[7] ;
200 S2x = values[8]; S2y = values[9]; S2z = values[10];
201 E1x = values[11]; E1y = values[12]; E1z = values[13];
208 v = pow(omega,(1./3.));
209 v2 = v * v; v3 = v2 * v; v4 = v3 * v; v7 = v4 * v3; v11 = v7 * v4;
211 dotLNS1 = (LNhx*S1x + LNhy*S1y + LNhz*S1z);
212 dotLNS2 = (LNhx*S2x + LNhy*S2y + LNhz*S2z);
213 dotS1S2 = (S1x*S2x + S1y*S2y + S1z*S2z );
219 v * (
params->wdotorb[6] +
params->wdotorb[7] * log(omega) +
220 v *
params->wdotorb[8] ))))));
223 domega +=
params->wspin15 * omega * ( LNhx * (113.0 * S1x + 113.0 * S2x
224 + 75.0 *
params->m2m1 * S1x + 75.0 *
params->m1m2 * S2x)
225 + LNhy * (113.0 * S1y + 113.0 * S2y + 75.0 *
params->m2m1 * S1y
226 + 75.0 *
params->m1m2 * S2y) + LNhz * (113.0 * S1z + 113.0 * S2z
227 + 75.0 *
params->m2m1 * S1z + 75.0 *
params->m1m2 * S2z) );
229 domega +=
params->wspin20 * v4 *(247.0 * dotS1S2 - 721.0 * dotLNS1 * dotLNS2);
231 domega *=
params->wdotnew * v11;
234 omega2 = omega * omega;
236 tmpx =
params->LNhdot15 * omega2 * ((4.0 + 3.0*
params->m2m1) * S1x
237 + (4.0 + 3.0*
params->m1m2) * S2x);
238 tmpy =
params->LNhdot15 * omega2 * ((4.0 + 3.0*
params->m2m1) * S1y
239 + (4.0 + 3.0*
params->m1m2) * S2y);
240 tmpz =
params->LNhdot15 * omega2 * ((4.0 + 3.0*
params->m2m1) * S1z
241 + (4.0 + 3.0*
params->m1m2) * S2z);
243 tmpx +=
params->LNhdot20 * v7 * (dotLNS2 * S1x + dotLNS1 * S2x);
244 tmpy +=
params->LNhdot20 * v7 * (dotLNS2 * S1y + dotLNS1 * S2y);
245 tmpz +=
params->LNhdot20 * v7 * (dotLNS2 * S1z + dotLNS1 * S2z);
247 dLNhx = (-tmpz*LNhy + tmpy*LNhz);
248 dLNhy = (-tmpx*LNhz + tmpz*LNhx);
249 dLNhz = (-tmpy*LNhx + tmpx*LNhy);
253 tmp1 = tmpx * LNhx + tmpy * LNhy + tmpz * LNhz;
258 dE1x = (-tmpz*E1y + tmpy*E1z);
259 dE1y = (-tmpx*E1z + tmpz*E1x);
260 dE1z = (-tmpy*E1x + tmpx*E1y);
265 crossx = (LNhy*S1z - LNhz*S1y);
266 crossy = (LNhz*S1x - LNhx*S1z);
267 crossz = (LNhx*S1y - LNhy*S1x);
269 dS1x =
params->S1dot15 * omega2 * LNmag * crossx;
270 dS1y =
params->S1dot15 * omega2 * LNmag * crossy;
271 dS1z =
params->S1dot15 * omega2 * LNmag * crossz;
273 tmpx = S1z*S2y - S1y*S2z;
274 tmpy = S1x*S2z - S1z*S2x;
275 tmpz = S1y*S2x - S1x*S2y;
277 dS1x +=
params->Sdot20 * omega2 * (tmpx - 3.0 * dotLNS2 * crossx);
278 dS1y +=
params->Sdot20 * omega2 * (tmpy - 3.0 * dotLNS2 * crossy);
279 dS1z +=
params->Sdot20 * omega2 * (tmpz - 3.0 * dotLNS2 * crossz);
282 crossx = (LNhy*S2z - LNhz*S2y);
283 crossy = (LNhz*S2x - LNhx*S2z);
284 crossz = (LNhx*S2y - LNhy*S2x);
286 dS2x =
params->S2dot15 * omega2 * LNmag * crossx;
287 dS2y =
params->S2dot15 * omega2 * LNmag * crossy;
288 dS2z =
params->S2dot15 * omega2 * LNmag * crossz;
290 dS2x +=
params->Sdot20 * omega2 * (-tmpx - 3.0 * dotLNS1 * crossx);
291 dS2y +=
params->Sdot20 * omega2 * (-tmpy - 3.0 * dotLNS1 * crossy);
292 dS2z +=
params->Sdot20 * omega2 * (-tmpz - 3.0 * dotLNS1 * crossz);
298 dvalues[0] = ds ; dvalues[1] = domega;
299 dvalues[2] = dLNhx; dvalues[3] = dLNhy ; dvalues[4] = dLNhz;
300 dvalues[5] = dS1x ; dvalues[6] = dS1y ; dvalues[7] = dS1z ;
301 dvalues[8] = dS2x ; dvalues[9] = dS2y ; dvalues[10] = dS2z ;
302 dvalues[11] = dE1x ; dvalues[12] = dE1y ; dvalues[13] = dE1z ;
324 if( !signalvec || !signalvec->
data || !
params )
369 if( !signalvec1 || !signalvec1->
data || !signalvec2
389 &count,
params, ¶msInit) )
413 if( !waveform || !
params )
434 if (paramsInit.
nbins==0)
436 XLALPrintWarning(
"Warning! Waveform of zero length requested in %s. Returning empty waveform.\n ", __func__);
488 for(
i = 0;
i < count;
i++)
498 waveform->
psi = ppnParams->
psi;
505 ppnParams->
tc = (double)(count-1) /
params->tSampling ;
506 ppnParams->
length = count;
532 countback,
params, paramsInit) )
557 REAL8 hpluscos, hplussin, hcrosscos, hcrosssin;
566 lengths = (5.0/256.0) * pow(
LAL_PI,-8.0/3.0) * pow(
params->chirpMass
573 yinit[0] =
params->startPhase / 2.0;
574 yinit[1] =
params->fLower * unitHz;
581 yinit[5] = norm *
params->spin1[0];
582 yinit[6] = norm *
params->spin1[1];
583 yinit[7] = norm *
params->spin1[2];
586 yinit[8] = norm *
params->spin2[0];
587 yinit[9] = norm *
params->spin2[1];
588 yinit[10]= norm *
params->spin2[2];
602 XLALPrintError(
"LALSTPNFramelessAdaptiveWaveformEngine: Cannot allocate integrator.\n");
611 lengths/
m,
dt/
m, &yout);
618 XLALPrintError(
"LALSTPNFramelessAdaptiveWaveformEngine: integration failed with errorcode %d.\n",intreturn);
626 XLALPrintWarning(
"LALSTPNFramelessAdaptiveWaveformEngine WARNING: integration terminated with code %d.\n",intreturn);
627 XLALPrintWarning(
"Waveform parameters were m1 = %e, m2 = %e, s1 = (%e,%e,%e), s2 = (%e,%e,%e), inc = %e.\n",
641 if (signalvec1 && len >= signalvec1->
length)
643 XLALPrintError(
"LALSTPNFramelessAdaptiveWaveformEngine: no space to write in signalvec1: %d vs. %d\n", len, signalvec1->
length);
646 if (signalvec2 && len >= signalvec2->
length)
648 XLALPrintError(
"LALSTPNFramelessAdaptiveWaveformEngine: no space to write in signalvec2: %d vs. %d\n", len, signalvec2->
length);
675 for(
unsigned int i=0;
i<len;
i++)
677 f2a = pow(omega[
i],2.0/3.0);
679 E2x = LNhy[
i]*E1z[
i] - LNhz[
i]*E1y[
i];
680 E2y = LNhz[
i]*E1x[
i] - LNhx[
i]*E1z[
i];
693 hpluscos = 0.5 * (E1x[
i]*E1x[
i] - E1y[
i]*E1y[
i] - E2x*E2x + E2y*E2y);
694 hplussin = E1x[
i]*E2x - E1y[
i]*E2y;
697 ( hpluscos * cos(2*vphi[
i]) + hplussin * sin(2*vphi[
i]) ) );
703 hcrosscos = E1x[
i]*E1y[
i] - E2x*E2y;
704 hcrosssin = E1y[
i]*E2x + E1x[
i]*E2y;
707 ( hcrosscos * cos(2*vphi[
i]) + hcrosssin * sin(2*vphi[
i]) ) );
static INT4 test(REAL4, REAL4, REAL4, REAL4, REAL4, REAL4, REAL4, REAL4)
int XLALInspiralSetup(expnCoeffs *ak, InspiralTemplate *params)
int XLALInspiralInit(InspiralTemplate *params, InspiralInit *paramsInit)
int XLALInspiralChooseModel(expnFunc *func, expnCoeffs *ak, InspiralTemplate *params)
#define ATTATCHSTATUSPTR(statusptr)
#define DETATCHSTATUSPTR(statusptr)
#define INITSTATUS(statusptr)
#define RETURN(statusptr)
void XLALDestroyREAL8Array(REAL8Array *)
REAL4VectorSequence * XLALCreateREAL4VectorSequence(UINT4 length, UINT4 veclen)
#define GENERATEPPNINSPIRALH_EFSTOP
Reached requested termination frequency.
int XLALAdaptiveRungeKutta4(LALAdaptiveRungeKuttaIntegrator *integrator, void *params, REAL8 *yinit, REAL8 tinit, REAL8 tend, REAL8 deltat, REAL8Array **yout)
void XLALAdaptiveRungeKuttaFree(LALAdaptiveRungeKuttaIntegrator *integrator)
LALAdaptiveRungeKuttaIntegrator * XLALAdaptiveRungeKutta4Init(int dim, int(*dydt)(double t, const double y[], double dydt[], void *params), int(*stop)(double t, const double y[], double dydt[], void *params), double eps_abs, double eps_rel)
void * XLALMalloc(size_t n)
LAL_PNORDER_THREE_POINT_FIVE
LAL_PNORDER_ONE_POINT_FIVE
const LALUnit lalStrainUnit
REAL4Vector * XLALCreateREAL4Vector(UINT4 length)
void XLALDestroyREAL4Vector(REAL4Vector *vector)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
int int XLALPrintWarning(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
#define XLAL_PRINT_DEPRECATION_WARNING(replacement)
REAL4TimeVectorSeries * h
The inspiral waveform parameter structure containing information about the waveform to be generated.
This structure stores the parameters for constructing a restricted post-Newtonian waveform.
const CHAR * termDescription
The termination code description (above)
INT4 termCode
The termination condition (above) that stopped computation of the waveform.
REAL4 phi
The phase at coalescence (or arbitrary reference phase for a post -Newtonian approximation),...
REAL4 psi
polarization angle (radians)
REAL4 fStart
The actual starting frequency of the waveform, in Hz (normally close but not identical to fStartIn)
SkyPosition position
location of source on sky
UINT4 length
The length of the generated waveform.
REAL4 fStop
The frequency at the termination of the waveform, in Hz.
REAL8 tc
The time from the start of the waveform to coalescence (in the point-mass approximation),...
REAL4 fStartIn
The requested starting frequency of the waveform, in Hz.
REAL4VectorSequence * data