25 #ifndef _LALSIMIMRSPINPRECEOBHCAPNUMERICALDERIVATIVE_C
26 #define _LALSIMIMRSPINPRECEOBHCAPNUMERICALDERIVATIVE_C
29 #define UNUSED __attribute__ ((unused))
37 #include <gsl/gsl_deriv.h>
38 #include <lal/LALSimInspiral.h>
39 #include <lal/LALSimIMR.h>
103 static const INT4 lMax = 8;
110 REAL8 tmpDValues[14];
118 UINT4 SpinAlignedEOBversion;
121 UINT4 SpinAlignedEOBversionForWaveformCoefficients;
126 REAL8 rData [3], pData[3];
133 REAL8 mass1 , mass2, eta;
134 UNUSED
REAL8 rrTerm2, pDotS1, pDotS2;
136 REAL8 s1Data [3], s2Data[3], s1DataNorm[3], s2DataNorm[3];
137 REAL8 sKerrData[3], sStarData[3];
138 REAL8 chiS, chiA,
a, tplspin;
139 REAL8 s1dotLN, s2dotLN;
143 REAL8 Lx , Ly, Lz, magL;
144 REAL8 Lhatx , Lhaty, Lhatz;
145 REAL8 dLx , dLy, dLz;
146 REAL8 dLhatx , dLhaty, dMagL;
150 REAL8 rCrossV_x, rCrossV_y, rCrossV_z, omega;
158 REAL8 eobD_r, deltaU_u, deltaU_r;
162 REAL8 Tmatrix [3][3], invTmatrix[3][3], dTijdXk[3][3][3];
163 REAL8 tmpPdotT1[3], tmpPdotT2[3], tmpPdotT3[3];
180 UNUSED
REAL8 m_total = mass1 + mass2;
184 SpinAlignedEOBversion =
params.
params->seobCoeffs->SpinAlignedEOBversion;
187 if(SpinAlignedEOBversion==4){
208 memcpy(rData, values,
sizeof(rData));
209 memcpy(pData, values + 3,
sizeof(pData));
224 s1norm.
data = s1DataNorm;
225 s2norm.
data = s2DataNorm;
227 memcpy(s1Data, values + 6, 3 *
sizeof(
REAL8));
228 memcpy(s2Data, values + 9, 3 *
sizeof(
REAL8));
229 memcpy(s1DataNorm, values + 6, 3 *
sizeof(
REAL8));
230 memcpy(s2DataNorm, values + 9, 3 *
sizeof(
REAL8));
231 for (
i = 0;
i < 3;
i++) {
232 s1.
data[
i] *= (mass1 + mass2) * (mass1 + mass2);
233 s2.
data[
i] *= (mass1 + mass2) * (mass1 + mass2);
236 sKerr.
data = sKerrData;
240 sStar.
data = sStarData;
250 + pVec.
data[2] * (rVec.
data[2] / rMag);
261 D = 1. + log(1. + 6. * eta *
u2 + 2. * (26. - 3. * eta) * eta *
u3);
263 eobD_r = (
u2 / (D * D)) * (12. * eta *
u + 6. * (26. - 3. * eta) * eta *
u2) / (1.
264 + 6. * eta *
u2 + 2. * (26. - 3. * eta) * eta *
u3);
271 logTerms = 1. + eta * coeffs->
k0 + eta * log(1. + coeffs->
k1 *
u
273 + coeffs->
k5 *
u5 + coeffs->
k5l *
u5 * log(
u));
281 bulk * (eta * (coeffs->
k1 +
u * (2. * coeffs->
k2 +
u * (3. * coeffs->
k3
282 +
u * (4. * coeffs->
k4 + 5. * (coeffs->
k5 + coeffs->
k5l * log(
u)) *
u)))))
283 / (1. + coeffs->
k1 *
u + coeffs->
k2 *
u2 + coeffs->
k3 *
u3
284 + coeffs->
k4 *
u4 + (coeffs->
k5 + coeffs->
k5l * log(
u)) *
u5);
285 deltaU_r = -
u2 * deltaU_u;
295 for (
i = 0;
i < 3;
i++) {
301 for (
i = 0;
i < 3;
i++)
309 for (
i = 0;
i < 3;
i++)
310 for (j = 0; j <=
i; j++) {
311 Tmatrix[
i][j] = Tmatrix[j][
i] = (rVec.
data[
i] * rVec.
data[j] / rMag2)
314 invTmatrix[
i][j] = invTmatrix[j][
i] =
325 / (2. * rMag2 * rMag2 *
deltaU *
deltaU) * (rMag * (-4. *
w2) / D - eobD_r * (
w2 *
w2));
327 for (
i = 0;
i < 3;
i++)
328 for (j = 0; j < 3; j++)
329 for (k = 0; k < 3; k++) {
333 + rVec.
data[
i] * rVec.
data[j] * rVec.
data[k] / rMag2 / rMag * (-2. / rMag * (
csi - 1.) + dcsi);
339 for (
i = 0;
i < 3;
i++)
342 for (
i = 0;
i < 3;
i++) {
344 for (j = 0; j < 3; j++)
346 dTijdXk[
i][j][1], dTijdXk[
i][j][2]);
352 for (
i = 0;
i < 3;
i++) {
356 memcpy(tmpValues,
params.values,
sizeof(tmpValues));
357 tmpValues[3] = tmpP[0];
358 tmpValues[4] = tmpP[1];
359 tmpValues[5] = tmpP[2];
360 params.values = tmpValues;
365 STEP_SIZE, &tmpDValues[
i], &absErr));
368 if (gslStatus != GSL_SUCCESS) {
369 XLALPrintError(
"XLAL Error %s - Failure in GSL function\n", __func__);
373 for (
i = 3;
i < 6;
i++) {
377 STEP_SIZE, &tmpDValues[
i], &absErr));
378 if (gslStatus != GSL_SUCCESS) {
379 XLALPrintError(
"XLAL Error %s - Failure in GSL function\n", __func__);
383 for (
i = 6;
i < 9;
i++) {
387 STEP_SIZE * mass1 * mass1, &tmpDValues[
i], &absErr));
388 if (gslStatus != GSL_SUCCESS) {
389 XLALPrintError(
"XLAL Error %s - Failure in GSL function\n", __func__);
393 for (
i = 9;
i < 12;
i++) {
397 STEP_SIZE * mass2 * mass2, &tmpDValues[
i], &absErr));
398 if (gslStatus != GSL_SUCCESS) {
399 XLALPrintError(
"XLAL Error %s - Failure in GSL function\n", __func__);
403 params.
params->seobCoeffs->updateHCoeffs = updateHCoeffsOld;
408 for (
i = 0;
i < 3;
i++)
409 for (j = 0, dvalues[
i] = 0.; j < 3; j++)
410 dvalues[
i] += tmpDValues[j + 3] * Tmatrix[
i][j];
413 Lx = values[1] * values[5] - values[2] * values[4];
414 Ly = values[2] * values[3] - values[0] * values[5];
415 Lz = values[0] * values[4] - values[1] * values[3];
417 magL = sqrt(Lx * Lx + Ly * Ly + Lz * Lz);
425 polarDynamics.
data = polData;
427 r = polarDynamics.
data[0] = sqrt(values[0] * values[0] + values[1] * values[1]
428 + values[2] * values[2]);
429 polarDynamics.
data[1] = 0;
431 polarDynamics.
data[2] = (values[0] * values[3] + values[1] * values[4]
432 + values[2] * values[5]) / polData[0];
433 polarDynamics.
data[3] = magL;
437 rCrossV_x = values[1] * dvalues[2] - values[2] * dvalues[1];
438 rCrossV_y = values[2] * dvalues[0] - values[0] * dvalues[2];
439 rCrossV_z = values[0] * dvalues[1] - values[1] * dvalues[0];
441 omega = sqrt(rCrossV_x * rCrossV_x + rCrossV_y * rCrossV_y + rCrossV_z * rCrossV_z) / (
r *
r);
449 if (SpinAlignedEOBversion == 4)
451 s1dotLN = (s1.
data[0] * Lhatx + s1.
data[1] * Lhaty + s1.
data[2] * Lhatz) /
453 s2dotLN = (s2.
data[0] * Lhatx + s2.
data[1] * Lhaty + s2.
data[2] * Lhatz) /
458 s1dotLN = (s1.
data[0] * rCrossV_x + s1.
data[1] * rCrossV_y + s1.
data[2] * rCrossV_z) /
459 (
r *
r * omega * mass1 * mass1);
460 s2dotLN = (s2.
data[0] * rCrossV_x + s2.
data[1] * rCrossV_y + s2.
data[2] * rCrossV_z) /
461 (
r *
r * omega * mass2 * mass2);
464 chiS = 0.5 * (s1dotLN + s2dotLN);
465 chiA = 0.5 * (s1dotLN - s2dotLN);
466 REAL8 Lhat[3] = {Lhatx, Lhaty, Lhatz};
469 REAL8 S1_perp[3] = {0, 0, 0};
470 REAL8 S2_perp[3] = {0, 0, 0};
471 for (
UINT4 jj = 0; jj < 3; jj++)
473 S1_perp[jj] = s1.
data[jj] - tempS1_p * Lhat[jj];
474 S2_perp[jj] = s2.
data[jj] - tempS2_p * Lhat[jj];
478 if (sKerr_norm > 1
e-6){
479 S_con = sKerr.
data[0] * Lhat[0] + sKerr.
data[1] * Lhat[1] + sKerr.
data[2] * Lhat[2];
480 S_con /= (1 - 2 * eta);
489 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",
490 (
double)values[0], (
double)values[1], (
double)values[2],
491 (
double)values[3], (
double)values[4], (
double)values[5],
492 (
double)values[6], (
double)values[7], (
double)values[8],
493 (
double)values[9], (
double)values[10], (
double)values[11]);
494 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",
495 (
double)tmpDValues[0], (
double)tmpDValues[1], (
double)tmpDValues[2],
496 (
double)tmpDValues[3], (
double)tmpDValues[4], (
double)tmpDValues[5],
497 (
double)tmpDValues[6], (
double)tmpDValues[7], (
double)tmpDValues[8],
498 (
double)tmpDValues[9], (
double)tmpDValues[10], (
double)tmpDValues[11]);
504 switch (SpinAlignedEOBversion) {
513 tplspin = (1. - 2. * eta) * chiS + (mass1 - mass2) / (mass1 + mass2) * chiA;
516 XLALPrintError(
"XLAL Error - %s: Unknown SEOBNR version!\nAt present only v1 and v2 are available.\n", __func__);
531 params.
params->eobParams->hCoeffs, mass1, mass2, eta, tplspin,
532 chiS, chiA, SpinAlignedEOBversion);
537 if ( SpinAlignedEOBversion == 2 ) SpinAlignedEOBversionForWaveformCoefficients = 3;
538 else SpinAlignedEOBversionForWaveformCoefficients = SpinAlignedEOBversion;
541 params.
params->eobParams->hCoeffs, mass1, mass2, eta, tplspin,
542 chiS, chiA, SpinAlignedEOBversionForWaveformCoefficients);
544 if (SpinAlignedEOBversion == 4)
547 SpinAlignedEOBversion);
552 SpinAlignedEOBversion);
558 H =
H * (mass1 + mass2);
561 memcpy(tmpValues, values, 12 *
sizeof(
REAL8));
562 cartDynamics.
data = tmpValues;
570 nqcCoeffs, omega,
params.
params,
H / (mass1 + mass2), lMax, SpinAlignedEOBversion);
576 XLAL_PRINT_INFO(
"Wrong ignorflux option in XLALSpinPrecHcapNumericalDerivative!\n");
587 rrTerm2 = 8. / 15. * eta * eta * pow(omega, 8. / 3.) / (magL * magL *
r) * ((61. + 48. * mass2 / mass1) * pDotS1 + (61. + 48. * mass1 / mass2) * pDotS2);
590 XLAL_PRINT_INFO(
"omega = %.12e \n flux = %.12e \n Lmag = %.12e\n", omega, flux, magL);
591 XLAL_PRINT_INFO(
"rrForce = %.12e %.12e %.12e\n", -flux * values[3] / (omega * magL), -flux * values[4] / (omega * magL), -flux * values[5] / (omega * magL));
595 for (
i = 0;
i < 3;
i++) {
596 for (j = 0, tmpPdotT1[
i] = 0.; j < 3; j++)
597 tmpPdotT1[
i] += -tmpDValues[j] * Tmatrix[
i][j];
599 tmpPdotT2[
i] = -flux * values[
i + 3] / (omega * magL);
603 REAL8 tmpPdotT3T11[3][3][3], tmpPdotT3T12[3][3], tmpPdotT3T2[3];
605 for (
i = 0;
i < 3;
i++)
606 for (j = 0; j < 3; j++)
607 for (
l = 0;
l < 3;
l++)
608 for (k = 0, tmpPdotT3T11[
i][j][
l] = 0.; k < 3; k++)
609 tmpPdotT3T11[
i][j][
l] += dTijdXk[
i][k][j] * invTmatrix[k][
l];
612 for (
i = 0;
i < 3;
i++)
613 for (j = 0; j < 1; j++)
614 for (
l = 0;
l < 3;
l++) {
616 for (k = 0; k < 3; k++)
617 sum += dTijdXk[
i][k][j] * invTmatrix[k][
l];
622 for (
l = 0;
l < 3;
l++) {
623 for (
i = 0;
i < 3;
i++)
624 for (j = 0; j < 3; j++) {
626 for (k = 0; k < 3; k++) {
627 sum += dTijdXk[
i][k][
l] * invTmatrix[k][j];
634 XLAL_PRINT_INFO(
"\npData: {%.12e, %.12e, %.12e}\n", pData[0], pData[1], pData[2]);
635 for (
i = 0;
i < 3;
i++)
636 for (j = 0; j < 3; j++)
637 for (k = 0, tmpPdotT3T12[
i][j] = 0.; k < 3; k++)
638 tmpPdotT3T12[
i][j] += tmpPdotT3T11[
i][j][k] * pData[k];
640 for (
i = 0;
i < 3;
i++)
641 for (j = 0, tmpPdotT3T2[
i] = 0.; j < 3; j++)
642 tmpPdotT3T2[
i] += tmpDValues[j + 3] * Tmatrix[
i][j];
644 for (
i = 0;
i < 3;
i++)
645 for (j = 0, tmpPdotT3[
i] = 0.; j < 3; j++)
646 tmpPdotT3[
i] += tmpPdotT3T12[
i][j] * tmpPdotT3T2[j];
649 for (
i = 0;
i < 3;
i++)
650 dvalues[
i + 3] = tmpPdotT1[
i] + tmpPdotT2[
i] + tmpPdotT3[
i];
654 for (
i = 0;
i < 3;
i++)
662 XLAL_PRINT_INFO(
"Raw spin1 derivatives = %.12e %.12e %.12e\n", tmpDValues[6], tmpDValues[7], tmpDValues[8]);
663 XLAL_PRINT_INFO(
"Raw spin2 derivatives = %.12e %.12e %.12e\n", tmpDValues[9], tmpDValues[10], tmpDValues[11]);
666 dvalues[6] = eta * (tmpDValues[7] * values[8] - tmpDValues[8] * values[7]);
667 dvalues[7] = eta * (tmpDValues[8] * values[6] - tmpDValues[6] * values[8]);
668 dvalues[8] = eta * (tmpDValues[6] * values[7] - tmpDValues[7] * values[6]);
672 dvalues[9] = eta * (tmpDValues[10] * values[11] - tmpDValues[11] * values[10]);
673 dvalues[10] = eta * (tmpDValues[11] * values[9] - tmpDValues[9] * values[11]);
674 dvalues[11] = eta * (tmpDValues[9] * values[10] - tmpDValues[10] * values[9]);
677 dLx = dvalues[1] * values[5] - dvalues[2] * values[4]
678 + values[1] * dvalues[5] - values[2] * dvalues[4];
680 dLy = dvalues[2] * values[3] - dvalues[0] * values[5]
681 + values[2] * dvalues[3] - values[0] * dvalues[5];
683 dLz = dvalues[0] * values[4] - dvalues[1] * values[3]
684 + values[0] * dvalues[4] - values[1] * dvalues[3];
686 dMagL = (Lx * dLx + Ly * dLy + Lz * dLz) / magL;
688 dLhatx = (dLx * magL - Lx * dMagL) / (magL * magL);
689 dLhaty = (dLy * magL - Ly * dMagL) / (magL * magL);
695 if (Lhatx == 0.0 && Lhaty == 0.0) {
698 alphadotcosi = Lhatz * (Lhatx * dLhaty - Lhaty * dLhatx) / (Lhatx * Lhatx + Lhaty * Lhaty);
701 dvalues[12] = omega - alphadotcosi;
702 dvalues[13] = alphadotcosi;
708 (
double)mass1, (
double)mass2, (
double)eta);
710 XLAL_PRINT_INFO(
"spin1 = {%12.12lf,%12.12lf,%12.12lf}, spin2 = {%12.12lf,%12.12lf,%12.12lf}\n",
711 (
double)s1.
data[0], (
double)s1.
data[1], (
double)s1.
data[2],
712 (
double)s2.
data[0], (
double)s2.
data[1], (
double)s2.
data[2]);
713 XLAL_PRINT_INFO(
"sigmaStar = {%12.12lf,%12.12lf,%12.12lf}, sigmaKerr = {%12.12lf,%12.12lf,%12.12lf}\n",
714 (
double)sStar.
data[0], (
double)sStar.
data[1],
715 (
double)sStar.
data[2], (
double)sKerr.
data[0],
716 (
double)sKerr.
data[1], (
double)sKerr.
data[2]);
718 (
double)Lx, (
double)Ly, (
double)Lz, (
double)magL);
719 XLAL_PRINT_INFO(
"dLdt = {%12.12lf,%12.12lf,%12.12lf}, d|L|dt = %12.12lf\n",
720 (
double)dLx, (
double)dLy, (
double)dLz, (
double)dMagL);
721 XLAL_PRINT_INFO(
"Polar coordinates = {%12.12lf, %12.12lf, %12.12lf, %12.12lf}\n",
722 (
double)polData[0], (
double)polData[1], (
double)polData[2],
725 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",
726 (
double)values[0], (
double)values[1], (
double)values[2],
727 (
double)values[3], (
double)values[4], (
double)values[5],
728 (
double)values[6], (
double)values[7], (
double)values[8],
729 (
double)values[9], (
double)values[10], (
double)values[11],
730 (
double)values[12], (
double)values[13]);
731 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",
732 (
double)dvalues[0], (
double)dvalues[1], (
double)dvalues[2],
733 (
double)dvalues[3], (
double)dvalues[4], (
double)dvalues[5],
734 (
double)dvalues[6], (
double)dvalues[7], (
double)dvalues[8],
735 (
double)dvalues[9], (
double)dvalues[10], (
double)dvalues[11],
736 (
double)dvalues[12], (
double)dvalues[13]);
738 XLAL_PRINT_INFO(
"Hamiltonian = %12.12lf, Flux = %12.12lf, Omega = %12.12lf\n",
739 H/ (mass1 + mass2), eta*flux, omega);
745 if(dvalues[
i] > 1e3){
748 for(j=0; j<14;
XLAL_PRINT_INFO(
"dvalues[%d] = %3.12f\n", j, dvalues[j]), j++);
764 const REAL8 values[],
768 static const REAL8 STEP_SIZE = 2.0e-3;
788 params.varyParam = paramIdx;
793 REAL8 mT2 = (mass1 + mass2) * (mass1 + mass2);
796 tmpValues[
i] = values[
i];
797 tmpValues[
i + 3] = values[
i + 3];
798 tmpValues[
i + 6] = values[
i + 6]/mT2;
799 tmpValues[
i + 9] = values[
i + 9]/mT2;
801 tmpValues[12] = values[12];
802 tmpValues[13] = values[13];
803 params.values = tmpValues;
804 REAL8 m_total = mass1 + mass2;
809 if (paramIdx >=0 && paramIdx < 6) {
810 XLAL_CALLGSL(gslStatus = gsl_deriv_central(&F, values[paramIdx],
811 STEP_SIZE, &result, &absErr));
813 else if (paramIdx >= 6 && paramIdx < 9) {
815 XLAL_CALLGSL(gslStatus = gsl_deriv_central(&F, values[paramIdx],
816 STEP_SIZE * mass1 * mass1, &result, &absErr));
818 else if (paramIdx >= 9 && paramIdx < 12) {
820 XLAL_CALLGSL(gslStatus = gsl_deriv_central(&F, values[paramIdx],
821 STEP_SIZE * mass2 * mass2, &result, &absErr));
827 if (gslStatus != GSL_SUCCESS) {
828 XLALPrintError(
"XLAL Error %s - Failure in GSL function\n", __func__);
849 REAL8 s1normData[3], s2normData[3], sKerrData[3], sStarData[3];
862 REAL8 m_total = m1 + m2;
865 REAL8 UNUSED mT2 = (m1 + m2) * (m1 + m2);
866 REAL8 UNUSED eta = m1 * m2 / mT2;
870 memcpy(tmpVec, dParams->
values,
sizeof(tmpVec));
881 spin1.
data = tmpVec + 6;
882 spin2.
data = tmpVec + 9;
883 spin1norm.
data = s1normData;
884 spin2norm.
data = s2normData;
885 sigmaKerr.
data = sKerrData;
886 sigmaStar.
data = sStarData;
888 memcpy(spin1norm.
data, tmpVec + 6, 3 *
sizeof(
REAL8));
889 memcpy(spin2norm.
data, tmpVec + 9, 3 *
sizeof(
REAL8));
895 for (
i = 0;
i < 3;
i++) {
896 spin1.
data[
i] *= mT2;
897 spin2.
data[
i] *= mT2;
906 a = sqrt(sigmaKerr.
data[0] * sigmaKerr.
data[0]
907 + sigmaKerr.
data[1] * sigmaKerr.
data[1]
908 + sigmaKerr.
data[2] * sigmaKerr.
data[2]);
static int XLALSimIMRCalculateSpinPrecEOBHCoeffs_v2(SpinEOBHCoeffs *coeffs, const REAL8 eta, REAL8 a, REAL8 chi, const UINT4 SpinAlignedEOBversion)
This function is used to calculate some coefficients which will be used in the spinning EOB Hamiltoni...
static int XLALSimIMRCalculateSpinPrecEOBHCoeffs(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 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.
#define KRONECKER_DELTA(i, j)
static REAL8 XLALInspiralPrecSpinFactorizedFlux(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 REAL8 XLALSimIMRSpinPrecEOBHamiltonian(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 inner_product(const REAL8 values1[], const REAL8 values2[])
Functions to compute the inner product and cross products between vectors.
static REAL8 GSLSpinPrecHamiltonianWrapper(double x, void *params)
Wrapper for GSL to call the Hamiltonian function.
static REAL8 XLALSpinPrecHcapNumDerivWRTParam(const INT4 paramIdx, const REAL8 values[], SpinEOBParams *funcParams)
Calculate the derivative of the Hamiltonian w.r.t.
static int XLALSpinPrecHcapNumericalDerivative(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 REAL8 sum(REAL8 *arr1, REAL8 *arr2, int k)
#define XLAL_CALLGSL(statement)
#define XLAL_ERROR_REAL8(...)
#define XLAL_PRINT_INFO(...)
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.
Parameters for the spinning EOB model.
SpinEOBHCoeffs * seobCoeffs