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 #include <lal/LALInspiral.h>
00074 #include <lal/LALStdlib.h>
00075 #include <lal/Units.h>
00076 #include <lal/SeqFactories.h>
00077
00078
00079
00080 static void LALInspiralPolarisationAngle( REAL8 *psi, REAL8 psiOld, REAL8 *NCap, REAL8 *L);
00081
00082 static void LALInspiralBeamFactors(REAL8 *Fplus, REAL8 *Fcross, REAL8 Fp0, REAL8 Fp1, REAL8 Fc0, REAL8 Fc1, REAL8 psi);
00083
00084 static void LALInspiralPolarisationPhase(REAL8 *phi, REAL8 phiOld, REAL8 NCapDotLByL, REAL8 Fplus, REAL8 Fcross);
00085
00086 static void LALInspiralModulatedAmplitude(REAL8 *amp, REAL8 v, REAL8 amp0, REAL8 NCapDotLByL, REAL8 Fplus, REAL8 Fcross);
00087
00088 void LALACSTDerivatives (REAL8Vector *values, REAL8Vector *dvalues, void *funcParams);
00089
00090
00091
00092
00093
00094
00095
00096 NRCSID (LALINSPIRALSPINNINGBHBINARYC, "$Id: LALInspiralSpinningBHBinary.c,v 1.12 2007/06/08 14:41:49 bema Exp $");
00097
00098
00099
00100 void
00101 LALInspiralSpinModulatedWave(
00102 LALStatus *status,
00103 REAL4Vector *signal,
00104 InspiralTemplate *in
00105 )
00106 {
00107
00108
00109 UINT4 nDEDim=9;
00110 UINT4 j, count;
00111
00112 REAL8 psi, psiOld, Fplus, Fcross, Fp0, Fp1, Fc0, Fc1, magL, amp, amp0, phi, phiOld, Phi;
00113 REAL8 v, t, tMax, dt, f, fOld, fn, phase, phi0, MCube, Theta, etaBy5M, NCapDotL, NCapDotLByL;
00114
00115 InspiralACSTParams acstPars;
00116 REAL8Vector dummy, values, dvalues, newvalues, yt, dym, dyt;
00117 void *funcParams;
00118 rk4In rk4in;
00119 rk4GSLIntegrator *integrator;
00120 expnFunc func;
00121 expnCoeffs ak;
00122
00123
00124 INITSTATUS(status, "LALInspiralSpinngBHBinary", LALINSPIRALSPINNINGBHBINARYC);
00125 ATTATCHSTATUSPTR(status);
00126 ASSERT(signal, status, LALINSPIRALH_ENULL, LALINSPIRALH_MSGENULL);
00127 ASSERT(signal->data, status, LALINSPIRALH_ENULL, LALINSPIRALH_MSGENULL);
00128 ASSERT(in, status, LALINSPIRALH_ENULL, LALINSPIRALH_MSGENULL);
00129
00130 LALInspiralSetup (status->statusPtr, &ak, in);
00131 CHECKSTATUSPTR(status);
00132 LALInspiralChooseModel(status->statusPtr, &func, &ak, in);
00133 CHECKSTATUSPTR(status);
00134
00135
00136
00137 dummy.length = nDEDim * 6;
00138 values.length = dvalues.length = newvalues.length = yt.length = dym.length = dyt.length = nDEDim;
00139
00140 if (!(dummy.data = (REAL8 *) LALMalloc(sizeof(REAL8) * dummy.length)))
00141 {
00142 ABORT(status, LALINSPIRALH_EMEM, LALINSPIRALH_MSGEMEM);
00143 }
00144
00145
00146 values.data = &dummy.data[0];
00147 dvalues.data = &dummy.data[nDEDim];
00148 newvalues.data = &dummy.data[2*nDEDim];
00149 yt.data = &dummy.data[3*nDEDim];
00150 dym.data = &dummy.data[4*nDEDim];
00151 dyt.data = &dummy.data[5*nDEDim];
00152
00153 v = pow(LAL_PI * in->totalMass * LAL_MTSUN_SI * in->fLower, 1.L/3.L);
00154 MCube = pow(LAL_MTSUN_SI * in->totalMass, 3.L);
00155
00156
00157 acstPars.magS1 = in->spin1[0]*in->spin1[0] + in->spin1[1]*in->spin1[1] + in->spin1[2]*in->spin1[2];
00158 acstPars.magS2 = in->spin2[0]*in->spin2[0] + in->spin2[1]*in->spin2[1] + in->spin2[2]*in->spin2[2];
00159
00160 acstPars.NCap[0] = sin(in->sourceTheta)*cos(in->sourcePhi);
00161 acstPars.NCap[1] = sin(in->sourceTheta)*sin(in->sourcePhi);
00162 acstPars.NCap[2] = cos(in->sourceTheta);
00163
00164 acstPars.M = LAL_MTSUN_SI * in->totalMass;
00165
00166 acstPars.fourM1Plus = (4.L*in->mass1 + 3.L*in->mass2)/(2.*in->mass1*MCube);
00167 acstPars.fourM2Plus = (4.L*in->mass2 + 3.L*in->mass1)/(2.*in->mass2*MCube);
00168 acstPars.oneBy2Mcube = 0.5L/MCube;
00169 acstPars.threeBy2Mcube = 1.5L/MCube;
00170 acstPars.thirtytwoBy5etc = (32.L/5.L) * pow(in->eta,2.) * acstPars.M;
00171
00172
00173 amp0 = 2.L*in->eta * acstPars.M/in->distance;
00174
00175 magL = in->eta * (acstPars.M * acstPars.M)/v;
00176
00177
00178 values.data[0] = magL * sin(in->orbitTheta0) * cos(in->orbitPhi0);
00179 values.data[1] = magL * sin(in->orbitTheta0) * sin(in->orbitPhi0);
00180 values.data[2] = magL * cos(in->orbitTheta0);
00181
00182 values.data[3] = in->spin1[0];
00183 values.data[4] = in->spin1[1];
00184 values.data[5] = in->spin1[2];
00185
00186 values.data[6] = in->spin2[0];
00187 values.data[7] = in->spin2[1];
00188 values.data[8] = in->spin2[2];
00189
00190 rk4in.function = LALACSTDerivatives;
00191 rk4in.y = &values;
00192 rk4in.h = 1.L/in->tSampling;
00193 rk4in.n = nDEDim;
00194 rk4in.yt = &yt;
00195 rk4in.dym = &dym;
00196 rk4in.dyt = &dyt;
00197
00198 xlalErrno = 0;
00199
00200 if (!(integrator = XLALRungeKutta4Init(nDEDim, &rk4in)))
00201 {
00202 INT4 errNum = XLALClearErrno();
00203 LALFree(dummy.data);
00204
00205 if (errNum = XLAL_ENOMEM)
00206 ABORT(status, LALINSPIRALH_EMEM, LALINSPIRALH_MSGEMEM);
00207 else
00208 ABORTXLAL( status );
00209 }
00210
00211
00212 count = 0;
00213 while ((INT4)count < in->nStartPad)
00214 {
00215 signal->data[count] = 0.L;
00216 count++;
00217 }
00218
00219
00220 t = 0.L;
00221 dt = 1.L/in->tSampling;
00222 etaBy5M = in->eta/(5.L*acstPars.M);
00223 Theta = etaBy5M * (in->tC - t);
00224 tMax = in->tC - dt;
00225 fn = (ak.flso > in->fCutoff) ? ak.flso : in->fCutoff;
00226
00227 func.phasing3(status->statusPtr, &Phi, Theta, &ak);
00228 CHECKSTATUSPTR(status);
00229 func.frequency3(status->statusPtr, &f, Theta, &ak);
00230 CHECKSTATUSPTR(status);
00231
00232
00233 Fp0 = (1.L + cos(in->sourceTheta)*cos(in->sourceTheta)) * cos(2.L*in->sourcePhi);
00234 Fp1 = cos(in->sourceTheta) * sin(2.L*in->sourcePhi);
00235 Fc0 = Fp0;
00236 Fc1 = -Fp1;
00237
00238 psiOld = 0.L;
00239 phiOld = 0.L;
00240 magL = sqrt(values.data[0]*values.data[0] + values.data[1]*values.data[1] + values.data[2]*values.data[2]);
00241 NCapDotL = acstPars.NCap[0]*values.data[0] + acstPars.NCap[1]*values.data[1] + acstPars.NCap[2]*values.data[2];
00242 NCapDotLByL = NCapDotL/magL;
00243
00244
00245
00246 LALInspiralPolarisationAngle(&psi, psiOld, &acstPars.NCap[0], &values.data[0]);
00247
00248 LALInspiralBeamFactors(&Fplus, &Fcross, Fp0, Fp1, Fc0, Fc1, psi);
00249
00250 LALInspiralPolarisationPhase(&phi, phiOld, NCapDotLByL, Fplus, Fcross);
00251
00252 LALInspiralModulatedAmplitude(&, v, amp0, NCapDotLByL, Fplus, Fcross);
00253
00254 phase = Phi + phi;
00255 phi0 = -phase + in->startPhase;
00256
00257 fOld = f - 0.1;
00258 while (f < fn && t < tMax && f>fOld)
00259 {
00260 ASSERT((INT4)count < (INT4)signal->length, status, LALINSPIRALH_ESIZE, LALINSPIRALH_MSGESIZE);
00261
00262 signal->data[count] = amp*cos(phase+phi0);
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272 fOld = f;
00273 psiOld = psi;
00274 phiOld = phi;
00275
00276 count++;
00277 t = (count-in->nStartPad) * dt;
00278
00279
00280 acstPars.v = v;
00281
00282 funcParams = (void *) &acstPars;
00283
00284 LALACSTDerivatives(&values, &dvalues, funcParams);
00285
00286 rk4in.dydx = &dvalues;
00287 rk4in.x = t;
00288
00289 Theta = etaBy5M * (in->tC - t);
00290 func.phasing3(status->statusPtr, &Phi, Theta, &ak);
00291 CHECKSTATUSPTR(status);
00292
00293 func.frequency3(status->statusPtr, &f, Theta, &ak);
00294 CHECKSTATUSPTR(status);
00295 v = pow(LAL_PI * in->totalMass * LAL_MTSUN_SI * f, 1.L/3.L);
00296
00297 LALRungeKutta4(status->statusPtr, &newvalues, integrator, funcParams);
00298 CHECKSTATUSPTR(status);
00299
00300
00301 for (j=0; j<nDEDim; j++) values.data[j] = newvalues.data[j];
00302
00303
00304 magL = sqrt(values.data[0]*values.data[0] + values.data[1]*values.data[1] + values.data[2]*values.data[2]);
00305 NCapDotL = acstPars.NCap[0]*values.data[0]+acstPars.NCap[1]*values.data[1]+acstPars.NCap[2]*values.data[2];
00306 NCapDotLByL = NCapDotL/magL;
00307
00308
00309 LALInspiralPolarisationAngle(&psi, psiOld, &acstPars.NCap[0], &values.data[0]);
00310 LALInspiralBeamFactors(&Fplus, &Fcross, Fp0, Fp1, Fc0, Fc1, psi);
00311 LALInspiralPolarisationPhase(&phi, phiOld, NCapDotLByL, Fplus, Fcross);
00312 LALInspiralModulatedAmplitude(&, v, amp0, NCapDotLByL, Fplus, Fcross);
00313
00314
00315 phase = Phi + phi;
00316 }
00317 while (count < signal->length)
00318 {
00319 signal->data[count] = 0.L;
00320 count++;
00321 }
00322 XLALRungeKutta4Free( integrator );
00323 LALFree(dummy.data);
00324 DETATCHSTATUSPTR(status);
00325 RETURN(status);
00326
00327 }
00328
00329
00330 static void
00331 LALInspiralPolarisationAngle(
00332 REAL8 *psi,
00333 REAL8 psiOld,
00334 REAL8 *NCap,
00335 REAL8 *L)
00336 {
00337 REAL8 NCapDotL, NCapDotZ, LCapDotZ, NCapDotLCrossZ;
00338
00339
00340 NCapDotL = NCap[0]*L[0] + NCap[1]*L[1] + NCap[2]*L[2];
00341 NCapDotZ = NCap[2];
00342 LCapDotZ = L[2];
00343 NCapDotLCrossZ = NCap[0]*L[1] - NCap[1]*L[0];
00344 if (NCapDotLCrossZ)
00345 *psi = atan((LCapDotZ - NCapDotL*NCapDotZ)/NCapDotLCrossZ);
00346 else
00347 *psi = LAL_PI_2;
00348
00349
00350 if (psiOld) while (fabs(*psi-psiOld)>LAL_PI_2) *psi = (psiOld > *psi) ? *psi+LAL_PI : *psi-LAL_PI;
00351 }
00352
00353 static void
00354 LALInspiralBeamFactors(
00355 REAL8 *Fplus,
00356 REAL8 *Fcross,
00357 REAL8 Fp0,
00358 REAL8 Fp1,
00359 REAL8 Fc0,
00360 REAL8 Fc1,
00361 REAL8 psi)
00362 {
00363
00364
00365 REAL8 cosTwoPsi, sinTwoPsi;
00366
00367
00368 cosTwoPsi = cos(2.L*psi);
00369 sinTwoPsi = sin(2.L*psi);
00370
00371 *Fplus = Fp0 * cosTwoPsi + Fp1 * sinTwoPsi;
00372 *Fcross = Fc0 * sinTwoPsi + Fc1 * cosTwoPsi;
00373 }
00374
00375 static void
00376 LALInspiralPolarisationPhase(
00377 REAL8 *phi,
00378 REAL8 phiOld,
00379 REAL8 NCapDotLByL,
00380 REAL8 Fplus,
00381 REAL8 Fcross
00382 )
00383 {
00384
00385 *phi=atan(2.L*NCapDotLByL*Fcross/((1.L + NCapDotLByL*NCapDotLByL)*Fplus));
00386
00387
00388 if (phiOld) while (fabs(*phi-phiOld)>LAL_PI_2) *phi = (phiOld>*phi) ? *phi+LAL_PI : *phi-LAL_PI;
00389 }
00390
00391 static void
00392 LALInspiralModulatedAmplitude(
00393 REAL8 *amp,
00394 REAL8 v,
00395 REAL8 amp0,
00396 REAL8 NCapDotL,
00397 REAL8 Fplus,
00398 REAL8 Fcross
00399 )
00400 {
00401 REAL8 NCapDotLSq;
00402
00403 NCapDotLSq = NCapDotL * NCapDotL;
00404 *amp = amp0 * v*v * sqrt ( pow(1.L+NCapDotLSq,2.L) * Fplus*Fplus + 4.L*NCapDotLSq*Fcross*Fcross);
00405 }
00406
00407
00408 void
00409 LALACSTDerivatives
00410 (
00411 REAL8Vector *values,
00412 REAL8Vector *dvalues,
00413 void *funcParams
00414 )
00415 {
00416
00417
00418
00419
00420
00421
00422 enum { Dim=3 };
00423 UINT4 i, j, k, p, q;
00424
00425 REAL8 v, M, magS1, magS2, magL, S1DotL, S2DotL;
00426 REAL8 fourM1Plus, fourM2Plus, oneBy2Mcube, Lsq, dL0, c2, v6;
00427 REAL8 L[Dim], S1[Dim], S2[Dim], S1CrossL[Dim], S2CrossL[Dim], S1CrossS2[Dim];
00428 InspiralACSTParams *ACSTIn;
00429
00430
00431 ACSTIn = (InspiralACSTParams *) funcParams;
00432
00433 v = ACSTIn->v;
00434 M = ACSTIn->M;
00435 magS1 = ACSTIn->magS1;
00436 magS2 = ACSTIn->magS2;
00437 fourM1Plus = ACSTIn->fourM1Plus;
00438 fourM2Plus = ACSTIn->fourM2Plus;
00439 oneBy2Mcube = ACSTIn->oneBy2Mcube;
00440 magL = sqrt(values->data[0]*values->data[0] + values->data[1]*values->data[1] + values->data[2]*values->data[2]);
00441
00442
00443 for (i=0; i<Dim; i++)
00444 {
00445 L[i]=values->data[i];
00446 S1[i]=values->data[i+Dim];
00447 S2[i]=values->data[i+2*Dim];
00448 }
00449
00450 S1DotL = S2DotL = 0.L;
00451 for (i=0; i<Dim; i++)
00452 {
00453 j = (i+1) % Dim;
00454 k = (i+2) % Dim;
00455 S1DotL += S1[i] * L[i];
00456 S2DotL += S2[i] * L[i];
00457 S1CrossL[i] = S1[j] * L[k] - S1[k] * L[j];
00458 S2CrossL[i] = S2[j] * L[k] - S2[k] * L[j];
00459 S1CrossS2[i] = S1[j] * S2[k] - S1[k] * S2[j];
00460 }
00461
00462
00463 Lsq = magL*magL;
00464 dL0 = ACSTIn->thirtytwoBy5etc/magL;
00465 c2 = ACSTIn->threeBy2Mcube/Lsq;
00466 v6 = pow(v,6.L);
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477 for(i=0;i<Dim;i++)
00478 {
00479 p = i+Dim;
00480 q = i+2*Dim;
00481
00482 dvalues->data[i] = ((fourM1Plus - c2 * S2DotL) * S1CrossL[i]
00483 + (fourM2Plus - c2 * S1DotL) * S2CrossL[i] - dL0 * L[i]*v) * v6;;
00484
00485 dvalues->data[p] = ((c2 * S2DotL - fourM1Plus) * S1CrossL[i] - oneBy2Mcube * S1CrossS2[i]) * v6;
00486
00487 dvalues->data[q] = ((c2 * S1DotL - fourM2Plus) * S2CrossL[i] + oneBy2Mcube * S1CrossS2[i]) * v6;
00488 }
00489
00490 }
00491
00492
00493
00494
00495
00496
00497
00498
00499 void
00500 LALInspiralSpinModulatedWaveForInjection(
00501 LALStatus *status,
00502 CoherentGW *waveform,
00503 InspiralTemplate *params,
00504 PPNParamStruc *ppnParams
00505 )
00506 {
00507
00508
00509 UINT4 nDEDim=9;
00510 UINT4 i,j, count, length = 0;
00511
00512 REAL8 omega,psi, psiOld, Fplus, Fcross, Fp0, Fp1, Fc0, Fc1, magL, amp, amp0, phi, phiOld, Phi;
00513 REAL8 v, t, tMax, dt, f, fOld, fn, phase, phi0, MCube, Theta, etaBy5M, NCapDotL, NCapDotLByL;
00514
00515 InspiralACSTParams acstPars;
00516 REAL8Vector dummy, values, dvalues, newvalues, yt, dym, dyt;
00517 void *funcParams;
00518 rk4In rk4in;
00519 rk4GSLIntegrator *integrator;
00520 expnFunc func;
00521 expnCoeffs ak;
00522 REAL4Vector *a=NULL;
00523 REAL4Vector *ff=NULL ;
00524 REAL8Vector *phiv=NULL;
00525 REAL8 unitHz,f2a, mu, mTot, cosI, etab, fFac, f2aFac, apFac, acFac, phiC;
00526 CreateVectorSequenceIn in;
00527
00528 mTot = params->mass1 + params->mass2;
00529 etab = params->mass1 * params->mass2;
00530 etab /= mTot;
00531 etab /= mTot;
00532 unitHz = (mTot) *LAL_MTSUN_SI*(REAL8)LAL_PI;
00533 cosI = cos( params->inclination );
00534 mu = etab * mTot;
00535 fFac = 1.0 / ( 4.0*LAL_TWOPI*LAL_MTSUN_SI*mTot );
00536 dt = -1. * etab / ( params->tSampling * 5.0*LAL_MTSUN_SI*mTot );
00537 f2aFac = LAL_PI*LAL_MTSUN_SI*mTot*fFac;
00538 apFac = acFac = -2.0 * mu * LAL_MRSUN_SI/params->distance;
00539 apFac *= 1.0 + cosI*cosI;
00540 acFac *= 2.0*cosI;
00541
00542
00543 INITSTATUS(status, "LALInspiralSpinngBHBinaryForInjection", LALINSPIRALSPINNINGBHBINARYC);
00544 ATTATCHSTATUSPTR(status);
00545 ASSERT(params, status, LALINSPIRALH_ENULL, LALINSPIRALH_MSGENULL);
00546
00547 ASSERT( !( waveform->a ), status, LALINSPIRALH_ENULL,
00548 LALINSPIRALH_MSGENULL );
00549 ASSERT( !( waveform->f ), status, LALINSPIRALH_ENULL,
00550 LALINSPIRALH_MSGENULL );
00551 ASSERT( !( waveform->phi ), status, LALINSPIRALH_ENULL,
00552 LALINSPIRALH_MSGENULL );
00553 ASSERT( !( waveform->shift ), status, LALINSPIRALH_ENULL,
00554 LALINSPIRALH_MSGENULL );
00555
00556
00557 LALInspiralSetup (status->statusPtr, &ak, params);
00558 CHECKSTATUSPTR(status);
00559 LALInspiralChooseModel(status->statusPtr, &func, &ak, params);
00560 CHECKSTATUSPTR(status);
00561 LALInspiralWaveLength(status->statusPtr, &length, *params);
00562 CHECKSTATUSPTR(status);
00563 LALInspiralParameterCalc(status->statusPtr, params);
00564 CHECKSTATUSPTR(status);
00565
00566
00567 LALSCreateVector(status->statusPtr, &ff, length);
00568 CHECKSTATUSPTR(status);
00569
00570 LALSCreateVector(status->statusPtr, &a, 2*length);
00571 CHECKSTATUSPTR(status);
00572
00573 LALDCreateVector(status->statusPtr, &phiv, length);
00574 CHECKSTATUSPTR(status);
00575
00576
00577
00578
00579 dummy.length = nDEDim * 6;
00580 values.length = dvalues.length = newvalues.length = yt.length = dym.length = dyt.length = nDEDim;
00581
00582 if (!(dummy.data = (REAL8 *) LALMalloc(sizeof(REAL8) * dummy.length)))
00583 {
00584 ABORT(status, LALINSPIRALH_EMEM, LALINSPIRALH_MSGEMEM);
00585 }
00586
00587
00588 values.data = &dummy.data[0];
00589 dvalues.data = &dummy.data[nDEDim];
00590 newvalues.data = &dummy.data[2*nDEDim];
00591 yt.data = &dummy.data[3*nDEDim];
00592 dym.data = &dummy.data[4*nDEDim];
00593 dyt.data = &dummy.data[5*nDEDim];
00594
00595 v = pow(LAL_PI * params->totalMass * LAL_MTSUN_SI * params->fLower, 1.L/3.L);
00596 MCube = pow(LAL_MTSUN_SI * params->totalMass, 3.L);
00597
00598
00599 acstPars.magS1 = params->spin1[0]*params->spin1[0] + params->spin1[1]*params->spin1[1] + params->spin1[2]*params->spin1[2];
00600 acstPars.magS2 = params->spin2[0]*params->spin2[0] + params->spin2[1]*params->spin2[1] + params->spin2[2]*params->spin2[2];
00601
00602 acstPars.NCap[0] = sin(params->sourceTheta)*cos(params->sourcePhi);
00603 acstPars.NCap[1] = sin(params->sourceTheta)*sin(params->sourcePhi);
00604 acstPars.NCap[2] = cos(params->sourceTheta);
00605
00606 acstPars.M = LAL_MTSUN_SI * params->totalMass;
00607
00608 acstPars.fourM1Plus = (4.L*params->mass1 + 3.L*params->mass2)/(2.*params->mass1*MCube);
00609 acstPars.fourM2Plus = (4.L*params->mass2 + 3.L*params->mass1)/(2.*params->mass2*MCube);
00610 acstPars.oneBy2Mcube = 0.5L/MCube;
00611 acstPars.threeBy2Mcube = 1.5L/MCube;
00612 acstPars.thirtytwoBy5etc = (32.L/5.L) * pow(params->eta,2.) * acstPars.M;
00613
00614
00615 amp0 = 2.L*params->eta * acstPars.M/params->distance;
00616
00617 magL = params->eta * (acstPars.M * acstPars.M)/v;
00618
00619
00620 values.data[0] = magL * sin(params->orbitTheta0) * cos(params->orbitPhi0);
00621 values.data[1] = magL * sin(params->orbitTheta0) * sin(params->orbitPhi0);
00622 values.data[2] = magL * cos(params->orbitTheta0);
00623
00624 values.data[3] = params->spin1[0];
00625 values.data[4] = params->spin1[1];
00626 values.data[5] = params->spin1[2];
00627
00628 values.data[6] = params->spin2[0];
00629 values.data[7] = params->spin2[1];
00630 values.data[8] = params->spin2[2];
00631
00632 rk4in.function = LALACSTDerivatives;
00633 rk4in.y = &values;
00634 rk4in.h = 1.L/params->tSampling;
00635 rk4in.n = nDEDim;
00636 rk4in.yt = &yt;
00637 rk4in.dym = &dym;
00638 rk4in.dyt = &dyt;
00639
00640 xlalErrno = 0;
00641
00642 if (!(integrator = XLALRungeKutta4Init(nDEDim, &rk4in)))
00643 {
00644 INT4 errNum = XLALClearErrno();
00645 LALFree(dummy.data);
00646
00647 if (errNum = XLAL_ENOMEM)
00648 ABORT(status, LALINSPIRALH_EMEM, LALINSPIRALH_MSGEMEM);
00649 else
00650 ABORTXLAL( status );
00651 }
00652
00653
00654 count = 0;
00655
00656
00657
00658 t = 0.L;
00659 dt = 1.L/params->tSampling;
00660 etaBy5M = params->eta/(5.L*acstPars.M);
00661 Theta = etaBy5M * (params->tC - t);
00662 tMax = params->tC - dt;
00663 fn = (ak.flso > params->fCutoff) ? ak.flso : params->fCutoff;
00664
00665 func.phasing3(status->statusPtr, &Phi, Theta, &ak);
00666 CHECKSTATUSPTR(status);
00667 func.frequency3(status->statusPtr, &f, Theta, &ak);
00668 CHECKSTATUSPTR(status);
00669
00670
00671 Fp0 = (1.L + cos(params->sourceTheta)*cos(params->sourceTheta)) * cos(2.L*params->sourcePhi);
00672 Fp1 = cos(params->sourceTheta) * sin(2.L*params->sourcePhi);
00673 Fc0 = Fp0;
00674 Fc1 = -Fp1;
00675
00676 psiOld = 0.L;
00677 phiOld = 0.L;
00678 magL = sqrt(values.data[0]*values.data[0] + values.data[1]*values.data[1] + values.data[2]*values.data[2]);
00679 NCapDotL = acstPars.NCap[0]*values.data[0] + acstPars.NCap[1]*values.data[1] + acstPars.NCap[2]*values.data[2];
00680 NCapDotLByL = NCapDotL/magL;
00681
00682
00683
00684 LALInspiralPolarisationAngle(&psi, psiOld, &acstPars.NCap[0], &values.data[0]);
00685
00686 LALInspiralBeamFactors(&Fplus, &Fcross, Fp0, Fp1, Fc0, Fc1, psi);
00687
00688 LALInspiralPolarisationPhase(&phi, phiOld, NCapDotLByL, Fplus, Fcross);
00689
00690 LALInspiralModulatedAmplitude(&, v, amp0, NCapDotLByL, Fplus, Fcross);
00691
00692
00693 phase = Phi + phi;
00694 phi0 = -phase + params->startPhase;
00695
00696 fOld = f - 0.1;
00697 while (f < fn && t < tMax && f>fOld)
00698 {
00699
00700
00701
00702
00703
00704 omega = v*v*v;
00705 ff->data[count]= (REAL4)(omega/unitHz);
00706 f2a = pow (f2aFac * omega, 2./3.);
00707 a->data[2*count] = (REAL4)(4.*apFac * f2a);
00708 a->data[2*count+1] = (REAL4)(4.*acFac * f2a);
00709 phiv->data[count] = (REAL8)(phase);
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721 fOld = f;
00722 psiOld = psi;
00723 phiOld = phi;
00724
00725 count++;
00726 t = (count-params->nStartPad) * dt;
00727
00728
00729 acstPars.v = v;
00730
00731 funcParams = (void *) &acstPars;
00732
00733 LALACSTDerivatives(&values, &dvalues, funcParams);
00734
00735 rk4in.dydx = &dvalues;
00736 rk4in.x = t;
00737
00738 Theta = etaBy5M * (params->tC - t);
00739 func.phasing3(status->statusPtr, &Phi, Theta, &ak);
00740 CHECKSTATUSPTR(status);
00741
00742 func.frequency3(status->statusPtr, &f, Theta, &ak);
00743 CHECKSTATUSPTR(status);
00744 v = pow(LAL_PI * params->totalMass * LAL_MTSUN_SI * f, 1.L/3.L);
00745
00746 LALRungeKutta4(status->statusPtr, &newvalues, integrator, funcParams);
00747 CHECKSTATUSPTR(status);
00748
00749
00750 for (j=0; j<nDEDim; j++) values.data[j] = newvalues.data[j];
00751
00752
00753 magL = sqrt(values.data[0]*values.data[0] + values.data[1]*values.data[1] + values.data[2]*values.data[2]);
00754 NCapDotL = acstPars.NCap[0]*values.data[0]+acstPars.NCap[1]*values.data[1]+acstPars.NCap[2]*values.data[2];
00755 NCapDotLByL = NCapDotL/magL;
00756
00757
00758 LALInspiralPolarisationAngle(&psi, psiOld, &acstPars.NCap[0], &values.data[0]);
00759 LALInspiralBeamFactors(&Fplus, &Fcross, Fp0, Fp1, Fc0, Fc1, psi);
00760 LALInspiralPolarisationPhase(&phi, phiOld, NCapDotLByL, Fplus, Fcross);
00761 LALInspiralModulatedAmplitude(&, v, amp0, NCapDotLByL, Fplus, Fcross);
00762
00763
00764 phase = Phi + phi;
00765 }
00766
00767
00768