14 #ifndef _LALSIMIMRSPINEOBHAMILTONIANPREC_C
15 #define _LALSIMIMRSPINEOBHAMILTONIANPREC_C
19 #include <gsl/gsl_deriv.h>
21 #include <lal/LALSimInspiral.h>
22 #include <lal/LALSimIMR.h>
74 const REAL8 values2[],
143 XLAL_PRINT_INFO(
"In Hamiltonian: tortoise flag = %d\n", (
int) tortoise );
147 sigmaStar->data[1], sigmaStar->data[2] );
149 sigmaKerr->data[1], sigmaKerr->data[2] );}
158 REAL8 L[3] = {0, 0, 0};
159 REAL8 Lhat[3] = {0, 0, 0.0};
162 for (
UINT4 jj = 0; jj < 3; jj++)
164 Lhat[jj] = L[jj] / L_mag;
169 REAL8 S1_perp[3] = {0, 0, 0};
170 REAL8 S2_perp[3] = {0, 0, 0};
171 REAL8 S_perp[3] = {0,0,0};
172 for (
UINT4 jj = 0; jj < 3; jj++)
174 S1_perp[jj] = s1Vec->data[jj] - tempS1_p * Lhat[jj];
175 S2_perp[jj] = s2Vec->data[jj] - tempS2_p * Lhat[jj];
176 S_perp[jj] = S1_perp[jj]+S2_perp[jj];
180 if (sKerr_norm>1
e-6){
181 S_con = sigmaKerr->data[0] * Lhat[0] + sigmaKerr->data[1] * Lhat[1] + sigmaKerr->data[2] * Lhat[2];
182 S_con /= (1 - 2 * eta);
184 S_con +=
inner_product(S_perp, sigmaKerr->data) / sKerr_norm / (1 - 2 * eta) / 2.;
192 tmpa = sqrt(sigmaKerr->data[0]*sigmaKerr->data[0]
193 + sigmaKerr->data[1]*sigmaKerr->data[1]
194 + sigmaKerr->data[2]*sigmaKerr->data[2]);
221 REAL8 sKerr_x, sKerr_y, sKerr_z,
a,
a2;
222 REAL8 sStar_x, sStar_y, sStar_z;
223 REAL8 e3_x, e3_y, e3_z;
233 REAL8 deltaSigmaStar_x, deltaSigmaStar_y, deltaSigmaStar_z;
241 REAL8 tmpP[3] = {0.};
246 r2 =
x->data[0]*
x->data[0] +
x->data[1]*
x->data[1] +
x->data[2]*
x->data[2];
258 sKerr_x = sigmaKerr->data[0];
259 sKerr_y = sigmaKerr->data[1];
260 sKerr_z = sigmaKerr->data[2];
262 sStar_x = sigmaStar->data[0];
263 sStar_y = sigmaStar->data[1];
264 sStar_z = sigmaStar->data[2];
266 a2 = sKerr_x*sKerr_x + sKerr_y*sKerr_y + sKerr_z*sKerr_z;
272 e3_x = sKerr_x * inva;
273 e3_y = sKerr_y * inva;
274 e3_z = sKerr_z * inva;
282 UNUSED
REAL8 result[3] = {0.0, 0.0, 0.0};
283 UNUSED
REAL8 e3[3] = {e3_x, e3_y, e3_z};
285 UNUSED
REAL8 lambda_hat[3]={0.0,0.0,0.0};
288 for (
int k=0;k<3;k++){
293 if (1. - fabs(e3_x *
nx + e3_y *
ny + e3_z *
nz) <= 1.e-8)
296 UNUSED
REAL8 angle = 1.8e-3;
305 const REAL8 invnorm = 1./sqrt(e3_x*e3_x + e3_y*e3_y + e3_z*e3_z);
315 xi_x = -e3_z*
ny + e3_y*
nz;
316 xi_y = e3_z*
nx - e3_x*
nz;
317 xi_z = -e3_y*
nx + e3_x*
ny;
335 const REAL8 invlog_2e = 0.69314718055994530941723212145817656807550013436026;
336 logu = log2(
u)*invlog_2e;
347 bulk * (eta*(coeffs->
k1 +
u*(2.*coeffs->
k2 +
u*(3.*coeffs->
k3 +
u*(4.*coeffs->
k4 + 5.*(coeffs->
k5+coeffs->
k5l*
logu)*
u)))))
350 deltaT_r = 2.*
r*
deltaU - deltaU_u;
359 D = 1. + log1p(6.*eta*
u2 + 2.*(26. - 3.*eta)*eta*
u3);
363 qq = 2.*eta*(4. - 3.*eta);
372 const REAL8 csi1 = 1.0 + (1.-fabs(1.-tortoise)) * (
csi - 1.0);
374 const REAL8 csi2 = 1.0 + (0.5-copysign(0.5, 1.5-tortoise)) * (
csi - 1.0);
382 tmpP[0] =
p->data[0] -
nx *
prT * (1. - 1./
csi1);
383 tmpP[1] =
p->data[1] -
ny *
prT * (1. - 1./
csi1);
384 tmpP[2] =
p->data[2] -
nz *
prT * (1. - 1./
csi1);
386 pxir = (tmpP[0]*xi_x + tmpP[1]*xi_y + tmpP[2]*xi_z) *
r;
387 pvr = (tmpP[0]*
vx + tmpP[1]*
vy + tmpP[2]*
vz) *
r;
388 pn = tmpP[0]*
nx + tmpP[1]*
ny + tmpP[2]*
nz;
398 XLAL_PRINT_INFO(
"D = %.16e, ww = %.16e, rho = %.16e, Lambda = %.16e, xi = %.16e\npr = %.16e, pf = %.16e, deltaR = %.16e, deltaT = %.16e\n",
433 Lambda_r = 4.*
r*
w2 -
a2*deltaT_r*
xi2;
448 XLAL_PRINT_INFO(
"Q = %.16e, pvr = %.16e, xi2 = %.16e , deltaT = %.16e, rho2 = %.16e, Lambda = %.16e, pxir = %.16e, B = %.16e\n",
Q,
pvr,
xi2,
deltaT,
rho2,
Lambda,
pxir,
B );
455 XLAL_PRINT_INFO(
"sigmaKerr = %.16e, sigmaStar = %.16e\n", sKerr_z, sStar_z );}
458 deltaSigmaStar_x=eta*((-8. - 3.*
r*(12.*
pn2 -
pp))*sKerr_x + (14. + (- 30.*
pn2 + 4.*
pp)*
r)*sStar_x)*(1./12.)*
u;
460 deltaSigmaStar_y=eta*((-8. - 3.*
r*(12.*
pn2 -
pp))*sKerr_y + (14. + (- 30.*
pn2 + 4.*
pp)*
r)*sStar_y)*(1./12.)*
u;
462 deltaSigmaStar_z=eta*((-8. - 3.*
r*(12.*
pn2 -
pp))*sKerr_z + (14. + (- 30.*
pn2 + 4.*
pp)*
r)*sStar_z)*(1./12.)*
u;
494 deltaSigmaStar_x += coeffs->
d1 * eta * sigmaStar->data[0] *
u3;
495 deltaSigmaStar_y += coeffs->
d1 * eta * sigmaStar->data[1] *
u3;
496 deltaSigmaStar_z += coeffs->
d1 * eta * sigmaStar->data[2] *
u3;
497 deltaSigmaStar_x += coeffs->
d1v2 * eta * sigmaKerr->data[0] *
u3;
498 deltaSigmaStar_y += coeffs->
d1v2 * eta * sigmaKerr->data[1] *
u3;
499 deltaSigmaStar_z += coeffs->
d1v2 * eta * sigmaKerr->data[2] *
u3;
503 XLAL_PRINT_INFO(
"deltaSigmaStar_x = %.16e, deltaSigmaStar_y = %.16e, deltaSigmaStar_z = %.16e\n", deltaSigmaStar_x, deltaSigmaStar_y, deltaSigmaStar_z );}
505 sx = sStar_x + deltaSigmaStar_x;
506 sy = sStar_y + deltaSigmaStar_y;
507 sz = sStar_z + deltaSigmaStar_z;
537 H += coeffs->
dheffSS * eta * (sKerr_x*sStar_x + sKerr_y*sStar_y + sKerr_z*sStar_z) *
u4;
540 * (s1Vec->data[0]*s1Vec->data[0] + s1Vec->data[1]*s1Vec->data[1] + s1Vec->data[2]*s1Vec->data[2]
541 +s2Vec->data[0]*s2Vec->data[0] + s2Vec->data[1]*s2Vec->data[1] + s2Vec->data[2]*s2Vec->data[2]);
546 Hreal = sqrt(1. + 2.*eta *(fabs(
H) - 1.));
553 "\n\nInside Hamiltonian: Hreal is a NAN. Printing its components below:\n");
554 XLALPrintError(
"(deltaU, bulk, logTerms, log arg) = (%.16e, %.16e, %.16e, %.16e)\n",
deltaU,
bulk,
logTerms, 1. + coeffs->
k1*
u + coeffs->
k2*
u2 + coeffs->
k3*
u3 + coeffs->
k4*
u4
557 XLALPrintError(
"In Hamiltonian: tortoise flag = %d\n", (
int) tortoise );
558 XLALPrintError(
"x = %.16e\t%.16e\t%.16e\n",
x->data[0],
x->data[1],
x->data[2] );
559 XLALPrintError(
"p = %.16e\t%.16e\t%.16e\n",
p->data[0],
p->data[1],
p->data[2] );
560 XLALPrintError(
"sStar = %.16e\t%.16e\t%.16e\n", sigmaStar->data[0],
561 sigmaStar->data[1], sigmaStar->data[2] );
562 XLALPrintError(
"sKerr = %.16e\t%.16e\t%.16e\n", sigmaKerr->data[0],
563 sigmaKerr->data[1], sigmaKerr->data[2] );
564 XLALPrintError(
"csi = %.16e, Q = %.16e, pvr = %.16e, xi2 = %.16e , deltaT = %.16e, rho2 = %.16e, Lambda = %.16e, pxir = %.16e, B = %.16e\n",
csi,
Q,
pvr,
xi2,
deltaT,
rho2,
Lambda,
pxir,
B );
570 XLALPrintError(
"D = %.16e, ww = %.16e, rho = %.16e, Lambda = %.16e, xi = %.16e\npr = %.16e, pf = %.16e, deltaR = %.16e, deltaT = %.16e\n",
575 XLALPrintError(
"D = %.16e, ww = %.16e, rho = %.16e, Lambda = %.16e, xi = %.16e\npr = %.16e, pf = %.16e, deltaR = %.16e, deltaT = %.16e\n",
579 XLALPrintError(
"deltaSigmaStar_x = %.16e, deltaSigmaStar_y = %.16e, deltaSigmaStar_z = %.16e\n",
580 deltaSigmaStar_x, deltaSigmaStar_y, deltaSigmaStar_z );
593 XLALPrintError(
"XLAL Error - %s: Hreal = nan in Hamiltonian \n", __func__);
665 D = 1. + log(1. + 6.*eta*
u2 + 2.*(26. - 3.*eta)*eta*
u3);
685 const REAL8 values2[] )
688 for(
int i = 0;
i < 3 ;
i++ )
689 result += values1[
i] * values2[
i];
695 const REAL8 values2[],
698 result[0] = values1[1]*values2[2] - values1[2]*values2[1];
699 result[1] = values1[2]*values2[0] - values1[0]*values2[2];
700 result[2] = values1[0]*values2[1] - values1[1]*values2[0];
711 REAL8 kcrossv[3]={0,0,0};
714 for (
UINT4 ii=0;ii<3;ii++){
715 result[ii] = v[ii]*cos(
theta)+kcrossv[ii]*sin(
theta)+k[ii]*kdotv*(1-cos(
theta));
739 const REAL8 values[],
745 for(
int i =0;
i < 12;
i++)
746 if( isnan(values[
i]) ) {
747 XLAL_PRINT_INFO(
"XLALSimIMRSpinPrecEOBCalcOmega::values %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f\n", values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8], values[9], values[10], values[11]);
748 XLALPrintError(
"XLAL Error - %s: nan in input values \n", __func__);
756 static const REAL8 STEP_SIZE = 1.0e-4;
762 REAL8 cartValues[14] = {0.}, dvalues[14] = {0.};
763 REAL8 cartvalues[14] = {0.}, polarvalues[6] = {0.};
764 REAL8 polarRPcartSvalues[14] = {0.};
765 memcpy( cartValues, values, 14 *
sizeof(
REAL8) );
769 REAL8 rvec[3] = {0.,0,0}, pvec[3] = {0.,0,0};
770 REAL8 s1vec[3] = {0.,0,0}, s2vec[3] = {0.,0,0};
772 REAL8 rdotvec[3] = {0.,0,0};
773 REAL8 rvecprime[3] = {0.,0,0}, pvecprime[3] = {0.,0,0},
774 s1vecprime[3]= {0.,0,0}, s2vecprime[3]= {0.,0,0};
775 REAL8 rvectmp[3] = {0.,0,0}, pvectmp[3] = {0.,0,0},
776 s1vectmp[3] = {0.,0,0}, s2vectmp[3]= {0.,0,0};
777 REAL8 LNhatprime[3]= {0.,0,0}, LNhatTmp[3]= {0.,0,0};
778 REAL8 rcrossrdot[3] = {0.,0,0};
780 REAL8 Rot1[3][3] ={{0.}};
781 REAL8 Rot2[3][3] ={{0.}} ;
782 REAL8 LNhat[3] = {0.,0,0};
784 REAL8 Xhat[3] = {1, 0, 0};
785 UNUSED
REAL8 Yhat[3] = {0, 1, 0};
786 UNUSED
REAL8 Zhat[3] = {0, 0, 1};
788 REAL8 Xprime[3] = {0.,0,0}, Yprime[3] = {0.,0,0}, Zprime[3] = {0.,0,0};
803 memcpy( rvec, values, 3*
sizeof(
REAL8) );
804 memcpy( pvec, values+3, 3*
sizeof(
REAL8) );
805 memcpy( s1vec, values+6, 3*
sizeof(
REAL8) );
806 memcpy( s2vec, values+9, 3*
sizeof(
REAL8) );
809 memset( dvalues, 0, 14 *
sizeof(
REAL8) );
815 memcpy( rdotvec, dvalues, 3*
sizeof(
REAL8) );
817 for(
int ii =0; ii < 12; ii++)
818 if( isnan(dvalues[ii]) ) {
819 XLAL_PRINT_INFO(
"XLALSimIMRSpinPrecEOBCalcOmega::dvalues %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f\n", dvalues[0], dvalues[1], dvalues[2], dvalues[3], dvalues[4], dvalues[5], dvalues[6], dvalues[7], dvalues[8], dvalues[9], dvalues[10], dvalues[11]);
828 for(
i = 0;
i < 3;
i++ )
829 rcrossrdot[
i] /= rcrossrdotNorm;
830 memcpy( LNhat, rcrossrdot, 3 *
sizeof(
REAL8) );
842 Rot1[0][0] = 1.; Rot1[0][1] = 0; Rot1[0][2] = 0;
843 Rot1[1][0] = 0.; Rot1[1][1] = 1; Rot1[1][2] = 0;
844 Rot1[2][0] = 0.; Rot1[2][1] = 0; Rot1[2][2] = 1;
846 memcpy(Xprime, LNhat, 3 *
sizeof(
REAL8));
860 Rot1[0][0] = 1./sqrt(2); Rot1[0][1] = -1/sqrt(2); Rot1[0][2] = 0;
861 Rot1[1][0] = 1./sqrt(2); Rot1[1][1] = 1./sqrt(2); Rot1[1][2] = 0;
862 Rot1[2][0] = 0.; Rot1[2][1] = 0; Rot1[2][2] = 1;
863 LNhatTmp[0] = LNhatTmp[1] = LNhatTmp[2] = 0.;
867 LNhatTmp[
i] += Rot1[
i][j]*LNhat[j];
869 memcpy(Xprime, LNhatTmp, 3*
sizeof(
REAL8));
882 Rot2[0][0] = Xprime[0]; Rot2[0][1] = Xprime[1]; Rot2[0][2] = Xprime[2];
883 Rot2[1][0] = Yprime[0]; Rot2[1][1] = Yprime[1]; Rot2[1][2] = Yprime[2];
884 Rot2[2][0] = Zprime[0]; Rot2[2][1] = Zprime[1]; Rot2[2][2] = Zprime[2];
886 memset( rvectmp, 0, 3 *
sizeof(
REAL8) );
887 memset( pvectmp, 0, 3 *
sizeof(
REAL8) );
888 memset( s1vectmp, 0, 3 *
sizeof(
REAL8) );
889 memset( s2vectmp, 0, 3 *
sizeof(
REAL8) );
890 memset( rvecprime, 0, 3 *
sizeof(
REAL8) );
891 memset( pvecprime, 0, 3 *
sizeof(
REAL8) );
892 memset( s1vecprime, 0, 3 *
sizeof(
REAL8) );
893 memset( s2vecprime, 0, 3 *
sizeof(
REAL8) );
894 memset( LNhatprime, 0, 3 *
sizeof(
REAL8) );
895 memset( LNhatTmp, 0, 3 *
sizeof(
REAL8) );
901 rvectmp[
i] += Rot1[
i][j]*rvec[j];
902 pvectmp[
i] += Rot1[
i][j]*pvec[j];
903 s1vectmp[
i] += Rot1[
i][j]*s1vec[j];
904 s2vectmp[
i] += Rot1[
i][j]*s2vec[j];
905 LNhatTmp[
i] += Rot1[
i][j]*LNhat[j];
910 rvecprime[
i] += Rot2[
i][j]*rvectmp[j];
911 pvecprime[
i] += Rot2[
i][j]*pvectmp[j];
912 s1vecprime[
i] += Rot2[
i][j]*s1vectmp[j];
913 s2vecprime[
i] += Rot2[
i][j]*s2vectmp[j];
914 LNhatprime[
i] += Rot2[
i][j]*LNhatTmp[j];
917 memcpy(cartvalues, rvecprime, 3*
sizeof(
REAL8));
918 memcpy(cartvalues+3, pvecprime, 3*
sizeof(
REAL8));
919 memcpy(cartvalues+6, s1vecprime, 3*
sizeof(
REAL8));
920 memcpy(cartvalues+9, s2vecprime, 3*
sizeof(
REAL8));
933 polarvalues[1] = acos(rvecprime[0] / polarvalues[0]);
934 polarvalues[2] = atan2(-rvecprime[1], rvecprime[2]);
939 REAL8 rvecprime_x_xhat[3] = {0.}, rvecprime_x_xhat_x_rvecprime[3] = {0.};
941 cross_product(rvecprime_x_xhat, rvecprime, rvecprime_x_xhat_x_rvecprime);
943 polarvalues[4] = -
inner_product(rvecprime_x_xhat_x_rvecprime, pvecprime)
944 / polarvalues[0] / sin(polarvalues[1]);
945 polarvalues[5] = -
inner_product(rvecprime_x_xhat, pvecprime);
952 memcpy( polarRPcartSvalues, cartvalues, 12*
sizeof(
REAL8));
953 memcpy( polarRPcartSvalues, polarvalues, 6*
sizeof(
REAL8));
956 params.values = polarRPcartSvalues;
965 XLAL_CALLGSL( gslStatus = gsl_deriv_central( &F, polarvalues[5],
966 STEP_SIZE, &omega, &absErr ) );
968 if ( gslStatus != GSL_SUCCESS )
970 XLALPrintError(
"XLAL Error - %s: Failure in GSL function\n", __func__ );
989 const REAL8 values[],
995 for(
int i =0;
i < 12;
i++)
996 if( isnan(values[
i]) ) {
997 XLAL_PRINT_INFO(
"XLALSimIMRSpinPrecEOBNonKeplerCoeff::values %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f\n",
998 values[0], values[1], values[2], values[3], values[4], values[5],
999 values[6], values[7], values[8], values[9], values[10], values[11]);
1005 REAL8 omegaCirc = 0;
1006 REAL8 tmpValues[14]= {0.};
1010 memcpy( tmpValues, values,
sizeof(tmpValues) );
1018 return 1.0/(omegaCirc*omegaCirc*r3);
1028 const REAL8 values[],
1033 UNUSED
int debugPK = 1;
1035 for(
int i =0;
i < 12;
i++){
1036 if( isnan(values[
i]) ) {
1037 XLAL_PRINT_INFO(
"XLALSpinPrecHcapRvecDerivative::values %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f\n", values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8], values[9], values[10], values[11]);
1038 XLALPrintError(
"XLAL Error - %s: nan in input values \n", __func__);
1042 if( isnan(dvalues[
i]) ) {
1043 XLAL_PRINT_INFO(
"XLALSpinPrecHcapRvecDerivative::dvalues %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f\n", dvalues[0], dvalues[1], dvalues[2], dvalues[3], dvalues[4], dvalues[5], dvalues[6], dvalues[7], dvalues[8], dvalues[9], dvalues[10], dvalues[11]);
1044 XLALPrintError(
"XLAL Error - %s: nan in the input dvalues \n", __func__);
1050 static const REAL8 STEP_SIZE = 1.0e-4;
1052 UNUSED
static const INT4 lMax = 8;
1059 REAL8 tmpDValues[14] = {0.};
1066 UINT4 SpinAlignedEOBversion;
1067 UINT4 SpinAlignedEOBversionForWaveformCoefficients;
1072 REAL8 rData[3] = {0.}, pData[3] = {0.};
1077 REAL8 polData[4] = {0.};
1079 REAL8 mass1, mass2, eta;
1080 REAL8 UNUSED rrTerm2, pDotS1, pDotS2;
1082 REAL8 s1Data[3]= {0.}, s2Data[3]= {0.}, s1DataNorm[3]= {0.}, s2DataNorm[3]= {0.};
1083 REAL8 sKerrData[3]= {0.}, sStarData[3]= {0.};
1084 REAL8 chiS, chiA,
a, tplspin;
1085 REAL8 UNUSED s1dotL, s2dotL;
1086 REAL8 UNUSED rcrossrDot[3]= {0.}, rcrossrDotMag, s1dotLN, s2dotLN;
1090 REAL8 Lx, Ly, Lz, magL;
1091 REAL8 Lhatx, Lhaty, Lhatz;
1102 REAL8 tmpP[3]= {0.}, rMag, rMag2,
prT;
1105 REAL8 UNUSED eobD_r, deltaU_u, deltaU_r, deltaT_r;
1108 REAL8 tmpValues[12]= {0.};
1109 REAL8 UNUSED Tmatrix[3][3]= {{0.}}, invTmatrix[3][3]= {{0.}}, dTijdXk[3][3][3]= {{{0.}}};
1122 SpinAlignedEOBversion =
params.
params->seobCoeffs->SpinAlignedEOBversion;
1135 REAL8 tmps1Data[3]= {0.}, tmps2Data[3]= {0.};
REAL8Vector tmps1Vec, tmps2Vec;
1136 memcpy( tmps1Data, values+6, 3*
sizeof(
REAL8) );
1137 memcpy( tmps2Data, values+9, 3*
sizeof(
REAL8) );
1138 tmps1Vec.
data = tmps1Data; tmps2Vec.
data = tmps2Data;
1174 + tmpsigmaKerr->
data[1]*tmpsigmaKerr->
data[1]
1175 + tmpsigmaKerr->
data[2]*tmpsigmaKerr->
data[2] );
1184 params.
params->seobCoeffs->SpinAlignedEOBversion = SpinAlignedEOBversion;
1193 memcpy( rData, values,
sizeof(rData) );
1194 memcpy( pData, values+3,
sizeof(pData) );
1203 s1norm.
data = s1DataNorm;
1204 s2norm.
data = s2DataNorm;
1206 memcpy( s1Data, values+6, 3*
sizeof(
REAL8) );
1207 memcpy( s2Data, values+9, 3*
sizeof(
REAL8) );
1208 memcpy( s1DataNorm, values+6, 3*
sizeof(
REAL8) );
1209 memcpy( s2DataNorm, values+9, 3*
sizeof(
REAL8) );
1211 for (
i = 0;
i < 3;
i++ )
1213 s1Data[
i] *= (mass1+mass2)*(mass1+mass2);
1214 s2Data[
i] *= (mass1+mass2)*(mass1+mass2);
1218 sKerr.
data = sKerrData;
1222 sStar.
data = sStarData;
1232 if(debugPK && isnan(
a))
1240 rMag = sqrt(rData[0]*rData[0] + rData[1]*rData[1] + rData[2]*rData[2]);
1241 prT = pData[0]*(rData[0]/rMag) + pData[1]*(rData[1]/rMag)
1242 + pData[2]*(rData[2]/rMag);
1244 rMag2 = rMag * rMag;
1253 D = 1. + log(1. + 6.*eta*
u2 + 2.*(26. - 3.*eta)*eta*
u3);
1254 eobD_r = (
u2/(D*D))*(12.*eta*
u + 6.*(26. - 3.*eta)*eta*
u2)/(1.
1255 + 6.*eta*
u2 + 2.*(26. - 3.*eta)*eta*
u3);
1260 logTerms = 1. + eta*coeffs->
k0 + eta*log(fabs(1. + coeffs->
k1*
u
1271 bulk * (eta*(coeffs->
k1 +
u*(2.*coeffs->
k2 +
u*(3.*coeffs->
k3
1272 +
u*(4.*coeffs->
k4 + 5.*(coeffs->
k5+coeffs->
k5l*log(
u))*
u)))))
1273 / (1. + coeffs->
k1*
u + coeffs->
k2*
u2 + coeffs->
k3*
u3
1275 deltaU_r = -
u2 * deltaU_u;
1283 for(
i = 0;
i < 3;
i++ )
1285 tmpP[
i] = pData[
i] - (rData[
i]/rMag) *
prT * (
csi-1.)/
csi;
1292 for(
i = 0;
i < 3;
i++ )
1293 for( j = 0; j <=
i; j++ )
1295 Tmatrix[
i][j] = Tmatrix[j][
i] = (rData[
i]*rData[j]/rMag2)
1298 invTmatrix[
i][j] = invTmatrix[j][
i] =
1299 - (
csi - 1)/
csi * (rData[
i]*rData[j]/rMag2);
1303 invTmatrix[
i][j]++; }
1310 for(
i = 0;
i < 3;
i++ )
1311 for( j = 0; j < 3; j++ )
1312 for( k = 0; k < 3; k++ )
1317 + rData[
i]*rData[j]*rData[k]/rMag2/rMag*(-2./rMag*(
csi - 1.) + dcsi);
1321 for(
i =0;
i < 12;
i++){
1322 if( isnan(values[
i]) ) {
1323 XLAL_PRINT_INFO(
"XLALSpinPrecHcapRvecDerivative (just before diff)::values %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f\n", values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8], values[9], values[10], values[11]);
1328 if( isnan(dvalues[
i]) ) {
1329 XLAL_PRINT_INFO(
"XLALSpinPrecHcapRvecDerivative (just before diff)::dvalues %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f\n", dvalues[0], dvalues[1], dvalues[2], dvalues[3], dvalues[4], dvalues[5], dvalues[6], dvalues[7], dvalues[8], dvalues[9], dvalues[10], dvalues[11]);
1345 REAL8 tmpVec[12]= {0.};
1346 REAL8 tmpsKerrData[3]= {0.};
1347 REAL8 mT2 = (mass1+mass2)*(mass1+mass2);
1350 memcpy( tmpVec, values,
sizeof(tmpVec) );
1357 spin1.
data = tmpVec+6;
1358 spin2.
data = tmpVec+9;
1359 sigmaKerr.
data = tmpsKerrData;
1363 for (
i = 0;
i < 3;
i++ )
1365 spin1.
data[
i] *= mT2;
1366 spin2.
data[
i] *= mT2;
1375 Lx = values[1] * values[5] - values[2] * values[4];
1376 Ly = values[2] * values[3] - values[0] * values[5];
1377 Lz = values[0] * values[4] - values[1] * values[3];
1379 magL = sqrt(Lx * Lx + Ly * Ly + Lz * Lz);
1383 REAL8 Lhat[3] = {Lhatx, Lhaty, Lhatz};
1386 REAL8 S1_perp[3] = {0, 0, 0};
1387 REAL8 S2_perp[3] = {0, 0, 0};
1388 for(
UINT4 jj=0; jj<3; jj++){
1389 S1_perp[jj] = 1/mT2*(s1Data[jj]-tempS1_p*Lhat[jj]);
1390 S2_perp[jj] = 1/mT2*(s2Data[jj]-tempS2_p*Lhat[jj]);
1394 if (sKerr_norm>1
e-6){
1395 S_con = sigmaKerr.
data[0] * Lhat[0] + sigmaKerr.
data[1] * Lhat[1] + sigmaKerr.
data[2] * Lhat[2];
1396 S_con /= (1 - 2 * eta);
1401 tmpa = sqrt(sigmaKerr.
data[0]*sigmaKerr.
data[0]
1402 + sigmaKerr.
data[1]*sigmaKerr.
data[1]
1403 + sigmaKerr.
data[2]*sigmaKerr.
data[2]);
1404 if (SpinAlignedEOBversion == 4){
1426 for (
i = 3;
i < 6;
i++ )
1429 if (
i >=6 &&
i < 9 )
1434 STEP_SIZE*mass1*mass1, &tmpDValues[
i], &absErr ) );
1441 STEP_SIZE*mass2*mass2, &tmpDValues[
i], &absErr ) );
1447 memcpy( tmpValues,
params.values,
sizeof(tmpValues) );
1448 tmpValues[3] = tmpP[0]; tmpValues[4] = tmpP[1]; tmpValues[5] = tmpP[2];
1449 params.values = tmpValues;
1452 STEP_SIZE, &tmpDValues[
i], &absErr ) );
1462 STEP_SIZE, &tmpDValues[
i], &absErr ) );
1464 if ( gslStatus != GSL_SUCCESS )
1466 XLALPrintError(
"XLAL Error %s - Failure in GSL function\n", __func__ );
1472 for(
i =0;
i < 12;
i++)
1473 if( isnan(tmpDValues[
i]) ) {
1474 XLAL_PRINT_INFO(
"XLALSpinPrecHcapRvecDerivative (just after diff)::tmpDValues %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f\n", tmpDValues[0], tmpDValues[1], tmpDValues[2], tmpDValues[3], tmpDValues[4], tmpDValues[5], tmpDValues[6], tmpDValues[7], tmpDValues[8], tmpDValues[9], tmpDValues[10], tmpDValues[11]);
1479 Lx = values[1]*values[5] - values[2]*values[4];
1480 Ly = values[2]*values[3] - values[0]*values[5];
1481 Lz = values[0]*values[4] - values[1]*values[3];
1483 magL = sqrt( Lx*Lx + Ly*Ly + Lz*Lz );
1490 polarDynamics.length = 4;
1491 polarDynamics.data = polData;
1493 r = polData[0] = sqrt( values[0]*values[0] + values[1]*values[1]
1494 + values[2]*values[2] );
1496 polData[2] = (values[0]*values[3] + values[1]*values[4]
1497 + values[2]*values[5]) / polData[0];
1502 s1dotL = (s1Data[0]*Lhatx + s1Data[1]*Lhaty + s1Data[2]*Lhatz)
1504 s2dotL = (s2Data[0]*Lhatx + s2Data[1]*Lhaty + s2Data[2]*Lhatz)
1509 rcrossrDot[0] = values[1]*tmpDValues[5] - values[2]*tmpDValues[4];
1510 rcrossrDot[1] = values[2]*tmpDValues[3] - values[0]*tmpDValues[5];
1511 rcrossrDot[2] = values[0]*tmpDValues[4] - values[1]*tmpDValues[3];
1512 rcrossrDotMag = sqrt( rcrossrDot[0]*rcrossrDot[0]
1513 + rcrossrDot[1]*rcrossrDot[1] + rcrossrDot[2]*rcrossrDot[2] );
1515 rcrossrDot[0] /= rcrossrDotMag;
1516 rcrossrDot[1] /= rcrossrDotMag;
1517 rcrossrDot[2] /= rcrossrDotMag;
1519 s1dotLN = (s1Data[0]*rcrossrDot[0] + s1Data[1]*rcrossrDot[1]
1520 + s1Data[2]*rcrossrDot[2]) / (mass1*mass1);
1521 s2dotLN = (s2Data[0]*rcrossrDot[0] + s2Data[1]*rcrossrDot[1]
1522 + s2Data[2]*rcrossrDot[2]) / (mass2*mass2);
1524 REAL8 mT2 = (mass1+mass2)*(mass1+mass2);
1525 if (SpinAlignedEOBversion==4){
1526 chiS = 0.5 * (s1dotL + s2dotL);
1527 chiA = 0.5 * (s1dotL - s2dotL);
1530 chiS = 0.5 * (s1dotLN + s2dotLN);
1531 chiA = 0.5 * (s1dotLN - s2dotLN);
1533 REAL8 Lhat[3] = {Lhatx, Lhaty, Lhatz};
1536 REAL8 S1_perp[3] = {0, 0, 0};
1537 REAL8 S2_perp[3] = {0, 0, 0};
1539 for (
UINT4 jj = 0; jj < 3; jj++)
1541 S1_perp[jj] = 1 / mT2 * (s1Data[jj] - tempS1_p * Lhat[jj]);
1542 S2_perp[jj] = 1 / mT2 * (s2Data[jj] - tempS2_p * Lhat[jj]);
1548 if (sKerr_norm > 1
e-6){
1549 S_con = sKerr.
data[0] * Lhat[0] + sKerr.
data[1] * Lhat[1] + sKerr.
data[2] * Lhat[2];
1550 S_con /= (1 - 2 * eta);
1556 switch ( SpinAlignedEOBversion )
1563 tplspin = (1.-2.*eta) * chiS + (mass1 - mass2)/(mass1 + mass2) * chiA;
1566 XLALPrintError(
"XLAL Error - %s: Unknown SEOBNR version!\nAt present only v1 and v2 are available.\n", __func__);
1571 for(
i = 0;
i< 3;
i++ )
1585 if (SpinAlignedEOBversion == 2) {
1586 SpinAlignedEOBversionForWaveformCoefficients = 3;
1589 SpinAlignedEOBversionForWaveformCoefficients = SpinAlignedEOBversion;
1594 params.
params->eobParams->hCoeffs, mass1, mass2, eta, tplspin,
1595 chiS, chiA, SpinAlignedEOBversion);
1599 params.
params->eobParams->hCoeffs, mass1, mass2, eta, tplspin,
1600 chiS, chiA, SpinAlignedEOBversionForWaveformCoefficients);
1602 if (SpinAlignedEOBversion == 4){
1605 SpinAlignedEOBversion );
1612 SpinAlignedEOBversion );
1618 H =
H * (mass1 + mass2);
1622 for(
i = 0;
i < 3;
i++ )
1623 for( j = 0, dvalues[
i] = 0.; j < 3; j++ )
1624 dvalues[
i] += tmpDValues[j+3]*Tmatrix[
i][j];
1642 REAL8 tmpVec[12]= {0.};
1643 REAL8 s1normData[3]= {0.}, s2normData[3]= {0.}, sKerrData[3]= {0.}, sStarData[3]= {0.};
1653 REAL8 UNUSED mT2 = (m1+m2)*(m1+m2);
1654 REAL8 UNUSED eta = m1*m2/mT2;
1658 memcpy( tmpVec, dParams->
values,
sizeof(tmpVec) );
1661 for(
i =0;
i < 12;
i++)
1662 if( isnan(tmpVec[
i]) ) {
1663 XLAL_PRINT_INFO(
"GSLSpinPrecHamiltonianWrapperForRvecDerivs (from input)::tmpVec %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f\n", tmpVec[0], tmpVec[1], tmpVec[2], tmpVec[3], tmpVec[4], tmpVec[5], tmpVec[6], tmpVec[7], tmpVec[8], tmpVec[9], tmpVec[10], tmpVec[11]);
1676 spin1.
data = tmpVec+6;
1677 spin2.
data = tmpVec+9;
1678 spin1norm.
data = s1normData;
1679 spin2norm.
data = s2normData;
1680 sigmaKerr.
data = sKerrData;
1681 sigmaStar.
data = sStarData;
1683 memcpy( s1normData, tmpVec+6, 3*
sizeof(
REAL8) );
1684 memcpy( s2normData, tmpVec+9, 3*
sizeof(
REAL8) );
1688 for (
i = 0;
i < 3;
i++ )
1690 spin1.
data[
i] *= mT2;
1691 spin2.
data[
i] *= mT2;
1696 eobParams->
m2, &spin1, &spin2 );
1698 eobParams->
m2, &spin1, &spin2 );
1699 a = sqrt( sigmaKerr.
data[0]*sigmaKerr.
data[0]
1700 + sigmaKerr.
data[1]*sigmaKerr.
data[1]
1701 + sigmaKerr.
data[2]*sigmaKerr.
data[2] );
1704 XLAL_PRINT_INFO(
"a is nan in GSLSpinPrecHamiltonianWrapperForRvecDerivs!!\n");
1709 double magR =
r.data[0]*
r.data[0] +
r.data[1]*
r.data[1] +
r.data[2]*
r.data[2];
1712 if(0 && magR < 1.96 * 1.96) {
1713 XLAL_PRINT_INFO(
"GSLSpinPrecHamiltonianWrapperForRvecDerivs (JUST inputs)::tmpVec %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f\n", tmpVec[0], tmpVec[1], tmpVec[2], tmpVec[3], tmpVec[4], tmpVec[5], tmpVec[6], tmpVec[7], tmpVec[8], tmpVec[9], tmpVec[10], tmpVec[11]);
1721 if( isnan(SpinEOBH) )
1723 XLAL_PRINT_INFO(
"H is nan in GSLSpinPrecHamiltonianWrapperForRvecDerivs. \n");
1725 XLAL_PRINT_INFO(
"GSLSpinPrecHamiltonianWrapperForRvecDerivs (JUST inputs)::tmpVec %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f\n", tmpVec[0], tmpVec[1], tmpVec[2], tmpVec[3], tmpVec[4], tmpVec[5], tmpVec[6], tmpVec[7], tmpVec[8], tmpVec[9], tmpVec[10], tmpVec[11]);
1749 REAL8 tmpVec[12] = {0.};
1750 REAL8 rpolar[3] = {0.}, rcart[3] = {0.}, ppolar[3] = {0.}, pcart[3] = {0.};
1751 REAL8 s1normData[3] = {0.}, s2normData[3] = {0.}, sKerrData[3] = {0.}, sStarData[3] = {0.};
1761 REAL8 UNUSED mT2 = (m1+m2)*(m1+m2);
1762 REAL8 UNUSED eta = m1*m2/mT2;
1765 memcpy( tmpVec, dParams->
values,
sizeof(tmpVec) );
1775 memcpy( rpolar, tmpVec, 3*
sizeof(
REAL8));
1776 memcpy( ppolar, tmpVec+3, 3*
sizeof(
REAL8));
1778 rcart[0] = rpolar[0] * cos(rpolar[1]);
1779 rcart[1] =-rpolar[0] * sin(rpolar[1])*sin(rpolar[2]);
1780 rcart[2] = rpolar[0] * sin(rpolar[1])*cos(rpolar[2]);
1782 if( rpolar[1]==0. || rpolar[1]==
LAL_PI )
1791 pcart[0] = ppolar[0]*sin(rpolar[1])*cos(rpolar[2])
1792 + ppolar[1]/rpolar[0]*cos(rpolar[1])*cos(rpolar[2])
1793 - ppolar[2]/rpolar[0]/sin(rpolar[1])*sin(rpolar[2]);
1794 pcart[1] = ppolar[0]*sin(rpolar[1])*sin(rpolar[2])
1795 + ppolar[1]/rpolar[0]*cos(rpolar[1])*sin(rpolar[2])
1796 + ppolar[2]/rpolar[0]/sin(rpolar[1])*cos(rpolar[2]);
1797 pcart[2] = ppolar[0]*cos(rpolar[1])- ppolar[1]/rpolar[0]*sin(rpolar[1]);
1801 pcart[0] = ppolar[0]*cos(rpolar[1]) -ppolar[1]/rpolar[0]*sin(rpolar[1]);
1802 pcart[1] =-ppolar[0]*sin(rpolar[1])*sin(rpolar[2])
1803 -ppolar[1]/rpolar[0]*cos(rpolar[1])*sin(rpolar[2])
1804 -ppolar[2]/rpolar[0]/sin(rpolar[1])*cos(rpolar[2]);
1805 pcart[2] = ppolar[0]*sin(rpolar[1])*cos(rpolar[2])
1806 +ppolar[1]/rpolar[0]*cos(rpolar[1])*cos(rpolar[2])
1807 -ppolar[2]/rpolar[0]/sin(rpolar[1])*sin(rpolar[2]);
1813 spin1.
data = tmpVec+6;
1814 spin2.
data = tmpVec+9;
1815 spin1norm.
data = s1normData;
1816 spin2norm.
data = s2normData;
1817 sigmaKerr.
data = sKerrData;
1818 sigmaStar.
data = sStarData;
1820 memcpy( s1normData, tmpVec+6, 3*
sizeof(
REAL8) );
1821 memcpy( s2normData, tmpVec+9, 3*
sizeof(
REAL8) );
1825 for (
i = 0;
i < 3;
i++ )
1827 spin1.
data[
i] *= mT2;
1828 spin2.
data[
i] *= mT2;
1833 eobParams->
m2, &spin1, &spin2 );
1835 eobParams->
m2, &spin1, &spin2 );
1836 a = sqrt( sigmaKerr.
data[0]*sigmaKerr.
data[0]
1837 + sigmaKerr.
data[1]*sigmaKerr.
data[1]
1838 + sigmaKerr.
data[2]*sigmaKerr.
data[2] );
1841 XLAL_PRINT_INFO(
"a is nan in GSLSpinPrecHamiltonianWrapperFordHdpphi !!\n");
1842 XLAL_PRINT_INFO(
"rpolar, ppolar = %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f\n", rpolar[0], rpolar[1], rpolar[2], ppolar[0], ppolar[1], ppolar[2]);
1843 XLAL_PRINT_INFO(
"rcart, pcart = %3.10f %3.10f %3.10f %3.10f %3.10f %3.10f\n", rcart[0], rcart[1], rcart[2], pcart[0], pcart[1], pcart[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 double GSLSpinPrecHamiltonianWrapperForRvecDerivs(double x, void *params)
Wrapper for GSL to call the Hamiltonian function.
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 UNUSED REAL8 XLALSimIMRSpinPrecEOBNonKeplerCoeff(const REAL8 values[], SpinEOBParams *funcParams)
Function to calculate the non-Keplerian coefficient for the PRECESSING EOB model.
static REAL8 * cross_product(const REAL8 values1[], const REAL8 values2[], REAL8 result[])
static REAL8 * rotate_vector(const REAL8 v[], const REAL8 k[], const REAL8 theta, REAL8 result[])
Rotate the vector v around the axis k by an angle theta, counterclockwise Note that this assumes that...
static double GSLSpinPrecHamiltonianWrapperFordHdpphi(double x, void *params)
Wrapper for GSL to call the Hamiltonian function.
static REAL8 XLALSimIMRSpinPrecEOBHamiltonianDeltaT(SpinEOBHCoeffs *coeffs, const REAL8 r, const REAL8 eta, const REAL8 a)
This function calculates the function which appears in the spinning EOB potential function.
static UNUSED REAL8 XLALSimIMRSpinPrecEOBHamiltonianDeltaR(SpinEOBHCoeffs *coeffs, const REAL8 r, const REAL8 eta, const REAL8 a)
This function calculates the DeltaR potential function in the spin EOB Hamiltonian.
static int XLALSpinPrecHcapRvecDerivative(double UNUSED t, const REAL8 values[], REAL8 dvalues[], void *funcParams)
Function to calculate numerical derivatives of the spin EOB Hamiltonian, to get , as decribed in Eqs.
static REAL8 inner_product(const REAL8 values1[], const REAL8 values2[])
Functions to compute the inner product and cross products between vectors.
static REAL8 XLALSimIMRSpinPrecEOBCalcOmega(const REAL8 values[], SpinEOBParams *funcParams)
Function to calculate the value of omega for the PRECESSING EOB waveform.
#define XLAL_CALLGSL(statement)
const double sMultiplier1
const double sMultiplier2
REAL8Vector * XLALCreateREAL8Vector(UINT4 length)
void XLALDestroyREAL8Vector(REAL8Vector *vector)
#define XLAL_ERROR_REAL8(...)
#define XLAL_PRINT_INFO(...)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
#define XLAL_IS_REAL8_FAIL_NAN(val)
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