31 #ifndef _LALSIMIMRSPINEOBHCAPNUMERICALDERIVATIVE_C
32 #define _LALSIMIMRSPINEOBHCAPNUMERICALDERIVATIVE_C
35 #define UNUSED __attribute__ ((unused))
41 #include <gsl/gsl_deriv.h>
42 #include <lal/LALSimInspiral.h>
43 #include <lal/LALSimIMR.h>
102 static const REAL8 STEP_SIZE = 1.0e-4;
104 static const INT4 lMax = 8;
111 REAL8 tmpDValues[14];
118 UINT4 SpinAlignedEOBversion;
122 REAL8 rData[3], pData[3];
129 REAL8 mass1, mass2, eta;
130 REAL8 rrTerm2, pDotS1, pDotS2;
132 REAL8 s1Data[3], s2Data[3], s1DataNorm[3], s2DataNorm[3];
133 REAL8 sKerrData[3], sStarData[3];
138 REAL8 Lx, Ly, Lz, magL;
139 REAL8 Lhatx, Lhaty, Lhatz;
141 REAL8 dLhatx, dLhaty, dMagL;
145 REAL8 rCrossV_x, rCrossV_y, rCrossV_z, omega;
164 SpinAlignedEOBversion =
params.
params->seobCoeffs->SpinAlignedEOBversion;
177 memcpy( tmps1Data, values+6, 3*
sizeof(
REAL8) );
178 memcpy( tmps2Data, values+9, 3*
sizeof(
REAL8) );
179 tmps1Vec.
data = tmps1Data; tmps2Vec.
data = tmps2Data;
200 + tmpsigmaKerr->
data[1]*tmpsigmaKerr->
data[1]
201 + tmpsigmaKerr->
data[2]*tmpsigmaKerr->
data[2] );
215 for (
i = 0;
i < 12;
i++ )
218 if (
i >=6 &&
i < 9 )
221 STEP_SIZE*mass1*mass1, &tmpDValues[
i], &absErr ) );
226 STEP_SIZE*mass2*mass2, &tmpDValues[
i], &absErr ) );
231 STEP_SIZE, &tmpDValues[
i], &absErr ) );
233 if ( gslStatus != GSL_SUCCESS )
235 XLALPrintError(
"XLAL Error %s - Failure in GSL function\n", __func__ );
241 Lx = values[1]*values[5] - values[2]*values[4];
242 Ly = values[2]*values[3] - values[0]*values[5];
243 Lz = values[0]*values[4] - values[1]*values[3];
245 magL = sqrt( Lx*Lx + Ly*Ly + Lz*Lz );
253 polarDynamics.
data = polData;
255 r = polData[0] = sqrt( values[0]*values[0] + values[1]*values[1] + values[2]*values[2] );
257 polData[2] = values[0]*values[3] + values[1]*values[4] + values[2]*values[5];
258 polData[3] = magL / polData[0];
267 s1norm.
data = s1DataNorm;
268 s2norm.
data = s2DataNorm;
270 memcpy( s1Data, values+6, 3*
sizeof(
REAL8) );
271 memcpy( s2Data, values+9, 3*
sizeof(
REAL8) );
272 memcpy( s1DataNorm, values+6, 3*
sizeof(
REAL8) );
273 memcpy( s2DataNorm, values+9, 3*
sizeof(
REAL8) );
275 for (
i = 0;
i < 3;
i++ )
277 s1DataNorm[
i] /= (mass1+mass2)*(mass1+mass2);
278 s2DataNorm[
i] /= (mass1+mass2)*(mass1+mass2);
287 sKerr.
data = sKerrData;
291 sStar.
data = sStarData;
303 memcpy( rData, values,
sizeof(rData) );
304 memcpy( pData, values+3,
sizeof(pData) );
312 dvalues[0] = tmpDValues[3];
313 dvalues[1] = tmpDValues[4];
314 dvalues[2] = tmpDValues[5];
317 rCrossV_x = values[1]*dvalues[2] - values[2]*dvalues[1];
318 rCrossV_y = values[2]*dvalues[0] - values[0]*dvalues[2];
319 rCrossV_z = values[0]*dvalues[1] - values[1]*dvalues[0];
321 omega = sqrt( rCrossV_x*rCrossV_x + rCrossV_y*rCrossV_y + rCrossV_z*rCrossV_z ) / (
r*
r);
327 pDotS1 = pData[0]*s1Data[0] + pData[1]*s1Data[1] + pData[2]*s1Data[2];
328 pDotS2 = pData[0]*s2Data[0] + pData[1]*s2Data[1] + pData[2]*s2Data[2];
329 rrTerm2 = 8./15. *eta*eta * pow(omega,8./3.)/(magL*magL*
r) * ((61.+48.*mass2/mass1)*pDotS1 + (61.+48.*mass1/mass2)*pDotS2);
334 dvalues[3] = - tmpDValues[0] - flux * values[3] / (omega*magL) + rrTerm2*Lx;
335 dvalues[4] = - tmpDValues[1] - flux * values[4] / (omega*magL) + rrTerm2*Ly;
336 dvalues[5] = - tmpDValues[2] - flux * values[5] / (omega*magL) + rrTerm2*Lz;
341 dvalues[6] = mass1 * mass2 * (tmpDValues[7]*values[8] - tmpDValues[8]*values[7]);
342 dvalues[7] = mass1 * mass2 * (tmpDValues[8]*values[6] - tmpDValues[6]*values[8]);
343 dvalues[8] = mass1 * mass2 * (tmpDValues[6]*values[7] - tmpDValues[7]*values[6]);
346 dvalues[9] = mass1 * mass2 * (tmpDValues[10]*values[11] - tmpDValues[11]*values[10]);
347 dvalues[10] = mass1 * mass2 * (tmpDValues[11]*values[9] - tmpDValues[9]*values[11]);
348 dvalues[11] = mass1 * mass2 * (tmpDValues[9]*values[10] - tmpDValues[10]*values[9]);
351 dLx = dvalues[1]*values[5] - dvalues[2]*values[4]
352 + values[1]*dvalues[5] - values[2]*dvalues[4];
354 dLy = dvalues[2]*values[3] - dvalues[0]*values[5]
355 + values[2]*dvalues[3] - values[0]*dvalues[5];
357 dLz = dvalues[0]*values[4] - dvalues[1]*values[3]
358 + values[0]*dvalues[4] - values[1]*dvalues[3];
360 dMagL = (Lx*dLx + Ly*dLy + Lz*dLz)/magL;
362 dLhatx = (dLx*magL - Lx*dMagL)/(magL*magL);
363 dLhaty = (dLy*magL - Ly*dMagL)/(magL*magL);
366 if ( Lhatx == 0.0 && Lhaty == 0.0 )
372 alphadotcosi = Lhatz * (Lhatx*dLhaty - Lhaty*dLhatx) / (Lhatx*Lhatx + Lhaty*Lhaty);
375 dvalues[12] = omega - alphadotcosi;
376 dvalues[13] = alphadotcosi;
397 const REAL8 values[],
401 static const REAL8 STEP_SIZE = 1.0e-3;
421 params.varyParam = paramIdx;
427 if ( paramIdx >=6 && paramIdx < 9 )
429 XLAL_CALLGSL( gslStatus = gsl_deriv_central( &F, values[paramIdx],
430 STEP_SIZE*mass1*mass1, &result, &absErr ) );
432 else if ( paramIdx >= 9 )
434 XLAL_CALLGSL( gslStatus = gsl_deriv_central( &F, values[paramIdx],
435 STEP_SIZE*mass2*mass2, &result, &absErr ) );
439 XLAL_CALLGSL( gslStatus = gsl_deriv_central( &F, values[paramIdx],
440 STEP_SIZE, &result, &absErr ) );
442 if ( gslStatus != GSL_SUCCESS )
444 XLALPrintError(
"XLAL Error %s - Failure in GSL function\n", __func__ );
464 REAL8 s1normData[3], s2normData[3], sKerrData[3], sStarData[3];
474 REAL8 mT2 = (m1+m2)*(m1+m2);
477 memcpy( tmpVec, dParams->
values,
sizeof(tmpVec) );
487 spin1.
data = tmpVec+6;
488 spin2.
data = tmpVec+9;
489 spin1norm.
data = s1normData;
490 spin2norm.
data = s2normData;
491 sigmaKerr.
data = sKerrData;
492 sigmaStar.
data = sStarData;
494 memcpy( s1normData, tmpVec+6, 3*
sizeof(
REAL8) );
495 memcpy( s2normData, tmpVec+9, 3*
sizeof(
REAL8) );
497 for (
i = 0;
i < 3;
i++ )
499 s1normData[
i] /= mT2;
500 s2normData[
i] /= mT2;
505 eobParams->
m2, &spin1, &spin2 );
507 eobParams->
m2, &spin1, &spin2 );
508 a = sqrt( sigmaKerr.
data[0]*sigmaKerr.
data[0] + sigmaKerr.
data[1]*sigmaKerr.
data[1]
509 + sigmaKerr.
data[2]*sigmaKerr.
data[2] );
514 printf(
"a is nan!!\n");
static int XLALSimIMRSpinEOBCalculateSigmaKerr(REAL8Vector *sigmaKerr, REAL8 mass1, REAL8 mass2, REAL8Vector *s1, REAL8Vector *s2)
Function to calculate normalized spin of the deformed-Kerr background in SEOBNRv1.
static int XLALSimIMRSpinEOBCalculateSigmaStar(REAL8Vector *sigmaStar, REAL8 mass1, REAL8 mass2, REAL8Vector *s1, REAL8Vector *s2)
Function to calculate normalized spin of the test particle in SEOBNRv1.
static REAL8 XLALInspiralSpinFactorizedFlux(REAL8Vector *values, EOBNonQCCoeffs *nqcCoeffs, const REAL8 omega, SpinEOBParams *ak, const REAL8 H, const UINT4 lMax, const UINT4 SpinAlignedEOBversion)
static UNUSED int UsePrec
static int XLALSimIMRCalculateSpinEOBHCoeffs(SpinEOBHCoeffs *coeffs, const REAL8 eta, const REAL8 a, const UINT4 SpinAlignedEOBversion)
This function is used to calculate some coefficients which will be used in the spinning EOB Hamiltoni...
static REAL8 XLALSimIMRSpinEOBHamiltonian(const REAL8 eta, REAL8Vector *restrict x, REAL8Vector *restrict p, REAL8Vector *restrict s1Vec, REAL8Vector *restrict s2Vec, REAL8Vector *restrict sigmaKerr, REAL8Vector *restrict sigmaStar, int tortoise, SpinEOBHCoeffs *coeffs)
static REAL8 XLALSpinHcapNumDerivWRTParam(const INT4 paramIdx, const REAL8 values[], SpinEOBParams *params)
Calculate the derivative of the Hamiltonian w.r.t.
static int XLALSpinHcapNumericalDerivative(double t, const REAL8 values[], REAL8 dvalues[], void *funcParams) UNUSED
static double GSLSpinHamiltonianWrapper(double x, void *params)
Wrapper for GSL to call the Hamiltonian function.
#define XLAL_CALLGSL(statement)
REAL8Vector * XLALCreateREAL8Vector(UINT4 length)
void XLALDestroyREAL8Vector(REAL8Vector *vector)
#define XLAL_ERROR_REAL8(...)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
The coefficients which are used in calculating the non-quasicircular correction to the EOBNRv2 model.
Structure containing all the parameters needed for the EOB waveform.
Parameters for the spinning EOB model, used in calculating the Hamiltonian.
UINT4 SpinAlignedEOBversion
Parameters for the spinning EOB model.
SpinEOBHCoeffs * seobCoeffs