Loading [MathJax]/extensions/TeX/AMSsymbols.js
LALPulsar 7.1.1.1-5e288d3
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
GenerateEllipticSpinOrbitCW.c
Go to the documentation of this file.
1/*
2* Copyright (C) 2007 Reinhard Prix, Teviet Creighton
3* Copyright (C) 2012 Teviet Creighton, Evan Goetz
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#include <lal/LALStdio.h>
22#include <lal/LALStdlib.h>
23#include <lal/LALConstants.h>
24#include <lal/Units.h>
25#include <lal/AVFactories.h>
26#include <lal/SeqFactories.h>
27#include <lal/PulsarSimulateCoherentGW.h>
28#include <lal/GenerateSpinOrbitCW.h>
29#include <gsl/gsl_roots.h>
30
31
32static REAL8 gsl_E_solver( REAL8 e, void *p );
33
36};
37
38static REAL8 gsl_E_solver( REAL8 e, void *p )
39{
40 struct E_solver_params *params = ( struct E_solver_params * )p;
41 return e + params->a * sin( e ) + params->b * ( cos( e ) - 1.0 ) - params->x;
42}
43
44/**
45 * \author Creighton, T. D.
46 *
47 * \brief Computes a continuous waveform with frequency drift and Doppler
48 * modulation from an elliptical orbital trajectory.
49 *
50 * This function computes a quaiperiodic waveform using the spindown and
51 * orbital parameters in <tt>*params</tt>, storing the result in
52 * <tt>*output</tt>.
53 *
54 * In the <tt>*params</tt> structure, the routine uses all the "input"
55 * fields specified in \ref GenerateSpinOrbitCW_h, and sets all of the
56 * "output" fields. If <tt>params->f</tt>=\c NULL, no spindown
57 * modulation is performed. If <tt>params->oneMinusEcc</tt> \f$ \notin(0,1] \f$
58 * (an open orbit), or if
59 * <tt>params->rPeriNorm</tt> \f$ \times \f$ <tt>params->angularSpeed</tt> \f$ \geq1 \f$
60 * (faster-than-light speed at periapsis), an error is returned.
61 *
62 * In the <tt>*output</tt> structure, the field <tt>output->h</tt> is
63 * ignored, but all other pointer fields must be set to \c NULL. The
64 * function will create and allocate space for <tt>output->a</tt>,
65 * <tt>output->f</tt>, and <tt>output->phi</tt> as necessary. The
66 * <tt>output->shift</tt> field will remain set to \c NULL.
67 *
68 * ### Algorithm ###
69 *
70 * For elliptical orbits, we combine \eqref{eq_spinorbit-tr},
71 * \eqref{eq_spinorbit-t}, and \eqref{eq_spinorbit-upsilon} to get \f$ t_r \f$
72 * directly as a function of the eccentric anomaly \f$ E \f$ :
73 * \f{eqnarray}{
74 * \label{eq_tr-e1}
75 * t_r = t_p & + & \left(\frac{r_p \sin i}{c}\right)\sin\omega\\
76 * & + & \left(\frac{P}{2\pi}\right) \left( E +
77 * \left[v_p(1-e)\cos\omega - e\right]\sin E
78 * + \left[v_p\sqrt{\frac{1-e}{1+e}}\sin\omega\right]
79 * [\cos E - 1]\right) \;,
80 * \f}
81 * where \f$ v_p=r_p\dot{\upsilon}_p\sin i/c \f$ is a normalized velocity at
82 * periapsis and \f$ P=2\pi\sqrt{(1+e)/(1-e)^3}/\dot{\upsilon}_p \f$ is the
83 * period of the orbit. For simplicity we write this as:
84 * \f{equation}{
85 * \label{eq_tr-e2}
86 * t_r = T_p + \frac{1}{n}\left( E + A\sin E + B[\cos E - 1] \right) \;,
87 * \f}
88 *
89 * \anchor inject_eanomaly
90 * \image html inject_eanomaly.png "Function to be inverted to find eccentric anomaly"
91 *
92 * where \f$ T_p \f$ is the \e observed time of periapsis passage and
93 * \f$ n=2\pi/P \f$ is the mean angular speed around the orbit. Thus the key
94 * numerical procedure in this routine is to invert the expression
95 * \f$ x=E+A\sin E+B(\cos E - 1) \f$ to get \f$ E(x) \f$ . We note that
96 * \f$ E(x+2n\pi)=E(x)+2n\pi \f$ , so we only need to solve this expression in
97 * the interval \f$ [0,2\pi) \f$ , sketched to the right.
98 *
99 * We further note that \f$ A^2+B^2<1 \f$ , although it approaches 1 when
100 * \f$ e\rightarrow1 \f$ , or when \f$ v_p\rightarrow1 \f$ and either \f$ e=0 \f$ or
101 * \f$ \omega=\pi \f$ . Except in this limit, Newton-Raphson methods will
102 * converge rapidly for any initial guess. In this limit, though, the
103 * slope \f$ dx/dE \f$ approaches zero at the point of inflection, and an
104 * initial guess or iteration landing near this point will send the next
105 * iteration off to unacceptably large or small values. However, by
106 * restricting all initial guesses and iterations to the domain
107 * \f$ E\in[0,2\pi) \f$ , one will always end up on a trajectory branch that
108 * will converge uniformly. This should converge faster than the more
109 * generically robust technique of bisection. (Note: the danger with Newton's method
110 * has been found to be unstable for certain binary orbital parameters. So if
111 * Newton's method fails to converge, a bisection algorithm is employed.)
112 *
113 * In this algorithm, we start the computation with an arbitrary initial
114 * guess of \f$ E=0 \f$ , and refine it until the we get agreement to within
115 * 0.01 parts in part in \f$ N_\mathrm{cyc} \f$ (where \f$ N_\mathrm{cyc} \f$ is the
116 * larger of the number of wave cycles in an orbital period, or the
117 * number of wave cycles in the entire waveform being generated), or one
118 * part in \f$ 10^{15} \f$ (an order of magnitude off the best precision
119 * possible with \c REAL8 numbers). The latter case indicates that
120 * \c REAL8 precision may fail to give accurate phasing, and one
121 * should consider modeling the orbit as a set of Taylor frequency
122 * coefficients \'{a} la <tt>LALGenerateTaylorCW()</tt>. On subsequent
123 * timesteps, we use the previous timestep as an initial guess, which is
124 * good so long as the timesteps are much smaller than an orbital period.
125 * This sequence of guesses will have to readjust itself once every orbit
126 * (as \f$ E \f$ jumps from \f$ 2\pi \f$ down to 0), but this is relatively
127 * infrequent; we don't bother trying to smooth this out because the
128 * additional tests would probably slow down the algorithm overall.
129 *
130 * Once a value of \f$ E \f$ is found for a given timestep in the output
131 * series, we compute the system time \f$ t \f$ via \eqref{eq_spinorbit-t},
132 * and use it to determine the wave phase and (non-Doppler-shifted)
133 * frequency via \eqref{eq_taylorcw-freq}
134 * and \eqref{eq_taylorcw-phi}. The Doppler shift on the frequency is
135 * then computed using \eqref{eq_spinorbit-upsilon}
136 * and \eqref{eq_orbit-rdot}. We use \f$ \upsilon \f$ as an intermediate in
137 * the Doppler shift calculations, since expressing \f$ \dot{R} \f$ directly in
138 * terms of \f$ E \f$ results in expression of the form \f$ (1-e)/(1-e\cos E) \f$ ,
139 * which are difficult to simplify and face precision losses when
140 * \f$ E\sim0 \f$ and \f$ e\rightarrow1 \f$ . By contrast, solving for \f$ \upsilon \f$ is
141 * numerically stable provided that the system <tt>atan2()</tt> function is
142 * well-designed.
143 *
144 * The routine does not account for variations in special relativistic or
145 * gravitational time dilation due to the elliptical orbit, nor does it
146 * deal with other gravitational effects such as Shapiro delay. To a
147 * very rough approximation, the amount of phase error induced by
148 * gravitational redshift goes something like \f$ \Delta\phi\sim
149 * fT(v/c)^2\Delta(r_p/r) \f$ , where \f$ f \f$ is the typical wave frequency, \f$ T \f$
150 * is either the length of data or the orbital period (whichever is
151 * \e smaller), \f$ v \f$ is the \e true (unprojected) speed at
152 * periapsis, and \f$ \Delta(r_p/r) \f$ is the total range swept out by the
153 * quantity \f$ r_p/r \f$ over the course of the observation. Other
154 * relativistic effects such as special relativistic time dilation are
155 * comparable in magnitude. We make a crude estimate of when this is
156 * significant by noting that \f$ v/c\gtrsim v_p \f$ but
157 * \f$ \Delta(r_p/r)\lesssim 2e/(1+e) \f$ ; we take these approximations as
158 * equalities and require that \f$ \Delta\phi\lesssim\pi \f$ , giving:
159 * \f{equation}{
160 * \label{eq_relativistic-orbit}
161 * f_0Tv_p^2\frac{4e}{1+e}\lesssim1 \;.
162 * \f}
163 * When this critereon is violated, a warning is generated. Furthermore,
164 * as noted earlier, when \f$ v_p\geq1 \f$ the routine will return an error, as
165 * faster-than-light speeds can cause the emission and reception times to
166 * be non-monotonic functions of one another.
167 */
168void
172{
173 UINT4 n, i; /* number of and index over samples */
174 UINT4 nSpin = 0, j; /* number of and index over spindown terms */
175 REAL8 t, dt, tPow; /* time, interval, and t raised to a power */
176 REAL8 phi0, f0, twopif0; /* initial phase, frequency, and 2*pi*f0 */
177 REAL8 f, fPrev; /* current and previous values of frequency */
178 REAL4 df = 0.0; /* maximum difference between f and fPrev */
179 REAL8 phi; /* current value of phase */
180 REAL8 p, vDotAvg; /* orbital period, and 2*pi/(period) */
181 REAL8 vp; /* projected speed at periapsis */
182 REAL8 upsilon, argument; /* true anomaly, and argument of periapsis */
183 REAL8 eCosOmega; /* eccentricity * cosine of argument */
184 REAL8 tPeriObs; /* time of observed periapsis */
185 REAL8 spinOff; /* spin epoch - orbit epoch */
186 REAL8 x; /* observed mean anomaly */
187 REAL8 dx, dxMax; /* current and target errors in x */
188 REAL8 a, b; /* constants in equation for x */
189 REAL8 ecc; /* orbital eccentricity */
190 REAL8 oneMinusEcc, onePlusEcc; /* 1 - ecc and 1 + ecc */
191 REAL8 e = 0.0; /* eccentric anomaly */
192 REAL8 de = 0.0; /* eccentric anomaly step */
193 REAL8 sine = 0.0, cose = 0.0; /* sine of e, and cosine of e minus 1 */
194 REAL8 *fSpin = NULL; /* pointer to Taylor coefficients */
195 REAL4 *fData; /* pointer to frequency data */
196 REAL8 *phiData; /* pointer to phase data */
197
198 INITSTATUS( stat );
200
201 /* Make sure parameter and output structures exist. */
203 GENERATESPINORBITCWH_MSGENUL );
205 GENERATESPINORBITCWH_MSGENUL );
206
207 /* Make sure output fields don't exist. */
209 GENERATESPINORBITCWH_MSGEOUT );
211 GENERATESPINORBITCWH_MSGEOUT );
213 GENERATESPINORBITCWH_MSGEOUT );
215 GENERATESPINORBITCWH_MSGEOUT );
216
217 /* If Taylor coeficients are specified, make sure they exist. */
218 if ( params->f ) {
220 GENERATESPINORBITCWH_MSGENUL );
221 nSpin = params->f->length;
222 fSpin = params->f->data;
223 }
224
225 /* Set up some constants (to avoid repeated calculation or
226 dereferencing), and make sure they have acceptable values. */
227 oneMinusEcc = params->oneMinusEcc;
228 ecc = 1.0 - oneMinusEcc;
229 onePlusEcc = 1.0 + ecc;
230 if ( ecc < 0.0 || oneMinusEcc <= 0.0 ) {
232 GENERATESPINORBITCWH_MSGEECC );
233 }
234 vp = params->rPeriNorm * params->angularSpeed;
235 n = params->length;
236 dt = params->deltaT;
237 f0 = fPrev = params->f0;
238 vDotAvg = params->angularSpeed
239 * sqrt( oneMinusEcc * oneMinusEcc * oneMinusEcc / onePlusEcc );
240 if ( vp >= 1.0 ) {
242 GENERATESPINORBITCWH_MSGEFTL );
243 }
244 if ( vp <= 0.0 || dt <= 0.0 || f0 <= 0.0 || vDotAvg <= 0.0 ||
245 n == 0 ) {
247 GENERATESPINORBITCWH_MSGESGN );
248 }
249
250 /* Set up some other constants. */
251 twopif0 = f0 * LAL_TWOPI;
252 phi0 = params->phi0;
253 argument = params->omega;
254 p = LAL_TWOPI / vDotAvg;
255 a = vp * oneMinusEcc * cos( argument ) + oneMinusEcc - 1.0;
256 b = vp * sqrt( oneMinusEcc / ( onePlusEcc ) ) * sin( argument );
257 eCosOmega = ecc * cos( argument );
258 if ( n * dt > p ) {
259 dxMax = 0.01 / ( f0 * n * dt );
260 } else {
261 dxMax = 0.01 / ( f0 * p );
262 }
263 if ( dxMax < 1.0e-15 ) {
264 dxMax = 1.0e-15;
265 LALWarning( stat, "REAL8 arithmetic may not have sufficient"
266 " precision for this orbit" );
267 }
268 if ( lalDebugLevel & LALWARNING ) {
269 REAL8 tau = n * dt;
270 if ( tau > p ) {
271 tau = p;
272 }
273 if ( f0 * tau * vp * vp * ecc / onePlusEcc > 0.25 )
274 LALWarning( stat, "Orbit may have significant relativistic"
275 " effects that are not included" );
276 }
277
278 /* Compute offset between time series epoch and observed periapsis,
279 and betweem true periapsis and spindown reference epoch. */
280 tPeriObs = ( REAL8 )( params->orbitEpoch.gpsSeconds -
282 tPeriObs += 1.0e-9 * ( REAL8 )( params->orbitEpoch.gpsNanoSeconds -
284 tPeriObs += params->rPeriNorm * sin( params->omega );
285 spinOff = ( REAL8 )( params->orbitEpoch.gpsSeconds -
286 params->spinEpoch.gpsSeconds );
287 spinOff += 1.0e-9 * ( REAL8 )( params->orbitEpoch.gpsNanoSeconds -
288 params->spinEpoch.gpsNanoSeconds );
289
290 /* Allocate output structures. */
291 if ( ( output->a = ( REAL4TimeVectorSeries * )
292 LALMalloc( sizeof( REAL4TimeVectorSeries ) ) ) == NULL ) {
294 GENERATESPINORBITCWH_MSGEMEM );
295 }
296 memset( output->a, 0, sizeof( REAL4TimeVectorSeries ) );
297 if ( ( output->f = ( REAL4TimeSeries * )
298 LALMalloc( sizeof( REAL4TimeSeries ) ) ) == NULL ) {
299 LALFree( output->a );
300 output->a = NULL;
302 GENERATESPINORBITCWH_MSGEMEM );
303 }
304 memset( output->f, 0, sizeof( REAL4TimeSeries ) );
305 if ( ( output->phi = ( REAL8TimeSeries * )
306 LALMalloc( sizeof( REAL8TimeSeries ) ) ) == NULL ) {
307 LALFree( output->a );
308 output->a = NULL;
309 LALFree( output->f );
310 output->f = NULL;
312 GENERATESPINORBITCWH_MSGEMEM );
313 }
314 memset( output->phi, 0, sizeof( REAL8TimeSeries ) );
315
316 /* Set output structure metadata fields. */
317 output->position = params->position;
318 output->psi = params->psi;
319 output->a->epoch = output->f->epoch = output->phi->epoch
320 = params->epoch;
321 output->a->deltaT = n * params->deltaT;
322 output->f->deltaT = output->phi->deltaT = params->deltaT;
323 output->a->sampleUnits = lalStrainUnit;
324 output->f->sampleUnits = lalHertzUnit;
325 output->phi->sampleUnits = lalDimensionlessUnit;
326 snprintf( output->a->name, LALNameLength, "CW amplitudes" );
327 snprintf( output->f->name, LALNameLength, "CW frequency" );
328 snprintf( output->phi->name, LALNameLength, "CW phase" );
329
330 /* Allocate phase and frequency arrays. */
331 LALSCreateVector( stat->statusPtr, &( output->f->data ), n );
332 BEGINFAIL( stat ) {
333 LALFree( output->a );
334 output->a = NULL;
335 LALFree( output->f );
336 output->f = NULL;
337 LALFree( output->phi );
338 output->phi = NULL;
339 }
340 ENDFAIL( stat );
341 LALDCreateVector( stat->statusPtr, &( output->phi->data ), n );
342 BEGINFAIL( stat ) {
343 TRY( LALSDestroyVector( stat->statusPtr, &( output->f->data ) ),
344 stat );
345 LALFree( output->a );
346 output->a = NULL;
347 LALFree( output->f );
348 output->f = NULL;
349 LALFree( output->phi );
350 output->phi = NULL;
351 }
352 ENDFAIL( stat );
353
354 /* Allocate and fill amplitude array. */
355 {
356 CreateVectorSequenceIn in; /* input to create output->a */
357 in.length = 2;
358 in.vectorLength = 2;
359 LALSCreateVectorSequence( stat->statusPtr, &( output->a->data ), &in );
360 BEGINFAIL( stat ) {
361 TRY( LALSDestroyVector( stat->statusPtr, &( output->f->data ) ),
362 stat );
363 TRY( LALDDestroyVector( stat->statusPtr, &( output->phi->data ) ),
364 stat );
365 LALFree( output->a );
366 output->a = NULL;
367 LALFree( output->f );
368 output->f = NULL;
369 LALFree( output->phi );
370 output->phi = NULL;
371 }
372 ENDFAIL( stat );
373 output->a->data->data[0] = output->a->data->data[2] = params->aPlus;
374 output->a->data->data[1] = output->a->data->data[3] = params->aCross;
375 }
376
377 /* Fill frequency and phase arrays. */
378 fData = output->f->data->data;
379 phiData = output->phi->data->data;
380 for ( i = 0; i < n; i++ ) {
381 INT4 nOrb; /* number of orbits since the specified orbit epoch */
382
383 /* First, find x in the range [0,2*pi]. */
384 x = vDotAvg * ( i * dt - tPeriObs );
385 nOrb = ( INT4 )( x / LAL_TWOPI );
386 if ( x < 0.0 ) {
387 nOrb -= 1;
388 }
389 x -= LAL_TWOPI * nOrb;
390
391 /* Newton-Raphson iteration to find E(x). Maximum of 100 iterations. */
392 INT4 maxiter = 100, iter = 0;
393 while ( iter < maxiter && fabs( dx = e + a * sine + b * cose - x ) > dxMax ) {
394 iter++;
395 //Make a check on the step-size so we don't step too far
396 de = dx / ( 1.0 + a * cose + a - b * sine );
397 if ( de > LAL_PI ) {
398 de = LAL_PI;
399 } else if ( de < -LAL_PI ) {
400 de = -LAL_PI;
401 }
402 e -= de;
403
404 if ( e < 0.0 ) {
405 e = 0.0;
406 } else if ( e > LAL_TWOPI ) {
407 e = LAL_TWOPI;
408 }
409 sine = sin( e );
410 cose = cos( e ) - 1.0;
411 }
412 /* Bisection algorithm from GSL if Newton's method (above) fails to converge. */
413 if ( iter == maxiter && fabs( dx = e + a * sine + b * cose - x ) > dxMax ) {
414 //Initialize solver
415 const gsl_root_fsolver_type *T = gsl_root_fsolver_bisection;
416 gsl_root_fsolver *s = gsl_root_fsolver_alloc( T );
417 REAL8 e_lo = 0.0, e_hi = LAL_TWOPI;
418 gsl_function F;
419 struct E_solver_params pars = {a, b, x};
420 F.function = &gsl_E_solver;
421 F.params = &pars;
422
423 if ( gsl_root_fsolver_set( s, &F, e_lo, e_hi ) != 0 ) {
424 LALFree( output->a );
425 output->a = NULL;
426 LALFree( output->f );
427 output->f = NULL;
428 LALFree( output->phi );
429 output->phi = NULL;
430 ABORT( stat, -1, "GSL failed to set initial points" );
431 }
432
433 INT4 keepgoing = 1;
434 INT4 success = 0;
435 INT4 root_status = keepgoing;
436 e = 0.0;
437 iter = 0;
438 while ( root_status == keepgoing && iter < maxiter ) {
439 iter++;
440 root_status = gsl_root_fsolver_iterate( s );
441 if ( root_status != keepgoing && root_status != success ) {
442 LALFree( output->a );
443 output->a = NULL;
444 LALFree( output->f );
445 output->f = NULL;
446 LALFree( output->phi );
447 output->phi = NULL;
448 ABORT( stat, -1, "gsl_root_fsolver_iterate() failed" );
449 }
450 e = gsl_root_fsolver_root( s );
451 sine = sin( e );
452 cose = cos( e ) - 1.0;
453 if ( fabs( dx = e + a * sine + b * cose - x ) > dxMax ) {
454 root_status = keepgoing;
455 } else {
456 root_status = success;
457 }
458 }
459
460 if ( root_status != success ) {
461 LALFree( output->a );
462 output->a = NULL;
463 LALFree( output->f );
464 output->f = NULL;
465 LALFree( output->phi );
466 output->phi = NULL;
467 gsl_root_fsolver_free( s );
468 ABORT( stat, -1, "Could not converge using bisection algorithm" );
469 }
470
471 gsl_root_fsolver_free( s );
472 }
473
474 /* Compute source emission time, phase, and frequency. */
475 phi = t = tPow =
476 ( e + LAL_TWOPI * nOrb - ecc * sine ) / vDotAvg + spinOff;
477 f = 1.0;
478 for ( j = 0; j < nSpin; j++ ) {
479 f += fSpin[j] * tPow;
480 phi += fSpin[j] * ( tPow *= t ) / ( j + 2.0 );
481 }
482
483 /* Appy frequency Doppler shift. */
484 upsilon = 2.0 * atan2( sqrt( onePlusEcc / oneMinusEcc ) * sin( 0.5 * e ), cos( 0.5 * e ) );
485 f *= f0 / ( 1.0 + vp * ( cos( argument + upsilon ) + eCosOmega ) / onePlusEcc );
486 phi *= twopif0;
487 if ( ( i > 0 ) && ( fabs( f - fPrev ) > df ) ) {
488 df = fabs( f - fPrev );
489 }
490 *( fData++ ) = fPrev = f;
491 *( phiData++ ) = phi + phi0;
492
493 } /* for i < n */
494
495 /* Set output field and return. */
496 params->dfdt = df * dt;
498 RETURN( stat );
499}
static REAL8 gsl_E_solver(REAL8 e, void *p)
int j
#define LALMalloc(n)
#define LALFree(p)
#define ABORT(statusptr, code, mesg)
#define ENDFAIL(statusptr)
#define TRY(func, statusptr)
#define ATTATCHSTATUSPTR(statusptr)
#define ASSERT(assertion, statusptr, code, mesg)
#define DETATCHSTATUSPTR(statusptr)
#define INITSTATUS(statusptr)
#define RETURN(statusptr)
#define BEGINFAIL(statusptr)
double e
void LALSCreateVectorSequence(LALStatus *status, REAL4VectorSequence **vectorSequence, CreateVectorSequenceIn *vSeqParams)
#define GENERATESPINORBITCWH_EECC
Eccentricity out of range.
#define GENERATESPINORBITCWH_ESGN
Sign error: positive parameter expected.
void LALGenerateEllipticSpinOrbitCW(LALStatus *stat, PulsarCoherentGW *output, SpinOrbitCWParamStruc *params)
Computes a continuous waveform with frequency drift and Doppler modulation from an elliptical orbital...
#define GENERATESPINORBITCWH_EMEM
Out of memory.
#define GENERATESPINORBITCWH_ENUL
Unexpected null pointer in arguments.
#define GENERATESPINORBITCWH_EOUT
Output field a, f, phi, or shift already exists.
#define GENERATESPINORBITCWH_EFTL
Periapsis motion is faster than light.
#define LAL_PI
#define LAL_TWOPI
double REAL8
uint32_t UINT4
int32_t INT4
float REAL4
LALNameLength
#define lalDebugLevel
LALWARNING
int LALWarning(LALStatus *status, const char *warning)
static const INT4 a
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)
T
n
INT4 gpsNanoSeconds
This structure stores a representation of a plane gravitational wave propagating from a particular po...
This structure stores the parameters for constructing a gravitational waveform with both a Taylor-pol...
LIGOTimeGPS epoch
double psi
double df