LALPulsar  6.1.0.1-89842e6
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 
32 static REAL8 gsl_E_solver( REAL8 e, void *p );
33 
35  REAL8 a, b, x;
36 };
37 
38 static 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  */
168 void
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)
int s
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