LALEOBWaveform.c

Go to the documentation of this file.
00001 /*
00002 *  Copyright (C) 2007 Stas Babak, David Churches, Duncan Brown, David Chin, Jolien Creighton, 
00003 *                     B.S. Sathyaprakash, Craig Robinson , Thomas Cokelaer, Evan Ochsner
00004 *
00005 *  This program is free software; you can redistribute it and/or modify
00006 *  it under the terms of the GNU General Public License as published by
00007 *  the Free Software Foundation; either version 2 of the License, or
00008 *  (at your option) any later version.
00009 *
00010 *  This program is distributed in the hope that it will be useful,
00011 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 *  GNU General Public License for more details.
00014 *
00015 *  You should have received a copy of the GNU General Public License
00016 *  along with with program; see the file COPYING. If not, write to the
00017 *  Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
00018 *  MA  02111-1307  USA
00019 */
00020 
00021 /*  <lalVerbatim file="LALEOBWaveformCV">
00022 Author: Sathyaprakash, B. S., Cokelaer T.
00023 $Id: LALEOBWaveform.c,v 1.55 2008/05/29 17:08:13 spxcar Exp $
00024 </lalVerbatim>  */
00025 
00026 /*  <lalLaTeX>
00027 
00028 \subsection{Module \texttt{LALEOBWaveform.c} and 
00029 \texttt{LALEOBWaveformTemplates.c}}
00030 
00031 Module to generate effective-one-body waveforms.
00032 
00033 \subsubsection*{Prototypes}
00034 \vspace{0.1in}
00035 \input{LALEOBWaveformCP}
00036 \index{\verb&LALEOBWaveform()&}
00037 \begin{itemize}
00038 \item {\tt signal:} Output containing the inspiral waveform.
00039 \item {\tt params:} Input containing binary chirp parameters.
00040 \end{itemize}
00041 
00042 \input{LALEOBWaveformTemplatesCP}
00043 \index{\verb&LALEOBWaveformTemplates()&}
00044 \begin{itemize}
00045 \item {\tt signal1:} Output containing the 0-phase inspiral waveform.
00046 \item {\tt signal2:} Output containing the $\pi/2$-phase inspiral waveform.
00047 \item {\tt params:} Input containing binary chirp parameters.
00048 \end{itemize}
00049 
00050 \input{LALEOBWaveformForInjectionCP}
00051 \index{\verb&LALEOBWaveformForInjection()&}
00052 \begin{itemize}
00053 \item {\tt inject\_hc:} Output containing the 0-phase inspiral waveform.
00054 \item {\tt inject\_hp:} Output containing the $\pi/2$-phase inspiral waveform.
00055 \item {\tt inject\_phase:} Output containing the phase of inspiral waveform.
00056 \item {\tt inject\_freq:} Output containing the frequency of inspiral waveform.
00057 \item {\tt params:} Input containing binary chirp parameters.
00058 \end{itemize}
00059 
00060 
00061 \subsubsection*{Description}
00062 By solving four coupled ordinary differential equations in
00063 Eq.~(\ref{eq:3.28})-(\ref{3.31}) this module computes the
00064 waveform in Eq.~(\ref{4.1}) (see discussion in Sec.~\ref{sec:EOB}
00065 for details on how the initial conditions are chosen, when the
00066 waveform is terminated and so on). 
00067 No quasi-normal mode oscillations are added to the plunge signal
00068 so the waveform is terminated around $2.8\,M$.
00069 \subsection*{3PN vs 2PN}
00070 At 3PN, two additional parameters exist namely OmegaS and Zeta2. 
00071 The first parameters should be set to zero. If the  second parameter
00072 is also set to zero then the waveform correponds to the standard 
00073 waveforms. 
00074 \subsubsection*{Algorithm}
00075 A fourth order Runge-Kutta is used to solve the differential equations.
00076 
00077 \subsubsection*{Uses}
00078 \begin{verbatim}
00079    LALInspiralSetup 
00080    LALInspiralChooseModel
00081    LALInspiralVelocity
00082    LALInspiralPhasing1
00083    LALDBisectionFindRoot
00084    LALRungeKutta4
00085    LALHCapDerivatives
00086    LALHCapDerivatives3PN
00087    LALHCapDerivativesP4PN
00088    LALlightRingRadius
00089    LALlightRingRadius3PN
00090    LALlightRingRadiusP4PN
00091    LALpphiInit
00092    LALpphiInit3PN
00093    LALpphiInitP4PN
00094    LALprInit
00095    LALprInit3PN
00096    LALprInitP4PN
00097    LALrOfOmega
00098    LALrOfOmega3PN
00099    LALrOfOmegaP4PN
00100 \end{verbatim}
00101 
00102 \subsubsection*{Notes}
00103 The length of the waveform returned by {\tt LALInspiralWaveLength} is 
00104 occassionally smaller than what is required to hold an EOB waveform.
00105 This is because EOB goes beyond the last stable orbit up to the light
00106 ring while {\tt LALInspiralWaveLength} assumes that the waveform terminates
00107 at the last stable orbit. It is recommended that a rather generous 
00108 {\tt params->nEndPad} be used to prevent the code from crashing.
00109 
00110 \vfill{\footnotesize\input{LALEOBWaveformCV}}
00111 
00112 </lalLaTeX>  */
00113 #include <lal/Units.h>
00114 #include <lal/LALInspiral.h>
00115 #include <lal/FindRoot.h>
00116 #include <lal/SeqFactories.h>
00117 #include <lal/NRWaveInject.h>
00118 
00119 typedef struct tagrOfOmegaIn {
00120    REAL8 eta, omega;
00121 } rOfOmegaIn;
00122 
00123 typedef struct tagPr3In {
00124   REAL8 eta, zeta2, omegaS, omega, vr,r,q;
00125   InspiralDerivativesIn in3copy; 
00126 } pr3In;
00127 
00128 static void 
00129 omegaofr3PN (
00130              REAL8 *x,
00131              REAL8 r, 
00132              void *params) ;
00133 
00134 static void
00135 omegaofrP4PN (
00136              REAL8 *x,
00137              REAL8 r,
00138              void *params) ;
00139 
00140 static 
00141 void LALHCapDerivatives(        REAL8Vector *values, 
00142                                 REAL8Vector *dvalues, 
00143                                 void            *funcParams);
00144 
00145 static 
00146 void LALprInit( REAL8           *pr, 
00147                                 REAL8           r, 
00148                                 InspiralDerivativesIn   *ak);
00149 
00150 static 
00151 void LALpphiInit(       REAL8 *phase, 
00152                         REAL8 r, 
00153                         REAL8 eta);
00154 
00155 static 
00156 void LALlightRingRadius(        LALStatus       *status,
00157                                 REAL8           *x, 
00158                                 REAL8           r, 
00159                                 void    *params);
00160                                                         
00161 static void LALrOfOmega (       LALStatus       *status, 
00162                                 REAL8           *x,
00163                                 REAL8           r, 
00164                                 void            *params);
00165 
00166 static
00167 void LALHCapDerivatives3PN(     REAL8Vector     *values,
00168                                 REAL8Vector     *dvalues, 
00169                                 void                    *funcParams);
00170                                                         
00171 static
00172 void LALprInit3PN(LALStatus *status, REAL8 *pr , REAL8 , void  *params);
00173 
00174 static
00175 void LALpphiInit3PN(REAL8 *phase, REAL8 r, REAL8 eta, REAL8 omegaS);
00176 
00177 static
00178 void LALlightRingRadius3PN(LALStatus *status, REAL8 *x, REAL8 r, void *params);
00179 
00180 static
00181 void LALrOfOmega3PN (LALStatus *status, REAL8 *x, REAL8 r, void *params);
00182 
00183 static
00184 void LALvr3PN(REAL8 *vr, void *params);
00185 
00186 static
00187 void LALHCapDerivativesP4PN(     REAL8Vector     *values,
00188                                 REAL8Vector     *dvalues,
00189                                 void                    *funcParams);
00190 
00191 static
00192 void LALprInitP4PN(LALStatus *status, REAL8 *pr , REAL8 , void  *params);
00193 
00194 static
00195 void LALpphiInitP4PN(REAL8 *phase, REAL8 r, REAL8 eta, REAL8 omegaS);
00196 
00197 static
00198 void LALlightRingRadiusP4PN(LALStatus *status, REAL8 *x, REAL8 r, void *params);
00199 
00200 static
00201 void LALrOfOmegaP4PN (LALStatus *status, REAL8 *x, REAL8 r, void *params);
00202 
00203 static
00204 void LALvrP4PN(REAL8 *vr, void *params);
00205 
00206 static void
00207 LALEOBWaveformEngine (
00208                 LALStatus        *status,
00209                 REAL4Vector      *signal1,
00210                 REAL4Vector      *signal2,
00211                 REAL4Vector      *h,
00212                 REAL4Vector      *a,
00213                 REAL4Vector      *ff,
00214                 REAL8Vector      *phi,
00215                 UINT4            *countback,
00216                 InspiralTemplate *params,
00217                 InspiralInit     *paramsInit
00218                 );
00219 
00220 NRCSID (LALEOBWAVEFORMC, 
00221 "$Id: LALEOBWaveform.c,v 1.55 2008/05/29 17:08:13 spxcar Exp $");
00222 
00223 /*--------------------------------------------------------------------*/
00224 
00225 static void 
00226 LALprInit(
00227    REAL8 *pr, 
00228    REAL8 r, 
00229    InspiralDerivativesIn *ak
00230    ) 
00231 { 
00232 
00233 /* 
00234         This combines Eq. (4.13), (4.14) (4.16) of BD2 to get 
00235         the initial value of pr 
00236 */
00237 
00238    REAL8        eta,
00239                         z,
00240                         omega,
00241                         jadiab,
00242                         djadiabdr, 
00243                         H0cap, 
00244                         v,
00245                         FDIS,
00246                         A,
00247                         r2,  /* temp variable */
00248                         r3,  /* temp variable */
00249                         cr;
00250 
00251    eta = ak->coeffs->eta;
00252    r2 = r*r;
00253    r3 = r2*r;
00254 
00255    A = 1. - 2./r + 2.*eta/r3;
00256    z = r3 * A * A/(r3 - 3.*r2 + 5.*eta);
00257    omega = sqrt((1.-3*eta/r2)/(r3 * (1. + 2*eta*(sqrt(z)-1.))));
00258    jadiab = sqrt (r2 * (r2 - 3.*eta)/(r3 - 3.*r2 + 5.*eta));
00259    djadiabdr = (r3*r3 - 6.*r3*r2 + 3.*eta*r2*r2 +20.*eta*r3-30.*eta*eta*r)/
00260                (pow(r3 - 3.*r2 + 5.*eta, 2.)*2.*jadiab);
00261    H0cap = sqrt(1. + 2.*eta*(-1. + sqrt(z)))/eta;
00262    cr = A*A/((1.-6.*eta/r2) * eta * H0cap * sqrt(z));
00263    v = pow(omega,oneby3);
00264    FDIS = -ak->flux(v, ak->coeffs)/(eta * omega); 
00265    *pr = FDIS/(djadiabdr*cr);
00266 }
00267 
00268 /*--------------------------------------------------------------------*/
00269 static void 
00270 LALpphiInit(
00271    REAL8 *phase, 
00272    REAL8 r, 
00273    REAL8 eta
00274    )
00275 { 
00276    REAL8 r2, r3;
00277    r2 = r*r;
00278    r3 = r2*r;
00279    *phase = pow(r2 * (r2 - 3.*eta) / (r3 - 3.* r2 + 5.*eta), 0.5);
00280 }
00281 
00282 /*--------------------------------------------------------------------*/
00283 NRCSID (LALROFOMEGAC,
00284 "$Id: LALEOBWaveform.c,v 1.55 2008/05/29 17:08:13 spxcar Exp $");
00285 
00286 static void 
00287 LALrOfOmega (
00288    LALStatus *status, 
00289    REAL8 *x, 
00290    REAL8 r, 
00291    void *params
00292    ) 
00293 { 
00294 
00295    REAL8 r2, r3, A, z, eta, omega;
00296    rOfOmegaIn *rofomegain;
00297 
00298    INITSTATUS(status, "LALrOfOmega", LALROFOMEGAC);
00299    ATTATCHSTATUSPTR(status);
00300    rofomegain = (rOfOmegaIn *) params;
00301    eta = rofomegain->eta;
00302    omega = rofomegain->omega;
00303    r2 = r*r;
00304    r3 = r2*r;
00305 
00306    A = 1. - 2./r + 2.*eta/r3;
00307    z = r3 * A * A/(r3 - 3.*r2 + 5.*eta);
00308    *x = omega - sqrt((1.-3*eta/r2)/(r3 * (1. + 2*eta*(sqrt(z)-1.))));
00309    DETATCHSTATUSPTR(status);
00310    RETURN(status);
00311 }
00312 
00313 /*--------------------------------------------------------------------*/
00314 NRCSID (LALLIGHTRINGRADIUSC, 
00315 "$Id: LALEOBWaveform.c,v 1.55 2008/05/29 17:08:13 spxcar Exp $");
00316 static void 
00317 LALlightRingRadius(
00318    LALStatus *status, 
00319    REAL8 *x, 
00320    REAL8 r, 
00321    void *params
00322    ) 
00323 { 
00324    REAL8 eta;
00325    rOfOmegaIn *rofomegain;
00326 
00327    INITSTATUS(status, "LALlightRingRadius", LALLIGHTRINGRADIUSC);
00328    ATTATCHSTATUSPTR(status);
00329    rofomegain = (rOfOmegaIn *) params;
00330    eta = rofomegain->eta;
00331    *x = pow(r,3.) - 3.*r*r + 5.* eta;
00332    DETATCHSTATUSPTR(status);
00333    RETURN(status);
00334 }
00335 
00336 
00337 static void 
00338 LALHCapDerivatives(
00339    REAL8Vector *values, 
00340    REAL8Vector *dvalues, 
00341    void *funcParams
00342    ) 
00343 { 
00344    REAL8 r, s, p, q, r2, r3, p2, q2, A, B, dA, dB, hcap, Hcap, etahH;
00345    REAL8 omega, v, eta;
00346    InspiralDerivativesIn *ak;
00347 
00348    ak = (InspiralDerivativesIn *) funcParams;
00349 
00350    eta = ak->coeffs->eta;
00351 
00352    r = values->data[0];
00353    s = values->data[1];
00354    p = values->data[2];
00355    q = values->data[3];
00356 
00357    r2 = r*r;
00358    r3 = r2*r;
00359    p2 = p*p;
00360    q2 = q*q;
00361    A = 1. - 2./r + 2.*eta/r3;
00362    B = (1. - 6.*eta/r2)/A;
00363    dA = 2./r2 - 6.*eta/pow(r,4.);
00364    dB = (-dA * B + 12.*eta/r3)/A;
00365    hcap = pow (A*(1. + p2/B + q2/r2), 0.5);
00366    Hcap = pow (1. + 2.*eta*(hcap - 1.), 0.5) / eta;
00367    etahH = eta*hcap*Hcap;
00368 
00369    dvalues->data[0] = A*A*p/((1. - 6.*eta/r2) * etahH);
00370    dvalues->data[1] = omega = A * q / (r2 * etahH);
00371 
00372    v = pow(omega,oneby3);
00373 
00374    dvalues->data[2] = -0.5 * (dA * hcap * hcap/A - p2 * A * dB/(B*B) 
00375                     - 2. * A * q2/r3) / etahH;
00376    dvalues->data[3] = -ak->flux(v, ak->coeffs)/(eta * omega); 
00377    /*
00378    printf("%e %e %e %e %e %e %e %e\n", r, s, p, q, A, B, hcap, Hcap);
00379    */
00380 }
00381 
00382 
00383 
00384 /*--------------------------------------------------------------------*/
00385 
00386   void
00387 LALpphiInit3PN(
00388             REAL8 *phase,
00389             REAL8 r,
00390             REAL8 eta,
00391             REAL8 omegaS
00392             )
00393 {
00394   REAL8 u, u2, u3,  a4, a4p4eta, a4peta2, NA, DA, A, dA;
00395   
00396 
00397   u = 1./r;
00398   u2 = u*u;
00399   u3 = u2*u;
00400   a4 = (ninty4by3etc - 2. * omegaS) * eta;
00401   a4p4eta = a4 + 4. * eta;
00402   a4peta2 = a4 + eta * eta;
00403   NA = 2.*(4.-eta) + (a4 - 16. + 8. * eta) * u;
00404   DA = 2.*(4.-eta) + a4p4eta * u + 2. * a4p4eta * u2 + 4.*a4peta2 * u3;
00405   A = NA/DA;
00406   dA = ( (a4 - 16. + 8. * eta) * DA - NA * (a4p4eta + 4. * a4p4eta * u 
00407                         + 12. * a4peta2  * u2))/(DA*DA);
00408 
00409   *phase = sqrt(-dA/(2.*u*A + u2 * dA));
00410 
00411 }
00412 /*---------------------------------------------------------------*/
00413 
00414 NRCSID (LALPRINIT3PN, 
00415 "$Id: LALEOBWaveform.c,v 1.55 2008/05/29 17:08:13 spxcar Exp $");
00416  void 
00417 LALprInit3PN(
00418              LALStatus *status, 
00419              REAL8 *pr,
00420              REAL8 p,
00421              void *params
00422              ) 
00423 {
00424   REAL8   u, u2, u3, u4, p2, p3, p4, q2, A, DA, NA;
00425   REAL8  onebyD, AbyD, Heff, HReal, etahH;
00426   REAL8 omegaS, eta, a4, a4p4eta, a4peta2, z3, r, vr, q;
00427   pr3In *ak;
00428   
00429   INITSTATUS(status, "LALprInit3PN", LALPRINIT3PN);
00430   ATTATCHSTATUSPTR(status);
00431   ak = (pr3In *) params;
00432   
00433   eta = ak->eta;
00434   vr = ak->vr;
00435   r = ak->r;
00436   q = ak->q;
00437   omegaS = ak->omegaS;
00438   
00439      
00440    p2 = p*p;
00441    p3 = p2*p;
00442    p4 = p2*p2;
00443    q2 = q*q;
00444    u = 1./ r;
00445    u2 = u*u;
00446    u3 = u2 * u;
00447    u4 = u2 * u2;
00448    z3 = 2. * (4. - 3. * eta) * eta;
00449    a4 = (ninty4by3etc - 2. * omegaS) * eta;
00450    a4p4eta = a4 + 4. * eta;
00451    a4peta2 = a4 + eta * eta;  
00452 
00453 /* From DJS 14, 15 */
00454    NA = 2.*(4.-eta) + (a4 - 16. + 8. * eta) * u;
00455    DA = 2.*(4.-eta) + a4p4eta * u + 2. * a4p4eta * u2 + 4.*a4peta2 * u3;
00456    A = NA/DA;
00457    onebyD = 1. + 6.*eta*u2 + 2. * ( 26. - 3. * eta) * eta * u3;
00458    AbyD = A * onebyD;   
00459 
00460    Heff = pow (A*(1. + AbyD * p2 + q*q * u2 + z3 * p4 * u2), 0.5);
00461    HReal = pow (1. + 2.*eta*(Heff - 1.), 0.5) / eta;
00462    etahH = eta*Heff*HReal;
00463    
00464    *pr = -vr +  A*(AbyD*p + 2. * z3 * u2 * p3)/etahH; 
00465    
00466    DETATCHSTATUSPTR(status);
00467    RETURN(status);
00468 }
00469 
00470 static void 
00471 omegaofr3PN (
00472              REAL8 *x,
00473              REAL8 r, 
00474              void *params) 
00475 {
00476    REAL8 u, u2, u3, a4, a4p4eta, a4peta2, eta, NA, DA, A, dA;
00477    REAL8   omegaS;
00478 
00479    /*include a status here ?*/
00480    pr3In *ak;
00481    ak = (pr3In *) params;
00482    omegaS = ak->omegaS;
00483    eta = ak->eta;
00484 
00485    u = 1./r;
00486    u2 = u*u;
00487    u3 = u2*u;
00488    a4 = (ninty4by3etc - 2. * omegaS) * eta;
00489    
00490    a4p4eta = a4 + 4. * eta;
00491    a4peta2 = a4 + eta * eta;
00492    NA = 2.*(4.-eta) + (a4 - 16. + 8. * eta) * u;
00493    DA = 2.*(4.-eta) + a4p4eta * u + 2. * a4p4eta * u2 + 4.*a4peta2 * u3;
00494    A = NA/DA;
00495    dA = ( (a4 - 16. + 8. * eta) * DA - NA 
00496       * (a4p4eta + 4. * a4p4eta * u + 12. * a4peta2  * u2))/(DA*DA);
00497    *x = pow(u,1.5) * sqrt ( -0.5 * dA /(1. + 2.*eta * (A/sqrt(A+0.5 * u*dA)-1.)));
00498 
00499 }
00500 
00501 void 
00502 LALrOfOmega3PN(
00503             LALStatus *status, 
00504             REAL8 *x, 
00505             REAL8 r, 
00506             void *params)
00507 {
00508   REAL8  omega1,omega2,eta ;
00509   pr3In *pr3in;
00510        
00511   status = NULL;
00512   pr3in = (pr3In *) params;
00513   eta = pr3in->eta;
00514 
00515   omega1 = pr3in->omega;
00516   omegaofr3PN(&omega2,r, params);
00517   *x = -omega1 + omega2;
00518 
00519 }
00520 /*--------------------------------------------------------------------*/
00521 NRCSID (LALLIGHTRINGRADIUS3PNC,
00522 "$Id: LALEOBWaveform.c,v 1.55 2008/05/29 17:08:13 spxcar Exp $");
00523  void 
00524 LALlightRingRadius3PN(
00525                       LALStatus *status, 
00526                       REAL8 *x, 
00527                       REAL8 r, 
00528                       void *params
00529                       ) 
00530 { 
00531   REAL8 eta, u, u2, u3, a4, a4p4eta,a4peta2, NA, DA, A, dA;
00532   rOfOmegaIn *rofomegain;
00533   status = NULL;
00534   rofomegain = (rOfOmegaIn *) params;
00535   eta = rofomegain->eta;
00536 
00537 
00538   u = 1./r;
00539   u2 = u*u;
00540   u3 = u2*u;
00541   a4 = ninty4by3etc * eta;
00542   a4p4eta = a4 + 4. * eta;
00543   a4peta2 = a4 + eta * eta;
00544   NA = 2.*(4.-eta) + (a4 - 16. + 8. * eta) * u;
00545   DA = 2.*(4.-eta) + a4p4eta * u + 2. * a4p4eta * u2 + 4.*a4peta2 * u3;
00546   A = NA/DA;
00547   dA = ( (a4 - 16. + 8. * eta) * DA - NA * (a4p4eta + 4. 
00548         * a4p4eta * u + 12. * a4peta2  * u2))/(DA*DA);
00549   *x = 2 * A + dA * u;
00550 }
00551 /*--------------------------------------------------------------------*/
00552 
00553  void 
00554 LALHCapDerivatives3PN(
00555                   REAL8Vector *values,
00556                   REAL8Vector *dvalues,
00557                   void *funcParams
00558                   )
00559 {
00560    REAL8 r, s, p, q, u, u2, u3, u4, p2, p3, p4, q2, Apot, DA, NA;
00561    REAL8  dA, onebyD, DonebyD, AbyD, Heff, HReal, etahH;
00562    REAL8 omega, v, eta, a4, a4p4eta, a4peta2, z2, z30, z3, zeta2;
00563    REAL8 n1, c1, d1, d2, d3, oneby4meta;
00564    REAL8    flexNonAdiab = 0;
00565    REAL8    flexNonCirc = 0;
00566 
00567    InspiralDerivativesIn *ak;
00568 
00569    ak = (InspiralDerivativesIn *) funcParams;
00570    eta = ak->coeffs->eta;
00571    zeta2 = ak->coeffs->zeta2;
00572 
00573    r = values->data[0];
00574    s = values->data[1];
00575    p = values->data[2];
00576    q = values->data[3];
00577 
00578    p2 = p*p;
00579    p3 = p2*p;
00580    p4 = p2*p2;
00581    q2 = q*q;
00582    u = 1./r;
00583    u2 = u*u;
00584    u3 = u2 * u;
00585    u4 = u2 * u2;
00586    z30 = 2.L * (4.L - 3.L * eta) * eta;
00587    z2 = 0.75L * z30 * zeta2,
00588    z3 = z30 * (1.L - zeta2);
00589 
00590    a4 = ninty4by3etc * eta;
00591    a4p4eta = a4 + 4. * eta;
00592    a4peta2 = a4 + eta * eta;
00593    
00594    /* From DJS 3PN Hamiltonian */
00595    oneby4meta = 1./(4.-eta);
00596    n1 = 0.5 * (a4 - 16. + 8.*eta) * oneby4meta;
00597    d1 = 0.5 * a4p4eta * oneby4meta;
00598    d2 = a4p4eta * oneby4meta;
00599    d3 = 2. * a4peta2 * oneby4meta;
00600    NA = 1. + n1 * u;
00601    DA = 1 + d1*u + d2*u2 + d3*u3;
00602    Apot = NA/DA;
00603    
00604    onebyD = 1. + 6.*eta*u2 + (2. * ( 26. - 3. * eta) * eta - z2)* u3;
00605    AbyD = Apot * onebyD;
00606    Heff = pow (Apot*(1. + AbyD * p2 + q*q * u2 + z30 * (p4 + zeta2*(-0.25*p4
00607         + 0.75  * p2 * q2 * u2 )) * u2), 0.5);
00608    HReal = pow (1. + 2.*eta*(Heff - 1.), 0.5) / eta;
00609 
00610    dA = -u2/(DA*DA) * (n1*DA - NA * (d1 + 2.*d2*u + 3.*d3*u2));
00611 
00612    DonebyD = -12.*eta*u3 - (6.*(26. - 3.*eta)*eta - z2)*u4;
00613    etahH = eta*Heff*HReal;
00614 
00615    dvalues->data[0] = Apot*(AbyD*p +  z30 * u2 *(2.* p3 
00616               + zeta2*(-0.5*p3 + 0.75*p*q2*u2)))/etahH;
00617    dvalues->data[1] = omega = Apot * q * u2 * (1. + 0.75*z30*zeta2*p2*u2)/ etahH;
00618    v = pow(omega,oneby3);
00619 
00620    dvalues->data[2] = -0.5 * Apot * (dA*Heff*Heff/(Apot*Apot) - 2.*q2*u3 
00621               + (dA * onebyD + Apot * DonebyD) * p2
00622               + z30 * u3 *(-2.* p4+zeta2*(0.5*p4 - 3.0*p2*q2*u2))) / etahH;
00623 
00624    c1 = 1.+(u2 - 2.*u3*Apot/dA) * q2;
00625    dvalues->data[3] = -(1. - flexNonAdiab*c1) * (1. + flexNonCirc*p2/(q2*u2)) 
00626                                         * ak->flux(v,ak->coeffs)/(eta * omega);
00627 }
00628 
00629 
00630 
00631 /*----------------------------------------------------------------------*/
00632  void LALvr3PN(REAL8 *vr, void *params ) 
00633 {
00634   REAL8 A, dA, d2A, NA, DA, dDA, dNA, d2DA;
00635   REAL8 u, u2, u3, v, x1; 
00636   REAL8 eta,a4, a4p4eta, a4peta2, FDIS;
00637   
00638   pr3In *pr3in;
00639   pr3in = (pr3In *)params;
00640 
00641   eta = pr3in->eta;     
00642   u = 1./ pr3in->r;
00643   
00644   u2 = u*u;
00645   u3 = u2*u;
00646 
00647   
00648   a4 = (ninty4by3etc - 2. * pr3in->omegaS) * eta;
00649   a4p4eta = a4 + 4. * eta;
00650   a4peta2 = a4 + eta * eta;
00651   NA = 2.*(4.-eta) + (a4 - 16. + 8. * eta) * u;
00652   DA = 2.*(4.-eta) + a4p4eta * u + 2. * a4p4eta * u2 + 4.*a4peta2 * u3;
00653   A = NA/DA;
00654   dNA = (a4 - 16. + 8. * eta);
00655   dDA = (a4p4eta + 4. * a4p4eta * u + 12. * a4peta2  * u2);
00656   d2DA = 4. * a4p4eta + 24. * a4peta2 * u;
00657   
00658   dA = (dNA * DA - NA * dDA)/ (DA*DA);
00659   d2A = (-NA * DA * d2DA - 2. * dNA * DA * dDA + 2. * NA * dDA * dDA)/pow(DA,3.);
00660   v = pow(pr3in->omega,oneby3);
00661   FDIS = -pr3in->in3copy.flux(v, pr3in->in3copy.coeffs)/(eta* pr3in->omega);
00662   x1 = -1./u2 * sqrt (-dA * pow(2.* u * A + u2 * dA, 3.) ) 
00663                 / (2.* u * dA * dA + A*dA - u * A * d2A);
00664   *vr = FDIS * x1;
00665 }
00666 
00667 /*-------------------------------------------------------------------*/
00668 /*                      pseudo-4PN functions                         */
00669 /*-------------------------------------------------------------------*/
00670 
00671 void
00672 LALpphiInitP4PN(
00673             REAL8 *phase,
00674             REAL8 r,
00675             REAL8 eta,
00676             REAL8 omegaS
00677             )
00678 {
00679   REAL8 u, u2, u3, u4, a4, a5, eta2, NA, DA, A, dA;
00680 
00681   eta2 = eta*eta;
00682   u = 1./r;
00683   u2 = u*u;
00684   u3 = u2*u;
00685   u4 = u2*u2;
00686   a4 = (ninty4by3etc - 2. * omegaS) * eta;
00687   a5 = 60.;
00688   NA = (32. - 24.*eta - 4.*a4 - a5*eta)*u + (a4 - 16. + 8.*eta);
00689   DA = a4 - 16. + 8.*eta - (2.*a4 + a5*eta + 8.*eta)*u - (4.*a4 + 2.*a5*eta + 16.*eta)*u2
00690        - (8.*a4 + 4.*a5*eta + 2.*a4*eta + 16.*eta2)*u3
00691        + (-a4*a4 - 8.*a5*eta - 8.*a4*eta + 2.*a5*eta2 - 16.*eta2)*u4;
00692   A = NA/DA;
00693   dA = ( (32. - 24.*eta - 4.*a4 - a5*eta) * DA - NA *
00694          ( -(2.*a4 + a5*eta + 8.*eta) - 2.*(4.*a4 + 2.*a5*eta + 16.*eta)*u
00695           - 3.*(8.*a4 + 4.*a5*eta + 2.*a4*eta + 16.*eta2)*u2
00696           + 4.*(-a4*a4 - 8.*a5*eta - 8.*a4*eta + 2.*a5*eta2 - 16.*eta2)*u3))/(DA*DA);
00697   *phase = sqrt(-dA/(2.*u*A + u2 * dA));
00698 /* why is it called phase? This is initial j!? */
00699 }
00700 
00701 /*-------------------------------------------------------------------*/
00702   void
00703 LALprInitP4PN(
00704              LALStatus *status,
00705              REAL8 *pr,
00706              REAL8 p,
00707              void *params
00708              )
00709 {
00710   REAL8   u, u2, u3, u4, p2, p3, p4, q2, A, DA, NA;
00711   REAL8  onebyD, AbyD, Heff, HReal, etahH;
00712   REAL8 eta, eta2, a4, a5, z3, r, vr, q;
00713   pr3In *ak;
00714 
00715   INITSTATUS(status, "LALprInit3PN", LALPRINIT3PN);
00716   ATTATCHSTATUSPTR(status);
00717   ak = (pr3In *) params;
00718 
00719   eta = ak->eta;
00720   vr = ak->vr;
00721   r = ak->r;
00722   q = ak->q;
00723   eta2 = eta*eta;
00724 
00725 
00726    p2 = p*p;
00727    p3 = p2*p;
00728    p4 = p2*p2;
00729    q2 = q*q;
00730    u = 1./ r;
00731    u2 = u*u;
00732    u3 = u2 * u;
00733    u4 = u2 * u2;
00734    z3 = 2. * (4. - 3. * eta) * eta;
00735    a4 = ninty4by3etc * eta;
00736    a5 = 60.;
00737 
00738    NA = (32. - 24.*eta - 4.*a4 - a5*eta)*u + (a4 - 16. + 8.*eta);
00739    DA = a4 - 16. + 8.*eta - (2.*a4 + a5*eta + 8.*eta)*u - (4.*a4 + 2.*a5*eta + 16.*eta)*u2
00740         - (8.*a4 + 4.*a5*eta + 2.*a4*eta + 16.*eta2)*u3
00741         + (-a4*a4 - 8.*a5*eta - 8.*a4*eta + 2.*a5*eta2 - 16.*eta2)*u4;
00742    A = NA/DA;
00743    onebyD = 1. + 6.*eta*u2 + 2. * ( 26. - 3. * eta) * eta * u3 + 36.*eta2*u4;
00744    AbyD = A * onebyD;
00745 
00746    Heff = pow (A*(1. + AbyD * p2 + q*q * u2 + z3 * p4 * u2), 0.5);
00747    HReal = pow (1. + 2.*eta*(Heff - 1.), 0.5) / eta;
00748    etahH = eta*Heff*HReal;
00749 
00750    *pr = -vr +  A*(AbyD*p + 2. * z3 * u2 * p3)/etahH;
00751 /* This sets pr = dH/dpr - vr, calls rootfinder, 
00752    gets value of pr s.t. dH/pr = vr */
00753    DETATCHSTATUSPTR(status);
00754    RETURN(status);
00755 }
00756 
00757 
00758 /*-------------------------------------------------------------------*/
00759 static void
00760 omegaofrP4PN (
00761              REAL8 *x,
00762              REAL8 r,
00763              void *params)
00764 {
00765    REAL8 u, u2, u3, u4, a4, a5, eta, eta2, NA, DA, A, dA;
00766 
00767    /*include a status here ?*/
00768    pr3In *ak;
00769    ak = (pr3In *) params;
00770    eta = ak->eta;
00771    eta2 = eta*eta;
00772 
00773    u = 1./r;
00774    u2 = u*u;
00775    u3 = u2*u;
00776    u4 = u2*u2;
00777    a4 = ninty4by3etc * eta;
00778    a5 = 60.;
00779    NA = (32. - 24.*eta - 4.*a4 - a5*eta)*u + (a4 - 16. + 8.*eta);
00780    DA = a4 - 16. + 8.*eta - (2.*a4 + a5*eta + 8.*eta)*u - (4.*a4 + 2.*a5*eta + 16.*eta)*u2
00781         - (8.*a4 + 4.*a5*eta + 2.*a4*eta + 16.*eta2)*u3
00782         + (-a4*a4 - 8.*a5*eta - 8.*a4*eta + 2.*a5*eta2 - 16.*eta2)*u4;
00783    A = NA/DA;
00784    dA = ( (32. - 24.*eta - 4.*a4 - a5*eta) * DA - NA *
00785           ( -(2.*a4 + a5*eta + 8.*eta) - 2.*(4.*a4 + 2.*a5*eta + 16.*eta)*u
00786            - 3.*(8.*a4 + 4.*a5*eta + 2.*a4*eta + 16.*eta2)*u2
00787            + 4.*(-a4*a4 - 8.*a5*eta - 8.*a4*eta + 2.*a5*eta2 - 16.*eta2)*u3))/(DA*DA); 
00788 
00789    *x = pow(u,1.5) * sqrt ( -0.5 * dA /(1. + 2.*eta * (A/sqrt(A+0.5 * u*dA)-1.)));
00790 
00791 }
00792 
00793 
00794 /*-------------------------------------------------------------------*/
00795 void
00796 LALrOfOmegaP4PN(
00797             LALStatus *status,
00798             REAL8 *x,
00799             REAL8 r,
00800             void *params)
00801 {
00802   REAL8  omega1,omega2,eta ;
00803   pr3In *pr3in;
00804 
00805   status = NULL;
00806   pr3in = (pr3In *) params;
00807   eta = pr3in->eta;
00808 
00809   omega1 = pr3in->omega;
00810   omegaofrP4PN(&omega2,r, params);
00811   *x = -omega1 + omega2;
00812 
00813 }
00814 
00815 
00816 /*-------------------------------------------------------------------*/
00817 static void
00818 LALlightRingRadiusP4PN(
00819                       LALStatus *status,
00820                       REAL8 *x,
00821                       REAL8 r,
00822                       void *params
00823                       )
00824 {
00825   REAL8 eta, eta2, u, u2, u3, u4, a4, a5, NA, DA, A, dA;
00826   rOfOmegaIn *rofomegain;
00827   status = NULL;
00828   rofomegain = (rOfOmegaIn *) params;
00829   eta = rofomegain->eta;
00830   eta2 = eta*eta;
00831 
00832 
00833   u = 1./r;
00834   u2 = u*u;
00835   u3 = u2*u;
00836   u4 = u2*u2;
00837   a4 = ninty4by3etc * eta;
00838   a5 = 60.;
00839   NA = (32. - 24.*eta - 4.*a4 - a5*eta)*u + (a4 - 16. + 8.*eta);
00840   DA = a4 - 16. + 8.*eta - (2.*a4 + a5*eta + 8.*eta)*u - (4.*a4 + 2.*a5*eta + 16.*eta)*u2 
00841        - (8.*a4 + 4.*a5*eta + 2.*a4*eta + 16.*eta2)*u3 
00842        + (-a4*a4 - 8.*a5*eta - 8.*a4*eta + 2.*a5*eta2 - 16.*eta2)*u4;
00843   A = NA/DA;
00844   dA = ( (32. - 24.*eta - 4.*a4 - a5*eta) * DA - NA * 
00845          ( -(2.*a4 + a5*eta + 8.*eta) - 2.*(4.*a4 + 2.*a5*eta + 16.*eta)*u 
00846           - 3.*(8.*a4 + 4.*a5*eta + 2.*a4*eta + 16.*eta2)*u2 
00847           + 4.*(-a4*a4 - 8.*a5*eta - 8.*a4*eta + 2.*a5*eta2 - 16.*eta2)*u3))/(DA*DA);
00848   *x = 2 * A + dA * u;
00849 }
00850 
00851 /*-------------------------------------------------------------------*/
00852  void
00853 LALHCapDerivativesP4PN(
00854                   REAL8Vector *values,
00855                   REAL8Vector *dvalues,
00856                   void *funcParams
00857                   )
00858 {
00859    REAL8 r, s, p, q, u, u2, u3, u4, u5, p2, p3, p4, q2, Apot, DA, NA;
00860    REAL8  dA, onebyD, DonebyD, AbyD, Heff, HReal, etahH;
00861    REAL8 omega, v, eta, eta2, a4, z2, z30, z3, zeta2;
00862    REAL8 a5, c1;
00863    double dr, ds, dp, dq;
00864 
00865    InspiralDerivativesIn *ak;
00866 
00867    ak = (InspiralDerivativesIn *) funcParams;
00868    eta = ak->coeffs->eta;
00869    zeta2 = ak->coeffs->zeta2;
00870 
00871    r = values->data[0];
00872    s = values->data[1];
00873    p = values->data[2];
00874    q = values->data[3];
00875 
00876    p2 = p*p;
00877    p3 = p2*p;
00878    p4 = p2*p2;
00879    q2 = q*q;
00880    u = 1./r;
00881    u2 = u*u;
00882    u3 = u2 * u;
00883    u4 = u2 * u2;
00884    u5 = u*u4;
00885    z30 = 2.L * (4.L - 3.L * eta) * eta;
00886    z2 = 0.75L * z30 * zeta2,
00887    z3 = z30 * (1.L - zeta2);
00888    eta2 = eta*eta;
00889 
00890    a4 = ninty4by3etc * eta;
00891    a5 = 60.;
00892 
00893    NA = (32. - 24.*eta - 4.*a4 - a5*eta)*u + (a4 - 16. + 8.*eta);
00894    DA = a4 - 16. + 8.*eta - (2.*a4 + a5*eta + 8.*eta)*u - (4.*a4 + 2.*a5*eta + 16.*eta)*u2
00895         - (8.*a4 + 4.*a5*eta + 2.*a4*eta + 16.*eta2)*u3
00896         + (-a4*a4 - 8.*a5*eta - 8.*a4*eta + 2.*a5*eta2 - 16.*eta2)*u4;
00897    Apot = NA/DA; /* This A(u) assume zeta2=0 (the default value) */
00898 
00899    onebyD = 1. + 6.*eta*u2 + (2.*eta * ( 26. - 3.*eta ) - z2)* u3 + 36.*eta2*u4;
00900    AbyD = Apot * onebyD;
00901    Heff = pow (Apot*(1. + AbyD * p2 + q*q * u2 + z3 * p4 * u2), 0.5);
00902    HReal = pow (1. + 2.*eta*(Heff - 1.), 0.5) / eta;
00903    dA = -u2 * ( (32. - 24.*eta - 4.*a4 - a5*eta) * DA - NA *
00904           ( -(2.*a4 + a5*eta + 8.*eta) - 2.*(4.*a4 + 2.*a5*eta + 16.*eta)*u
00905           - 3.*(8.*a4 + 4.*a5*eta + 2.*a4*eta + 16.*eta2)*u2
00906           + 4.*(-a4*a4 - 8.*a5*eta - 8.*a4*eta + 2.*a5*eta2 - 16.*eta2)*u3))/(DA*DA);
00907 
00908    DonebyD = -12.*eta*u3 - (6.*eta*(26. - 3.*eta) - z2)*u4 - 144.*eta2*u5;
00909    etahH = eta*Heff*HReal;
00910 
00911    dr = dvalues->data[0] = Apot*(AbyD*p +  z30 * u2 *(2.* p3
00912               + zeta2*(-0.5*p3 + 0.75*p*q2*u2)))/etahH;
00913    ds = dvalues->data[1] = omega = Apot * q * u2 * (1. + 0.75*z30*zeta2*p2*u2)/ etahH;
00914    v = pow(omega,oneby3);
00915 
00916    dp = dvalues->data[2] = -0.5 * Apot * (dA*Heff*Heff/(Apot*Apot) - 2.*q2*u3
00917               + (dA * onebyD + Apot * DonebyD) * p2
00918               + z30 * u3 *(-2.* p4+zeta2*(0.5*p4 - 3.0*p2*q2*u2))) / etahH;
00919    c1 = 1.+(u2 - 2.*u3*Apot/dA) * q2;/*below:dpphi/dt = F_RR*/
00920    dq = dvalues->data[3] = - ak->flux(v,ak->coeffs)/(eta * omega);
00921    /*
00922    fprintf(stdout, "%e %e %e %e %e %e %e %e %e %e %e\n", r, s, p, q, Heff, v, Apot, dr, ds, dp, dq);
00923    */
00924 }
00925 
00926 
00927 /*-------------------------------------------------------------------*/
00928  void LALvrP4PN(REAL8 *vr, void *params )
00929 {
00930   REAL8 A, dA, d2A, NA, DA, dDA, dNA, d2DA;
00931   REAL8 u, u2, u3, u4, v, x1;
00932   REAL8 eta, eta2, a4, a5, FDIS;
00933 
00934   pr3In *pr3in;
00935   pr3in = (pr3In *)params;
00936 
00937   eta = pr3in->eta;
00938   u = 1./ pr3in->r;
00939 
00940   u2 = u*u;
00941   u3 = u2*u;
00942   u4 = u2*u2;
00943   eta2 = eta*eta;
00944 
00945 
00946   a4 = (ninty4by3etc - 2. * pr3in->omegaS) * eta;
00947   a5 = 60.;
00948   NA = (32. - 24.*eta - 4.*a4 - a5*eta)*u + (a4 - 16. + 8.*eta);
00949   DA = a4 - 16. + 8.*eta - (2.*a4 + a5*eta + 8.*eta)*u - (4.*a4 + 2.*a5*eta + 16.*eta)*u2
00950        - (8.*a4 + 4.*a5*eta + 2.*a4*eta + 16.*eta2)*u3
00951        + (-a4*a4 - 8.*a5*eta - 8.*a4*eta + 2.*a5*eta2 - 16.*eta2)*u4;
00952   A = NA/DA;
00953   dNA = (32. - 24.*eta - 4.*a4 - a5*eta);
00954   dDA = - (2.*a4 + a5*eta + 8.*eta) - 2.*(4.*a4 + 2.*a5*eta + 16.*eta)*u
00955        - 3.*(8.*a4 + 4.*a5*eta + 2.*a4*eta + 16.*eta2)*u2
00956        + 4.*(-a4*a4 - 8.*a5*eta - 8.*a4*eta + 2.*a5*eta2 - 16.*eta2)*u3;
00957   d2DA = - 2.*(4.*a4 + 2.*a5*eta + 16.*eta)
00958        - 6.*(8.*a4 + 4.*a5*eta + 2.*a4*eta + 16.*eta2)*u
00959        + 12.*(-a4*a4 - 8.*a5*eta - 8.*a4*eta + 2.*a5*eta2 - 16.*eta2)*u2;
00960 
00961   dA = (dNA * DA - NA * dDA)/ (DA*DA);
00962   d2A = (-NA * DA * d2DA - 2. * dNA * DA * dDA + 2. * NA * dDA * dDA)/pow(DA,3.);
00963   v = pow(pr3in->omega,oneby3);
00964   FDIS = -pr3in->in3copy.flux(v, pr3in->in3copy.coeffs)/(eta* pr3in->omega);
00965   x1 = -1./u2 * sqrt (-dA * pow(2.* u * A + u2 * dA, 3.) )
00966                 / (2.* u * dA * dA + A*dA - u * A * d2A);
00967   *vr = FDIS * x1;
00968 }
00969 
00970 
00971 /*-------------------------------------------------------------------*/
00972 
00973 /*  <lalVerbatim file="LALEOBWaveformCP"> */
00974 void 
00975 LALEOBWaveform (
00976    LALStatus        *status,
00977    REAL4Vector      *signal,
00978    InspiralTemplate *params
00979    ) 
00980 { /* </lalVerbatim> */
00981 
00982    UINT4 count;
00983    InspiralInit paramsInit;   
00984    INITSTATUS(status, "LALEOBWaveform", LALEOBWAVEFORMC);
00985    ATTATCHSTATUSPTR(status);
00986 
00987    ASSERT(signal,  status, 
00988         LALINSPIRALH_ENULL, LALINSPIRALH_MSGENULL);
00989    ASSERT(signal->data,  status, 
00990         LALINSPIRALH_ENULL, LALINSPIRALH_MSGENULL);
00991    ASSERT(params,  status, 
00992         LALINSPIRALH_ENULL, LALINSPIRALH_MSGENULL);
00993    ASSERT(params->nStartPad >= 0, status, 
00994         LALINSPIRALH_ESIZE, LALINSPIRALH_MSGESIZE);
00995    ASSERT(params->nEndPad >= 0, status, 
00996         LALINSPIRALH_ESIZE, LALINSPIRALH_MSGESIZE);
00997    ASSERT(params->fLower > 0, status, 
00998         LALINSPIRALH_ESIZE, LALINSPIRALH_MSGESIZE);
00999    ASSERT(params->tSampling > 0, status, 
01000         LALINSPIRALH_ESIZE, LALINSPIRALH_MSGESIZE);
01001    ASSERT(params->totalMass > 0., status, 
01002         LALINSPIRALH_ESIZE, LALINSPIRALH_MSGESIZE);
01003 
01004    LALInspiralSetup (status->statusPtr, &(paramsInit.ak), params);
01005    CHECKSTATUSPTR(status);
01006    LALInspiralChooseModel(status->statusPtr, &(paramsInit.func),
01007                                          &(paramsInit.ak), params);
01008    CHECKSTATUSPTR(status);
01009 
01010    memset(signal->data, 0, signal->length * sizeof( REAL4 ));
01011 
01012    /* Call the engine function */
01013    LALEOBWaveformEngine(status->statusPtr, signal, NULL, NULL, NULL, 
01014                         NULL, NULL, &count, params, &paramsInit);
01015    CHECKSTATUSPTR( status );
01016 
01017    DETATCHSTATUSPTR(status);
01018    RETURN(status);
01019 }
01020 
01021 
01022 NRCSID (LALEOBWAVEFORMTEMPLATESC,
01023 "$Id: LALEOBWaveform.c,v 1.55 2008/05/29 17:08:13 spxcar Exp $");
01024 
01025 /*  <lalVerbatim file="LALEOBWaveformTemplatesCP"> */
01026 
01027 void 
01028 LALEOBWaveformTemplates (
01029    LALStatus        *status,
01030    REAL4Vector      *signal1,
01031    REAL4Vector      *signal2,
01032    InspiralTemplate *params
01033    ) 
01034 { /* </lalVerbatim> */
01035 
01036    UINT4 count;
01037   
01038    InspiralInit paramsInit;
01039  
01040    INITSTATUS(status, "LALEOBWaveformTemplates", LALEOBWAVEFORMTEMPLATESC);
01041    ATTATCHSTATUSPTR(status);
01042    
01043    ASSERT(signal1,  status,
01044         LALINSPIRALH_ENULL, LALINSPIRALH_MSGENULL);
01045    ASSERT(signal2,  status,
01046         LALINSPIRALH_ENULL, LALINSPIRALH_MSGENULL);
01047    ASSERT(signal1->data,  status, 
01048         LALINSPIRALH_ENULL, LALINSPIRALH_MSGENULL);
01049    ASSERT(signal2->data,  status, 
01050         LALINSPIRALH_ENULL, LALINSPIRALH_MSGENULL);
01051    ASSERT(params,  status, LALINSPIRALH_ENULL, 
01052         LALINSPIRALH_MSGENULL);
01053    ASSERT(params->nStartPad >= 0, status, 
01054         LALINSPIRALH_ESIZE, LALINSPIRALH_MSGESIZE);
01055    ASSERT(params->nEndPad >= 0, status, 
01056         LALINSPIRALH_ESIZE, LALINSPIRALH_MSGESIZE);
01057    ASSERT(params->fLower > 0, status, 
01058         LALINSPIRALH_ESIZE, LALINSPIRALH_MSGESIZE);
01059    ASSERT(params->tSampling > 0, status,
01060         LALINSPIRALH_ESIZE, LALINSPIRALH_MSGESIZE);
01061    ASSERT(params->totalMass > 0., status, 
01062         LALINSPIRALH_ESIZE, LALINSPIRALH_MSGESIZE);
01063 
01064    LALInspiralSetup (status->statusPtr, &(paramsInit.ak), params);
01065    CHECKSTATUSPTR(status);
01066    LALInspiralChooseModel(status->statusPtr, &(paramsInit.func), 
01067                                         &(paramsInit.ak), params);
01068    CHECKSTATUSPTR(status);
01069    
01070    memset(signal1->data, 0, signal1->length * sizeof( REAL4 ));
01071    memset(signal2->data, 0, signal2->length * sizeof( REAL4 ));
01072 
01073    /* Call the engine function */
01074    LALEOBWaveformEngine(status->statusPtr, signal1, signal2, NULL, NULL, 
01075                            NULL, NULL, &count, params, &paramsInit);
01076    CHECKSTATUSPTR( status );
01077 
01078    DETATCHSTATUSPTR(status);
01079    RETURN(status);
01080 }
01081 
01082 
01083 /*=========================================================*/
01084 /*======INJECTION =========================================*/
01085 /*=========================================================*/
01086 
01087 /*  <lalVerbatim file="LALEOBWaveformForInjectionCP"> */
01088 void 
01089 LALEOBWaveformForInjection (
01090                             LALStatus        *status,
01091                             CoherentGW       *waveform,
01092                             InspiralTemplate *params,
01093                             PPNParamStruc    *ppnParams
01094                             ) 
01095 { 
01096   /* </lalVerbatim> */
01097   UINT4 count, i;
01098 
01099   REAL4Vector *a=NULL;/* pointers to generated amplitude  data */
01100   REAL4Vector *h=NULL;/* pointers to generated polarization data */
01101   REAL4Vector *ff=NULL ;/* pointers to generated  frequency data */
01102   REAL8Vector *phi=NULL;/* pointer to generated phase data */
01103 
01104   REAL8 s;
01105 
01106   REAL8 phiC;/* phase at coalescence */
01107   CHAR message[256];
01108   InspiralInit paramsInit;