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 #include "LALInspiral.h"
00098
00099 static void LALInspiralTaylorF2Phasing0PN (REAL8 v, REAL8 *phase, expnCoeffs *ak);
00100 static void LALInspiralTaylorF2Phasing2PN (REAL8 v, REAL8 *phase, expnCoeffs *ak);
00101 static void LALInspiralTaylorF2Phasing3PN (REAL8 v, REAL8 *phase, expnCoeffs *ak);
00102 static void LALInspiralTaylorF2Phasing4PN (REAL8 v, REAL8 *phase, expnCoeffs *ak);
00103 static void LALInspiralTaylorF2Phasing5PN (REAL8 v, REAL8 *phase, expnCoeffs *ak);
00104 static void LALInspiralTaylorF2Phasing6PN (REAL8 v, REAL8 *phase, expnCoeffs *ak);
00105 static void LALInspiralTaylorF2Phasing7PN (REAL8 v, REAL8 *phase, expnCoeffs *ak);
00106
00107 NRCSID (LALINSPIRALSTATIONARYPHASEAPPROX2C, "$Id: LALInspiralStationaryPhaseApprox2.c,v 1.13 2007/08/20 11:51:40 thomas Exp $");
00108
00109
00110 void
00111 LALInspiralStationaryPhaseApprox2 (
00112 LALStatus *status,
00113 REAL4Vector *signal,
00114 InspiralTemplate *params
00115 )
00116 {
00117 REAL8 Oneby3, h1, h2, pimmc, f, v, df, shft, phi, amp0, amp, psif, psi;
00118 INT4 n, nby2, i, f0, fn;
00119 expnCoeffs ak;
00120 expnFunc func;
00121 void (*LALInspiralTaylorF2Phasing)(REAL8, REAL8 *, expnCoeffs *) = NULL;
00122
00123 INITSTATUS (status, "LALInspiralStationaryPhaseApprox2", LALINSPIRALSTATIONARYPHASEAPPROX2C);
00124 ATTATCHSTATUSPTR(status);
00125 ASSERT (signal, status, LALINSPIRALH_ENULL, LALINSPIRALH_MSGENULL);
00126 ASSERT (signal->data, status, LALINSPIRALH_ENULL, LALINSPIRALH_MSGENULL);
00127 ASSERT (params, status, LALINSPIRALH_ENULL, LALINSPIRALH_MSGENULL);
00128 ASSERT (signal->length>2, status, LALINSPIRALH_ECHOICE, LALINSPIRALH_MSGECHOICE);
00129
00130 switch (params->order)
00131 {
00132 case newtonian:
00133 case oneHalfPN:
00134 LALInspiralTaylorF2Phasing = LALInspiralTaylorF2Phasing0PN;
00135 break;
00136 case onePN:
00137 LALInspiralTaylorF2Phasing = LALInspiralTaylorF2Phasing2PN;
00138 break;
00139 case onePointFivePN:
00140 LALInspiralTaylorF2Phasing = LALInspiralTaylorF2Phasing3PN;
00141 break;
00142 case twoPN:
00143 LALInspiralTaylorF2Phasing = LALInspiralTaylorF2Phasing4PN;
00144 break;
00145 case twoPointFivePN:
00146 LALInspiralTaylorF2Phasing = LALInspiralTaylorF2Phasing5PN;
00147 break;
00148 case threePN:
00149 LALInspiralTaylorF2Phasing = LALInspiralTaylorF2Phasing6PN;
00150 break;
00151 case threePointFivePN:
00152 LALInspiralTaylorF2Phasing = LALInspiralTaylorF2Phasing7PN;
00153 break;
00154 }
00155 n = signal->length;
00156 nby2 = n/2;
00157 memset( &ak, 0, sizeof( ak ) );
00158 LALInspiralSetup(status->statusPtr, &ak, params);
00159 CHECKSTATUSPTR(status);
00160 LALInspiralChooseModel(status->statusPtr, &func, &ak, params);
00161 CHECKSTATUSPTR(status);
00162
00163 Oneby3 = 1.L/3.L;
00164 df = params->tSampling/signal->length;
00165 pimmc = LAL_PI * params->totalMass * LAL_MTSUN_SI;
00166 f0 = params->fLower;
00167 fn = (params->fCutoff < ak.fn) ? params->fCutoff : ak.fn;
00168 v = pow(pimmc*f0, Oneby3);
00169
00170
00171
00172
00173
00174
00175
00176 shft = 2.L*LAL_PI * (ak.tn + params->nStartPad/params->tSampling + params->startTime);
00177 phi = params->startPhase + LAL_PI/4.L;
00178 amp0 = params->signalAmplitude * ak.totalmass * pow(LAL_PI/12.L, 0.5L) * df;
00179
00180
00181
00182 h1 = signal->data[0] = 0.L;
00183 h2 = signal->data[nby2] = 0.L;
00184 for (i=1; i<nby2; i++) {
00185 f = i * df;
00186 if (f < f0 || f > fn)
00187 {
00188
00189
00190
00191 signal->data[i] = 0.;
00192 signal->data[n-i] = 0.;
00193 }
00194 else
00195 {
00196 v = pow(pimmc * f, Oneby3);
00197 LALInspiralTaylorF2Phasing(v, &psif, &ak);
00198 psi = shft * f + phi + psif;
00199
00200
00201
00202
00203
00204
00205
00206
00207 amp = amp0 * pow(-func.dEnergy(v,&ak)/func.flux(v,&ak),0.5L) * v;
00208 signal->data[i] = (REAL4) (amp * cos(psi));
00209 signal->data[n-i] = (REAL4) (-amp * sin(psi));
00210
00211 }
00212
00213
00214
00215
00216
00217
00218 }
00219 params->fFinal = fn;
00220 DETATCHSTATUSPTR(status);
00221 RETURN(status);
00222 }
00223
00224
00225 static void LALInspiralTaylorF2Phasing0PN (REAL8 v, REAL8 *phase, expnCoeffs *ak) {
00226
00227
00228 REAL8 x;
00229 x = v*v;
00230 *phase = ak->pfaN/pow(v,5.);
00231 }
00232
00233
00234 static void LALInspiralTaylorF2Phasing2PN (REAL8 v, REAL8 *phase, expnCoeffs *ak) {
00235
00236 REAL8 x;
00237 x = v*v;
00238 *phase = ak->pfaN * (1. + ak->pfa2 * x)/pow(v,5.);
00239 }
00240
00241
00242 static void LALInspiralTaylorF2Phasing3PN (REAL8 v, REAL8 *phase, expnCoeffs *ak) {
00243
00244 REAL8 x;
00245 x = v*v;
00246 *phase = ak->pfaN * (1. + ak->pfa2 * x + ak->pfa3 * v*x)/pow(v,5.);
00247 }
00248
00249
00250 static void LALInspiralTaylorF2Phasing4PN (REAL8 v, REAL8 *phase, expnCoeffs *ak) {
00251
00252 REAL8 x;
00253 x = v*v;
00254 *phase = ak->pfaN * (1. + ak->pfa2 * x + ak->pfa3 * v*x + ak->pfa4 * x*x)/pow(v,5.);
00255 }
00256
00257
00258 static void LALInspiralTaylorF2Phasing5PN (REAL8 v, REAL8 *phase, expnCoeffs *ak) {
00259
00260 REAL8 x, y;
00261 x = v*v;
00262 y = x*x;
00263 *phase = ak->pfaN * (1. + ak->pfa2 * x + ak->pfa3 * v*x + ak->pfa4 * y
00264 + (ak->pfa5 + ak->pfl5 * log(v/ak->v0)) * y*v)/pow(v,5.);
00265 }
00266
00267
00268 static void LALInspiralTaylorF2Phasing6PN (REAL8 v, REAL8 *phase, expnCoeffs *ak) {
00269
00270 REAL8 x, y, z;
00271 x = v*v;
00272 y = x*x;
00273 z = y*x;
00274
00275 *phase = ak->pfaN * (1. + ak->pfa2 * x + ak->pfa3 * v*x + ak->pfa4 * y
00276 + (ak->pfa5 + ak->pfl5 * log(v/ak->v0)) * y*v
00277 + (ak->pfa6 + ak->pfl6 * log(4.*v) ) * z)
00278 /pow(v,5.);
00279 }
00280
00281
00282 static void LALInspiralTaylorF2Phasing7PN (REAL8 v, REAL8 *phase, expnCoeffs *ak) {
00283
00284 REAL8 x, y, z;
00285 x = v*v;
00286 y = x*x;
00287 z = y*x;
00288
00289 *phase = ak->pfaN * (1. + ak->pfa2 * x + ak->pfa3 * v*x + ak->pfa4 * y
00290 + (ak->pfa5 + ak->pfl5 * log(v/ak->v0)) * y*v
00291 + (ak->pfa6 + ak->pfl6 * log(4.*v) ) * z
00292 + ak->pfa7 * z*v)
00293 /pow(v,5.);
00294 }