25 #ifndef _LALSIMIMRSPINPRECEOBHCAPEXACTDERIVATIVEPREC_V3OPT_C
26 #define _LALSIMIMRSPINPRECEOBHCAPEXACTDERIVATIVEPREC_V3OPT_C
29 #define UNUSED __attribute__ ((unused))
35 #include <gsl/gsl_deriv.h>
36 #include <lal/LALSimInspiral.h>
37 #include <lal/LALSimIMR.h>
92 static const INT4 lMax = 8;
98 REAL8 tmpDValues[14] = {0};
108 UINT4 SpinAlignedEOBversion;
112 REAL8 rData[3], pData[3];
119 REAL8 mass1, mass2, eta;
120 UNUSED
REAL8 rrTerm2, pDotS1, pDotS2;
122 REAL8 s1Data[3], s2Data[3], s1DataNorm[3], s2DataNorm[3];
123 REAL8 sKerrData[3], sStarData[3];
124 REAL8 chiS, chiA,
a, tplspin;
125 REAL8 s1dotLN, s2dotLN;
128 REAL8 Lx, Ly, Lz, magL;
129 REAL8 Lhatx, Lhaty, Lhatz;
131 REAL8 dLhatx, dLhaty, dMagL;
135 REAL8 rCrossV_x, rCrossV_y, rCrossV_z, omega;
140 REAL8 eobD_r, deltaU_u, deltaU_r;
144 REAL8 Tmatrix[3][3], invTmatrix[3][3], dTijdXk[3][3][3];
145 REAL8 tmpPdotT1[3], tmpPdotT2[3], tmpPdotT3[3];
156 SpinAlignedEOBversion =
params.
params->seobCoeffs->SpinAlignedEOBversion;
175 memcpy(rData, values,
sizeof(rData));
176 memcpy(pData, values + 3,
sizeof(pData));
190 s1norm.
data = s1DataNorm;
191 s2norm.
data = s2DataNorm;
193 memcpy(s1Data, values + 6, 3 *
sizeof(
REAL8));
194 memcpy(s2Data, values + 9, 3 *
sizeof(
REAL8));
195 memcpy(s1DataNorm, values + 6, 3 *
sizeof(
REAL8));
196 memcpy(s2DataNorm, values + 9, 3 *
sizeof(
REAL8));
198 const REAL8 mass1mass2inv = 1.0/(mass1*mass2);
199 const REAL8 mass1inv = mass1mass2inv*mass2;
200 const REAL8 mass2inv = mass1mass2inv*mass1;
201 const REAL8 totalMass = mass1 + mass2;
202 const REAL8 totalMassinv = 1.0/totalMass;
203 const REAL8 totalMass2 = totalMass*totalMass;
204 const REAL8 totalMass2inv = totalMassinv*totalMassinv;
206 for (
i = 0;
i < 3;
i++) {
207 s1.
data[
i] *= totalMass2;
208 s2.
data[
i] *= totalMass2;
212 sKerr.
data = sKerrData;
215 sStar.
data = sStarData;
217 for (
i = 0;
i < 3;
i++ )
220 sStar.
data[
i] = (mass2*mass1inv * s1.
data[
i] + mass1*mass2inv * s2.
data[
i])*totalMass2inv;
242 D = 1. + log(1. + 6. * eta *
u2 + 2. * (26. - 3. * eta) * eta *
u3);
244 eobD_r = (
u2 / (D * D)) * (12. * eta *
u + 6. * (26. - 3. * eta) * eta *
u2) / (1.
245 + 6. * eta *
u2 + 2. * (26. - 3. * eta) * eta *
u3);
248 const double logu = log(
u);
252 bulk = m1PlusetaKKinv*m1PlusetaKKinv + (2. *
u) * m1PlusetaKKinv +
a2 *
u2;
264 deltaU_u = 2. * (1.*m1PlusetaKKinv +
a2 *
u) *
logTerms +
bulk * (eta * (coeffs->
k1 +
u * (2. * coeffs->
k2 +
u * (3. * coeffs->
k3
265 +
u * (4. * coeffs->
k4 + 5. * (coeffs->
k5 + coeffs->
k5l *
logu) *
u)))))/(1. + coeffs->
k1 *
u + coeffs->
k2 *
u2 + coeffs->
k3 *
u3
267 deltaU_r = -
u2 * deltaU_u;
277 for (
i = 0;
i < 3;
i++) {
283 for (
i = 0;
i < 3;
i++)
291 for (
i = 0;
i < 3;
i++)
292 for (j = 0; j <=
i; j++) {
293 Tmatrix[
i][j] = Tmatrix[j][
i] = (rVec.
data[
i] * rVec.
data[j] *
u2) * (
csi - 1.);
294 invTmatrix[
i][j] = invTmatrix[j][
i] = -(
csi - 1) /
csi * (rVec.
data[
i] * rVec.
data[j] *
u2);
302 / (2. * rMag2 * rMag2 *
deltaU *
deltaU) * (rMag * (-4. *
w2) / D - eobD_r * (
w2 *
w2));
304 for (
i = 0;
i < 3;
i++)
305 for (j = 0; j < 3; j++)
306 for (k = 0; k < 3; k++) {
315 for (
i = 0;
i < 3;
i++)
318 for (
i = 0;
i < 3;
i++) {
320 for (j = 0; j < 3; j++)
322 dTijdXk[
i][j][1], dTijdXk[
i][j][2]);
328 memcpy(tmpValues,
params.values,
sizeof(tmpValues));
329 tmpValues[3] = tmpP[0];
330 tmpValues[4] = tmpP[1];
331 tmpValues[5] = tmpP[2];
336 params.
params->seobCoeffs->updateHCoeffs = updateHCoeffsOld;
340 for (
i = 0;
i < 3;
i++)
341 for (j = 0, dvalues[
i] = 0.; j < 3; j++)
342 dvalues[
i] += tmpDValues[j + 3] * Tmatrix[
i][j];
345 Lx = values[1] * values[5] - values[2] * values[4];
346 Ly = values[2] * values[3] - values[0] * values[5];
347 Lz = values[0] * values[4] - values[1] * values[3];
349 magL = sqrt(Lx * Lx + Ly * Ly + Lz * Lz);
357 polarDynamics.
data = polData;
359 r = polarDynamics.
data[0] = sqrt(values[0] * values[0] + values[1] * values[1]
360 + values[2] * values[2]);
361 polarDynamics.
data[1] = 0;
363 polarDynamics.
data[2] = (values[0] * values[3] + values[1] * values[4]
364 + values[2] * values[5]) / polData[0];
365 polarDynamics.
data[3] = magL;
369 rCrossV_x = values[1] * dvalues[2] - values[2] * dvalues[1];
370 rCrossV_y = values[2] * dvalues[0] - values[0] * dvalues[2];
371 rCrossV_z = values[0] * dvalues[1] - values[1] * dvalues[0];
373 omega = sqrt(rCrossV_x * rCrossV_x + rCrossV_y * rCrossV_y + rCrossV_z * rCrossV_z) / (
r *
r);
381 s1dotLN = (s1.
data[0] * rCrossV_x + s1.
data[1] * rCrossV_y + s1.
data[2] * rCrossV_z) /
382 (
r *
r * omega * mass1 * mass1);
383 s2dotLN = (s2.
data[0] * rCrossV_x + s2.
data[1] * rCrossV_y + s2.
data[2] * rCrossV_z) /
384 (
r *
r * omega * mass2 * mass2);
386 chiS = 0.5 * (s1dotLN + s2dotLN);
387 chiA = 0.5 * (s1dotLN - s2dotLN);
394 XLAL_PRINT_INFO(
"Computing derivatives for values\n%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%.12e\n\n",
395 (
double)values[0], (
double)values[1], (
double)values[2],
396 (
double)values[3], (
double)values[4], (
double)values[5],
397 (
double)values[6], (
double)values[7], (
double)values[8],
398 (
double)values[9], (
double)values[10], (
double)values[11]);
399 XLAL_PRINT_INFO(
"tmpDvalues\n%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t\n",
400 (
double)tmpDValues[0], (
double)tmpDValues[1], (
double)tmpDValues[2],
401 (
double)tmpDValues[3], (
double)tmpDValues[4], (
double)tmpDValues[5],
402 (
double)tmpDValues[6], (
double)tmpDValues[7], (
double)tmpDValues[8],
403 (
double)tmpDValues[9], (
double)tmpDValues[10], (
double)tmpDValues[11]);
410 tplspin = (1. - 2. * eta) * chiS + (mass1 - mass2) * totalMassinv * chiA;
422 H =
H * (mass1 + mass2);
425 memcpy(tmpValues, values, 12 *
sizeof(
REAL8));
426 cartDynamics.
data = tmpValues;
434 nqcCoeffs, omega,
params.
params,
H * totalMassinv, lMax, SpinAlignedEOBversion);
440 XLAL_PRINT_INFO(
"Wrong ignorflux option in XLALSpinPrecHcapExactDerivative!\n");
450 const double omega2=omega*omega;
451 const double omega4=omega2*omega2;
452 const double omega8=omega4*omega4;
453 const double omega8o3=cbrt(omega8);
454 rrTerm2 = 8. / 15. * eta * eta * omega8o3 / (magL * magL *
r) * ((61. + 48. * mass2 * mass1inv) * pDotS1 + (61. + 48. * mass1 * mass2inv) * pDotS2);
457 XLAL_PRINT_INFO(
"omega = %.12e \n flux = %.12e \n Lmag = %.12e\n", omega, flux, magL);
458 XLAL_PRINT_INFO(
"rrForce = %.12e %.12e %.12e\n", -flux * values[3] / (omega * magL), -flux * values[4] / (omega * magL), -flux * values[5] / (omega * magL));
462 for (
i = 0;
i < 3;
i++) {
463 for (j = 0, tmpPdotT1[
i] = 0.; j < 3; j++)
464 tmpPdotT1[
i] += -tmpDValues[j] * Tmatrix[
i][j];
466 tmpPdotT2[
i] = -flux * values[
i + 3] / (omega * magL);
470 REAL8 tmpPdotT3T11[3][3][3], tmpPdotT3T12[3][3], tmpPdotT3T2[3];
472 for (
i = 0;
i < 3;
i++)
473 for (j = 0; j < 3; j++)
474 for (
l = 0;
l < 3;
l++)
475 for (k = 0, tmpPdotT3T11[
i][j][
l] = 0.; k < 3; k++)
476 tmpPdotT3T11[
i][j][
l] += dTijdXk[
i][k][j] * invTmatrix[k][
l];
479 for (
i = 0;
i < 3;
i++)
480 for (j = 0; j < 1; j++)
481 for (
l = 0;
l < 3;
l++) {
483 for (k = 0; k < 3; k++)
484 sum += dTijdXk[
i][k][j] * invTmatrix[k][
l];
488 for (
l = 0;
l < 3;
l++) {
489 for (
i = 0;
i < 3;
i++)
490 for (j = 0; j < 3; j++) {
492 for (k = 0; k < 3; k++) {
493 sum += dTijdXk[
i][k][
l] * invTmatrix[k][j];
500 XLAL_PRINT_INFO(
"\npData: {%.12e, %.12e, %.12e}\n", pData[0], pData[1], pData[2]);
501 for (
i = 0;
i < 3;
i++)
502 for (j = 0; j < 3; j++)
503 for (k = 0, tmpPdotT3T12[
i][j] = 0.; k < 3; k++)
504 tmpPdotT3T12[
i][j] += tmpPdotT3T11[
i][j][k] * pData[k];
506 for (
i = 0;
i < 3;
i++)
507 for (j = 0, tmpPdotT3T2[
i] = 0.; j < 3; j++)
508 tmpPdotT3T2[
i] += tmpDValues[j + 3] * Tmatrix[
i][j];
510 for (
i = 0;
i < 3;
i++)
511 for (j = 0, tmpPdotT3[
i] = 0.; j < 3; j++)
512 tmpPdotT3[
i] += tmpPdotT3T12[
i][j] * tmpPdotT3T2[j];
515 for (
i = 0;
i < 3;
i++)
516 dvalues[
i + 3] = tmpPdotT1[
i] + tmpPdotT2[
i] + tmpPdotT3[
i];
520 for (
i = 0;
i < 3;
i++)
528 XLAL_PRINT_INFO(
"Raw spin1 derivatives = %.12e %.12e %.12e\n", tmpDValues[6], tmpDValues[7], tmpDValues[8]);
529 XLAL_PRINT_INFO(
"Raw spin2 derivatives = %.12e %.12e %.12e\n", tmpDValues[9], tmpDValues[10], tmpDValues[11]);
532 dvalues[6] = eta * (tmpDValues[7] * values[8] - tmpDValues[8] * values[7]);
533 dvalues[7] = eta * (tmpDValues[8] * values[6] - tmpDValues[6] * values[8]);
534 dvalues[8] = eta * (tmpDValues[6] * values[7] - tmpDValues[7] * values[6]);
538 dvalues[9] = eta * (tmpDValues[10] * values[11] - tmpDValues[11] * values[10]);
539 dvalues[10] = eta * (tmpDValues[11] * values[9] - tmpDValues[9] * values[11]);
540 dvalues[11] = eta * (tmpDValues[9] * values[10] - tmpDValues[10] * values[9]);
543 dLx = dvalues[1] * values[5] - dvalues[2] * values[4]
544 + values[1] * dvalues[5] - values[2] * dvalues[4];
546 dLy = dvalues[2] * values[3] - dvalues[0] * values[5]
547 + values[2] * dvalues[3] - values[0] * dvalues[5];
549 dLz = dvalues[0] * values[4] - dvalues[1] * values[3]
550 + values[0] * dvalues[4] - values[1] * dvalues[3];
552 dMagL = (Lx * dLx + Ly * dLy + Lz * dLz) / magL;
554 dLhatx = (dLx * magL - Lx * dMagL) / (magL * magL);
555 dLhaty = (dLy * magL - Ly * dMagL) / (magL * magL);
561 if (Lhatx == 0.0 && Lhaty == 0.0) {
564 alphadotcosi = Lhatz * (Lhatx * dLhaty - Lhaty * dLhatx) / (Lhatx * Lhatx + Lhaty * Lhaty);
567 dvalues[12] = omega - alphadotcosi;
568 dvalues[13] = alphadotcosi;
573 (
double)mass1, (
double)mass2, (
double)eta);
575 XLAL_PRINT_INFO(
"spin1 = {%12.12lf,%12.12lf,%12.12lf}, spin2 = {%12.12lf,%12.12lf,%12.12lf}\n",
576 (
double)s1.
data[0], (
double)s1.
data[1], (
double)s1.
data[2],
577 (
double)s2.
data[0], (
double)s2.
data[1], (
double)s2.
data[2]);
578 XLAL_PRINT_INFO(
"sigmaStar = {%12.12lf,%12.12lf,%12.12lf}, sigmaKerr = {%12.12lf,%12.12lf,%12.12lf}\n",
579 (
double)sStar.
data[0], (
double)sStar.
data[1],
580 (
double)sStar.
data[2], (
double)sKerr.
data[0],
581 (
double)sKerr.
data[1], (
double)sKerr.
data[2]);
583 (
double)Lx, (
double)Ly, (
double)Lz, (
double)magL);
584 XLAL_PRINT_INFO(
"dLdt = {%12.12lf,%12.12lf,%12.12lf}, d|L|dt = %12.12lf\n",
585 (
double)dLx, (
double)dLy, (
double)dLz, (
double)dMagL);
586 XLAL_PRINT_INFO(
"Polar coordinates = {%12.12lf, %12.12lf, %12.12lf, %12.12lf}\n",
587 (
double)polData[0], (
double)polData[1], (
double)polData[2],
590 XLAL_PRINT_INFO(
"Cartesian coordinates: {%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf}\n",
591 (
double)values[0], (
double)values[1], (
double)values[2],
592 (
double)values[3], (
double)values[4], (
double)values[5],
593 (
double)values[6], (
double)values[7], (
double)values[8],
594 (
double)values[9], (
double)values[10], (
double)values[11],
595 (
double)values[12], (
double)values[13]);
596 XLAL_PRINT_INFO(
"Cartesian derivatives: {%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf,%12.12lf}\n",
597 (
double)dvalues[0], (
double)dvalues[1], (
double)dvalues[2],
598 (
double)dvalues[3], (
double)dvalues[4], (
double)dvalues[5],
599 (
double)dvalues[6], (
double)dvalues[7], (
double)dvalues[8],
600 (
double)dvalues[9], (
double)dvalues[10], (
double)dvalues[11],
601 (
double)dvalues[12], (
double)dvalues[13]);
603 XLAL_PRINT_INFO(
"Hamiltonian = %12.12lf, Flux = %12.12lf, Omega = %12.12lf\n",
604 H/ (mass1 + mass2), eta*flux, omega);
610 if(dvalues[
i] > 1e3){
613 for(j=0; j<14;
XLAL_PRINT_INFO(
"dvalues[%d] = %3.12f\n", j, dvalues[j]), j++);
#define KRONECKER_DELTA(i, j)
static REAL8 XLALInspiralPrecSpinFactorizedFlux_exact(REAL8Vector *polvalues, REAL8Vector *values, EOBNonQCCoeffs *nqcCoeffs, const REAL8 omega, SpinEOBParams *ak, const REAL8 H, const INT4 lMax, const UINT4 SpinAlignedEOBversion)
This function calculates the spin factorized-resummed GW energy flux for given dynamical variables.
static int XLALSpinPrecHcapExactDerivative(double UNUSED t, const REAL8 values[], REAL8 dvalues[], void *funcParams)
Function to calculate numerical derivatives of the spin EOB Hamiltonian, which correspond to time der...
static INT4 XLALSEOBNRv3_opt_ComputeHamiltonianDerivatives(const REAL8 *valuestort1, const REAL8 *valuestort2, SpinEOBHCoeffs *coeffs, REAL8 *derivs, SpinEOBParams *params, REAL8 *HReal)
static REAL8 sum(REAL8 *arr1, REAL8 *arr2, int k)
#define XLAL_PRINT_INFO(...)
The coefficients which are used in calculating the non-quasicircular correction to the EOBNRv2 model.
Parameters for the spinning EOB model, used in calculating the Hamiltonian.
Parameters for the spinning EOB model.