00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
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
00235
00236
00237
00238 REAL8 eta,
00239 z,
00240 omega,
00241 jadiab,
00242 djadiabdr,
00243 H0cap,
00244 v,
00245 FDIS,
00246 A,
00247 r2,
00248 r3,
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
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
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
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
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
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
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
00752
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
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;
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;
00920 dq = dvalues->data[3] = - ak->flux(v,ak->coeffs)/(eta * omega);
00921
00922
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
00974 void
00975 LALEOBWaveform (
00976 LALStatus *status,
00977 REAL4Vector *signal,
00978 InspiralTemplate *params
00979 )
00980 {
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
01013 LALEOBWaveformEngine(status->statusPtr, signal, NULL, NULL, NULL,
01014 NULL, NULL, &count, params, ¶msInit);
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
01026
01027 void
01028 LALEOBWaveformTemplates (
01029 LALStatus *status,
01030 REAL4Vector *signal1,
01031 REAL4Vector *signal2,
01032 InspiralTemplate *params
01033 )
01034 {
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
01074 LALEOBWaveformEngine(status->statusPtr, signal1, signal2, NULL, NULL,
01075 NULL, NULL, &count, params, ¶msInit);
01076 CHECKSTATUSPTR( status );
01077
01078 DETATCHSTATUSPTR(status);
01079 RETURN(status);
01080 }
01081
01082
01083
01084
01085
01086
01087
01088 void
01089 LALEOBWaveformForInjection (
01090 LALStatus *status,
01091 CoherentGW *waveform,
01092 InspiralTemplate *params,
01093 PPNParamStruc *ppnParams
01094 )
01095 {
01096
01097 UINT4 count, i;
01098
01099 REAL4Vector *a=NULL;
01100 REAL4Vector *h=NULL;
01101 REAL4Vector *ff=NULL ;
01102 REAL8Vector *phi=NULL;
01103
01104 REAL8 s;
01105
01106 REAL8 phiC;
01107 CHAR message[256];
01108 InspiralInit paramsInit;