32#include <lal/LALInspiral.h>
33#include <lal/SeqFactories.h>
39typedef struct LALSTPNstructparams {
64 REAL8 LNhx,LNhy,LNhz,LNhxy,LNmag;
69 REAL8 dotLNS1,dotLNS2;
70 REAL8 crossx,crossy,crossz;
71 REAL8 ds,domega,domeganew;
72 REAL8 dLNhx,dLNhy,dLNhz;
80 REAL8 v, v2, v3, v4, v7, v11;
83 omega = values->
data[1];
85 LNhx = values->
data[2];
86 LNhy = values->
data[3];
87 LNhz = values->
data[4];
89 S1x = values->
data[5];
90 S1y = values->
data[6];
91 S1z = values->
data[7];
93 S2x = values->
data[8];
94 S2y = values->
data[9];
95 S2z = values->
data[10];
103 v = pow(omega, 1.0/3.0);
110 domeganew =
params->wdotnew * v11;
113 fprintf(stderr,
"WARNING: Omega has become -ve, this should lead to nan's \n");
119 + v * (
params->wdotorb[2]
120 + v * (
params->wdotorb[3]
121 + v * (
params->wdotorb[4]
122 + v * (
params->wdotorb[5]
123 + v * (
params->wdotorb[6] +
params->wdotorb[7] * log(omega)
124 + v * (
params->wdotorb[8] ) ) ) ) ) ) ) ;
129 (2.0/3.0) * (1.0/v) *
params->epnorb[0]
131 + (4.0/3.0) * v * (
params->epnorb[2]
132 + (5.0/4.0) * v * (
params->epnorb[3]
133 + (6.0/5.0) * v * (
params->epnorb[4]
134 + (7.0/6.0) * v * (
params->epnorb[5]
135 + (8.0/7.0) * v * (
params->epnorb[6]
136 + (9.0/8.0) * v * (
params->epnorb[7]
137 + (10.0/9.0)* v *
params->epnorb[8] )))))) );
139 domega +=
params->wspin15 * omega *
140 ( LNhx * (113.0 * S1x + 113.0 * S2x + 75.0 *
params->m2m1 * S1x + 75.0 *
params->m1m2 * S2x) +
141 LNhy * (113.0 * S1y + 113.0 * S2y + 75.0 *
params->m2m1 * S1y + 75.0 *
params->m1m2 * S2y) +
142 LNhz * (113.0 * S1z + 113.0 * S2z + 75.0 *
params->m2m1 * S1z + 75.0 *
params->m1m2 * S2z) );
144 dotLNS1 = (LNhx*S1x + LNhy*S1y + LNhz*S1z);
145 dotLNS2 = (LNhx*S2x + LNhy*S2y + LNhz*S2z);
148 dotS1S2 = (S1x*S2x + S1y*S2y + S1z*S2z);
150 domega +=
params->wspin20 * v4 *
152 721.0 * dotLNS1 * dotLNS2 );
159 if(
params->wspin15 != 0.0)
161 (5.0/3.0) * v2 * ( (8.0/3.0 + 2.0*
params->m2m1)*dotLNS1 + (8.0/3.0 + 2.0*
params->m1m2)*dotLNS2 );
165 if(
params->wspin20 != 0.0)
166 test += -v3 * (dotS1S2 - 3.0 * dotLNS1 * dotLNS2);
170 omega2 = omega * omega;
172 tmpx = (4.0 + 3.0*
params->m2m1) * S1x + (4.0 + 3.0*
params->m1m2) * S2x;
173 tmpy = (4.0 + 3.0*
params->m2m1) * S1y + (4.0 + 3.0*
params->m1m2) * S2y;
174 tmpz = (4.0 + 3.0*
params->m2m1) * S1z + (4.0 + 3.0*
params->m1m2) * S2z;
176 dLNhx =
params->LNhdot15 * omega2 * (-tmpz*LNhy + tmpy*LNhz);
177 dLNhy =
params->LNhdot15 * omega2 * (-tmpx*LNhz + tmpz*LNhx);
178 dLNhz =
params->LNhdot15 * omega2 * (-tmpy*LNhx + tmpx*LNhy);
182 tmpx = dotLNS2 * S1x + dotLNS1 * S2x;
183 tmpy = dotLNS2 * S1y + dotLNS1 * S2y;
184 tmpz = dotLNS2 * S1z + dotLNS1 * S2z;
186 dLNhx +=
params->LNhdot20 * v7 * (-tmpz*LNhy + tmpy*LNhz);
187 dLNhy +=
params->LNhdot20 * v7 * (-tmpx*LNhz + tmpz*LNhx);
188 dLNhz +=
params->LNhdot20 * v7 * (-tmpy*LNhx + tmpx*LNhy);
194 crossx = (LNhy*S1z - LNhz*S1y);
195 crossy = (LNhz*S1x - LNhx*S1z);
196 crossz = (LNhx*S1y - LNhy*S1x);
198 dS1x =
params->S1dot15 * omega2 * LNmag * crossx;
199 dS1y =
params->S1dot15 * omega2 * LNmag * crossy;
200 dS1z =
params->S1dot15 * omega2 * LNmag * crossz;
204 tmpx = S1z*S2y - S1y*S2z;
205 tmpy = S1x*S2z - S1z*S2x;
206 tmpz = S1y*S2x - S1x*S2y;
208 dS1x +=
params->Sdot20 * omega2 *
209 (tmpx - 3.0 * dotLNS2 * crossx);
210 dS1y +=
params->Sdot20 * omega2 *
211 (tmpy - 3.0 * dotLNS2 * crossy);
212 dS1z +=
params->Sdot20 * omega2 *
213 (tmpz - 3.0 * dotLNS2 * crossz);
217 crossx = (-LNhz*S2y + LNhy*S2z);
218 crossy = (-LNhx*S2z + LNhz*S2x);
219 crossz = (-LNhy*S2x + LNhx*S2y);
221 dS2x =
params->S2dot15 * omega2 * LNmag * crossx;
222 dS2y =
params->S2dot15 * omega2 * LNmag * crossy;
223 dS2z =
params->S2dot15 * omega2 * LNmag * crossz;
227 dS2x +=
params->Sdot20 * omega2 * (-tmpx - 3.0 * dotLNS1 * crossx);
228 dS2y +=
params->Sdot20 * omega2 * (-tmpy - 3.0 * dotLNS1 * crossy);
229 dS2z +=
params->Sdot20 * omega2 * (-tmpz - 3.0 * dotLNS1 * crossz);
235 LNhxy = LNhx*LNhx + LNhy*LNhy;
236 if(LNhxy > 0.0) alphadotcosi = LNhz * (LNhx*dLNhy - LNhy*dLNhx) / LNhxy;
237 else alphadotcosi = 0.0;
239 ds = omega - alphadotcosi;
243 dvalues->
data[0] = ds;
244 dvalues->
data[1] = domega;
246 dvalues->
data[2] = dLNhx;
247 dvalues->
data[3] = dLNhy;
248 dvalues->
data[4] = dLNhz;
250 dvalues->
data[5] = dS1x;
251 dvalues->
data[6] = dS1y;
252 dvalues->
data[7] = dS1z;
254 dvalues->
data[8] = dS2x;
255 dvalues->
data[9] = dS2y;
256 dvalues->
data[10]= dS2z;
258 dvalues->
data[11] = 0;
422 if (paramsInit.
nbins==0)
441 memset(
a->data, 0, 2 * paramsInit.
nbins *
sizeof(
REAL4));
476 if (phi->
data[
i] != 0.0)
break;
494 phiC = phi->
data[count-1] ;
497 for (
i=0;
i<count;
i++)
506 LALINSPIRALH_MSGEMEM );
512 LALFree( waveform->
a ); waveform->
a = NULL;
514 LALINSPIRALH_MSGEMEM );
520 LALFree( waveform->
a ); waveform->
a = NULL;
521 LALFree( waveform->
f ); waveform->
f = NULL;
523 LALINSPIRALH_MSGEMEM );
529 LALFree( waveform->
a ); waveform->
a = NULL;
530 LALFree( waveform->
f ); waveform->
f = NULL;
533 LALINSPIRALH_MSGEMEM );
542 &( waveform->
a->
data ), &in );
545 &( waveform->
f->
data ), count);
548 &( waveform->
phi->
data ), count );
572 waveform->
psi = ppnParams->
psi;
582 ppnParams->
tc = (double)(count-1) /
params->tSampling ;
583 ppnParams->
length = count;
651 REAL8Vector dummy, values, dvalues, newvalues, yt, dym, dyt;
654 REAL4 v=0,h1,h2, amp=0;
659 REAL8 LNhztol = 1.0e-8;
663 REAL8 initLNhx, initLNhy, initLNhz;
664 REAL8 initS1x, initS1y, initS1z;
665 REAL8 initS2x, initS2y, initS2z;
668 REAL8 vphi, omega, LNhx, LNhy, LNhz, S1x, S1y, S1z, S2x, S2y, S2z;
754 if (paramsInit->
nbins==0)
762 mparams = &STPNparameters;
787 lengths = (5.0/256.0) * pow(
LAL_PI,-8.0/3.0)
790 length = ceil(log10(lengths/
dt)/log10(2.0));
791 length = pow(2,length);
867 for (j =
params->order + 1; j <= 8; j++){
881 for (j =
params->order + 1; j <= 8; j++){
884 mparams->
wspin15 = -(1.0/12.0);
886 mparams->
S1dot15 = (4.0 + 3.0 * mparams->
m2m1) / 2.0 ;
887 mparams->
S2dot15 = (4.0 + 3.0 * mparams->
m1m2) / 2.0 ;
898 for (j =
params->order +1; j <= 8; j++){
901 mparams->
wspin15 = -(1.0/12.0);
906 mparams->
S1dot15 = (4.0 + 3.0 * mparams->
m2m1) / 2.0 ;
907 mparams->
S2dot15 = (4.0 + 3.0 * mparams->
m1m2) / 2.0 ;
911 mparams->
epnorb[6] = ( -(675.0/64.0)
913 -(110.0/9.0) * (-1987.0/3080.0) ) *
params->eta
930 omega =
params->fLower * unitHz;
944 alpha0 = atan2(LNhy,LNhx);
948 values.
data[0] = vphi;
949 values.
data[1] = omega;
951 values.
data[2] = LNhx;
952 values.
data[3] = LNhy;
953 values.
data[4] = LNhz;
955 values.
data[5] = S1x;
956 values.
data[6] = S1y;
957 values.
data[7] = S1z;
959 values.
data[8] = S2x;
960 values.
data[9] = S2y;
961 values.
data[10]= S2z;
1013 omegadot = dvalues.
data[1];
1024 if (
a || signalvec2)
1030 if ((signalvec1 && count >= signalvec1->
length) || (ff && count >= ff->
length))
1048 if(LNhx*LNhx + LNhy*LNhy > 0.0) {
1059 f2a = pow(omega, 2./3.);
1067 v = pow(omega, (1./3.));
1068 amp =
params->signalAmplitude*v*v;
1071 h1 = -0.5 * amp * cos(2.*vphi) * cos(2.*
alpha) * (1. + LNhz*LNhz) + amp * sin(2.*vphi) * sin(2.*
alpha) * LNhz;
1072 *(signalvec1->
data + count) = (
REAL4) h1;
1076 h2 = -0.5 * amp * cos(2.*vphi) * sin(2.*
alpha) * (1. + LNhz*LNhz) - amp * sin(2.*vphi) * cos(2.*
alpha) * LNhz;
1077 *(signalvec2->
data + count) = (
REAL4) h2;
1087 a->data[2*count] = (
REAL4)(apcommon * f2a * 0.5 * (1 + LNhz*LNhz));
1088 a->data[2*count+1] = (
REAL4)(apcommon * f2a * LNhz);
1117 vphi = values.
data[0] = newvalues.
data[0];
1118 omega = values.
data[1] = newvalues.
data[1];
1120 LNhx = values.
data[2] = newvalues.
data[2];
1121 LNhy = values.
data[3] = newvalues.
data[3];
1122 LNhz = values.
data[4] = newvalues.
data[4];
1124 S1x = values.
data[5] = newvalues.
data[5];
1125 S1y = values.
data[6] = newvalues.
data[6];
1126 S1z = values.
data[7] = newvalues.
data[7];
1128 S2x = values.
data[8] = newvalues.
data[8];
1129 S2y = values.
data[9] = newvalues.
data[9];
1130 S2z = values.
data[10]= newvalues.
data[10];
1133 omegadot = dvalues.
data[1];
1137 t = (++count -
params->nStartPad) *
dt;
1141 while(test < 0.0 && omegadot > 0 && omega/unitHz < params->tSampling/2. && !(isnan(omega))) ;
1146 "WARNING: evolving quantities have become nan. "
1155 "inclination: %e\n ",
1162 else if (!(LNhz*LNhz < 1.0 - LNhztol)){
1164 "WARNING: Injection terminated, co-ord singularity. "
1173 "inclination: %e\n ",
1192 if (signalvec1 || signalvec2){
1203 if (signalvec1 && !signalvec2)
params->tC = t;
static INT4 test(REAL4, REAL4, REAL4, REAL4, REAL4, REAL4, REAL4, REAL4)
void XLALRungeKutta4Free(rk4GSLIntegrator *integrator)
void LALInspiralSetup(LALStatus *status, expnCoeffs *ak, InspiralTemplate *params)
void LALInspiralInit(LALStatus *status, InspiralTemplate *params, InspiralInit *paramsInit)
void LALInspiralChooseModel(LALStatus *status, expnFunc *func, expnCoeffs *ak, InspiralTemplate *params)
void LALRungeKutta4(LALStatus *, REAL8Vector *, rk4GSLIntegrator *, void *)
rk4GSLIntegrator * XLALRungeKutta4Init(INT4 n, rk4In *input)
#define ABORT(statusptr, code, mesg)
#define CHECKSTATUSPTR(statusptr)
#define ENDFAIL(statusptr)
#define ATTATCHSTATUSPTR(statusptr)
#define ASSERT(assertion, statusptr, code, mesg)
#define DETATCHSTATUSPTR(statusptr)
#define INITSTATUS(statusptr)
#define RETURN(statusptr)
#define BEGINFAIL(statusptr)
void LALSCreateVectorSequence(LALStatus *status, REAL4VectorSequence **vectorSequence, CreateVectorSequenceIn *vSeqParams)
#define GENERATEPPNINSPIRALH_EFSTOP
Reached requested termination frequency.
#define LALINSPIRALH_EORDERMISSING
The PN order requested is not implemented for this approximant.
#define LALINSPIRALH_EMEM
Memory allocation error.
#define LALINSPIRALH_ENULL
Arguments contained an unexpected null pointer.
#define LALINSPIRALH_ESIZE
Invalid input range.
LAL_PNORDER_TWO_POINT_FIVE
LAL_PNORDER_THREE_POINT_FIVE
LAL_PNORDER_ONE_POINT_FIVE
const LALUnit lalStrainUnit
const LALUnit lalHertzUnit
const LALUnit lalDimensionlessUnit
void LALDCreateVector(LALStatus *, REAL8Vector **, UINT4)
void LALDDestroyVector(LALStatus *, REAL8Vector **)
void LALSDestroyVector(LALStatus *, REAL4Vector **)
void LALSCreateVector(LALStatus *, REAL4Vector **, UINT4)
REAL4TimeVectorSeries * a
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 dfdt
The maximum value of encountered over any timestep used in generating 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.
REAL8 deltaT
The requested sampling interval of the waveform, in s.
REAL4VectorSequence * data
This structure contains various post-Newtonian and P-approximant expansion coefficients; the meanings...
Structure containing steps and controls for the GSL Runge-Kutta solver.
Structure used as an input to Runge-Kutta solver.