2 #ifndef _LALSIMIMRSPINPRECEOBHCAPEXACTDERIVATIVE_C
3 #define _LALSIMIMRSPINPRECEOBHCAPEXACTDERIVATIVE_C
15 const REAL8 * valuestort,
22 const REAL8 * valuestort1,
const REAL8 * valuestort2,
36 const REAL8 * valuestort,
42 REAL8 sigmaKerrData[3];
43 REAL8 sigmaStarData[3];
48 memcpy(s1VecData, valuestort + 6, 3 *
sizeof(
REAL8));
49 memcpy(s2VecData, valuestort + 9, 3 *
sizeof(
REAL8));
51 for(
int i=0;
i<3;
i++){
52 sigmaKerrData[
i] = s1VecData[
i]+s2VecData[
i];
53 sigmaStarData[
i] = (mass2/mass1)*s1VecData[
i]+(mass1/mass2)*s2VecData[
i];
61 dsigmaKerr.
data = sigmaKerrData;
62 dsigmaStar.
data = sigmaStarData;
63 ds1Vec.
data = s1VecData;
64 ds2Vec.
data = s2VecData;
73 sigmaKerr = &dsigmaKerr;
74 sigmaStar = &dsigmaStar;
82 tmpa = sqrt(sigmaKerr->
data[0]*sigmaKerr->
data[0]
83 + sigmaKerr->
data[1]*sigmaKerr->
data[1]
84 + sigmaKerr->
data[2]*sigmaKerr->
data[2]);
97 REAL8 a2_prederiv = sigmaKerr->
data[0] * sigmaKerr->
data[0] + sigmaKerr->
data[1] * sigmaKerr->
data[1] + sigmaKerr->
data[2] * sigmaKerr->
data[2];
98 REAL8 a_prederiv = sqrt(a2_prederiv);
102 REAL8 e3_x, e3_y, e3_z;
106 const REAL8 inva = 1./a_prederiv;
107 e3_x = sigmaKerr->
data[0] * inva;
108 e3_y = sigmaKerr->
data[1] * inva;
109 e3_z = sigmaKerr->
data[2] * inva;
124 REAL8 xData[3] = {0.}, pData[3] = {0.};
133 memcpy(xVec.
data,valuestort,3*
sizeof(
REAL8));
134 memcpy(pVec.
data,valuestort+3,3*
sizeof(
REAL8));
136 const REAL8 invr = 1./sqrt(xData[0]*xData[0]+xData[1]*xData[1]+xData[2]*xData[2]);
138 if (1. - fabs(e3_x*(xData[0]*invr) + e3_y*(xData[1]*invr) + e3_z*(xData[2]*invr)) <= 1.e-8) {
141 const REAL8 invnorm = 1./sqrt(e3_x*e3_x + e3_y*e3_y + e3_z*e3_z);
152 const double epsilon_spin=1
e-14;
153 if(fabs(s1Vec->
data[0] + s2Vec->
data[0])<epsilon_spin &&
154 fabs(s1Vec->
data[1] + s2Vec->
data[1])<epsilon_spin &&
155 fabs(s1Vec->
data[2] + s2Vec->
data[2])<epsilon_spin) {
156 s1Vec->
data[0] = epsilon_spin;
157 s1Vec->
data[1] = epsilon_spin;
158 s1Vec->
data[2] = epsilon_spin;
159 s2Vec->
data[0] = epsilon_spin;
160 s2Vec->
data[1] = epsilon_spin;
161 s2Vec->
data[2] = epsilon_spin;
164 const REAL8 etainv = 1.0/eta;
167 UNUSED
REAL8 c0k2 = seobCoeffConsts->
a0k2;
168 UNUSED
REAL8 c1k2 = seobCoeffConsts->
a1k2;
169 UNUSED
REAL8 c0k3 = seobCoeffConsts->
a0k3;
170 UNUSED
REAL8 c1k3 = seobCoeffConsts->
a1k3;
171 UNUSED
REAL8 c0k4 = seobCoeffConsts->
a0k4;
172 UNUSED
REAL8 c1k4 = seobCoeffConsts->
a1k4;
173 UNUSED
REAL8 c2k4 = seobCoeffConsts->
a2k4;
174 UNUSED
REAL8 c0k5 = seobCoeffConsts->
a0k5;
175 UNUSED
REAL8 c1k5 = seobCoeffConsts->
a1k5;
176 UNUSED
REAL8 c2k5 = seobCoeffConsts->
a2k5;
195 if(isnan(derivs[0]*derivs[1]*derivs[2])){
197 XLALPrintError(
"NAN in derivative! derivs0,1,2 = %e %e %e | divby0 = %d\n",derivs[0],derivs[1],derivs[2],divby0);
210 REAL8 sigmaKerrData[3];
211 REAL8 sigmaStarData[3];
227 sigmaKerr = &dsigmaKerr;
228 sigmaStar = &dsigmaStar;
231 memcpy(s1VecData, valuestort1 + 6, 3 *
sizeof(
REAL8));
232 memcpy(s2VecData, valuestort1 + 9, 3 *
sizeof(
REAL8));
234 const REAL8 m1divm2 = mass1/mass2;
235 const REAL8 m2divm1 = mass2/mass1;
237 for(
int i=0;
i<3;
i++){
238 sigmaKerrData[
i] = s1VecData[
i]+s2VecData[
i];
239 sigmaStarData[
i] = m2divm1*s1VecData[
i]+m1divm2*s2VecData[
i];
242 dsigmaKerr.
data = sigmaKerrData;
243 dsigmaStar.
data = sigmaStarData;
244 ds1Vec.
data = s1VecData;
245 ds2Vec.
data = s2VecData;
249 REAL8 a2_prederiv = sigmaKerr->
data[0] * sigmaKerr->
data[0] + sigmaKerr->
data[1] * sigmaKerr->
data[1] + sigmaKerr->
data[2] * sigmaKerr->
data[2];
250 REAL8 a_prederiv = sqrt(a2_prederiv);
267 REAL8 e3_x, e3_y, e3_z, e3x, e3y, e3z;
268 const REAL8 inva = 1./a_prederiv;
269 const REAL8 inva3 = inva * inva * inva;
272 e3x = sigmaKerr->
data[0] * inva;
273 e3y = sigmaKerr->
data[1] * inva;
274 e3z = sigmaKerr->
data[2] * inva;
295 REAL8 xData[3] = {0.}, pData[3] = {0.};
305 memcpy(xVec.
data,valuestort1,3*
sizeof(
REAL8));
306 memcpy(pVec.
data,valuestort1+3,3*
sizeof(
REAL8));
308 const REAL8 invr = 1./sqrt(xData[0]*xData[0]+xData[1]*xData[1]+xData[2]*xData[2]);
311 if (1. - fabs(e3_x*(xData[0]*invr) + e3_y*(xData[1]*invr) + e3_z*(xData[2]*invr)) <= 1.e-8) {
314 invnorm = 1./sqrt(e3_x*e3_x + e3_y*e3_y + e3_z*e3_z);
321 const REAL8 invnorm3 = invnorm * invnorm * invnorm;
327 const double epsilon_spin=1
e-14;
328 if(fabs(s1Vec->
data[0] + s2Vec->
data[0])<epsilon_spin &&
329 fabs(s1Vec->
data[1] + s2Vec->
data[1])<epsilon_spin &&
330 fabs(s1Vec->
data[2] + s2Vec->
data[2])<epsilon_spin) {
331 s1Vec->
data[0] = epsilon_spin;
332 s1Vec->
data[1] = epsilon_spin;
333 s1Vec->
data[2] = epsilon_spin;
334 s2Vec->
data[0] = epsilon_spin;
335 s2Vec->
data[1] = epsilon_spin;
336 s2Vec->
data[2] = epsilon_spin;
340 const REAL8 etainv = 1.0/eta;
343 UNUSED
REAL8 c0k2 = seobCoeffConsts->
a0k2;
344 UNUSED
REAL8 c1k2 = seobCoeffConsts->
a1k2;
345 UNUSED
REAL8 c0k3 = seobCoeffConsts->
a0k3;
346 UNUSED
REAL8 c1k3 = seobCoeffConsts->
a1k3;
347 UNUSED
REAL8 c0k4 = seobCoeffConsts->
a0k4;
348 UNUSED
REAL8 c1k4 = seobCoeffConsts->
a1k4;
349 UNUSED
REAL8 c2k4 = seobCoeffConsts->
a2k4;
350 UNUSED
REAL8 c0k5 = seobCoeffConsts->
a0k5;
351 UNUSED
REAL8 c1k5 = seobCoeffConsts->
a1k5;
352 UNUSED
REAL8 c2k5 = seobCoeffConsts->
a2k5;
371 memcpy(xVec.
data,valuestort2,3*
sizeof(
REAL8));
372 memcpy(pVec.
data,valuestort2+3,3*
sizeof(
REAL8));
389 double e3USCORExprm = inva - sigmaKerr->
data[0] * sigmaKerr->
data[0] * inva3;
390 double e3USCOREyprm = - sigmaKerr->
data[1] * sigmaKerr->
data[0] * inva3;
391 double e3USCOREzprm = - sigmaKerr->
data[2] * sigmaKerr->
data[0] * inva3;
394 double e3xprm = e3USCORExprm;
395 double e3yprm = e3USCOREyprm;
396 double e3zprm = e3USCOREzprm;
398 e3USCORExprm = e3xprm * invnorm - (e3x + 0.1) * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
399 e3USCOREyprm = e3yprm * invnorm - (e3y + 0.1) * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
400 e3USCOREzprm = e3zprm * invnorm - e3z * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
406 double e3USCORExprm = - sigmaKerr->
data[0] * sigmaKerr->
data[1] * inva3;
407 double e3USCOREyprm = inva - sigmaKerr->
data[1] * sigmaKerr->
data[1] * inva3;
408 double e3USCOREzprm = - sigmaKerr->
data[2] * sigmaKerr->
data[1] * inva3;
411 double e3xprm = e3USCORExprm;
412 double e3yprm = e3USCOREyprm;
413 double e3zprm = e3USCOREzprm;
415 e3USCORExprm = e3xprm * invnorm - (e3x + 0.1) * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
416 e3USCOREyprm = e3yprm * invnorm - (e3y + 0.1) * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
417 e3USCOREzprm = e3zprm * invnorm - e3z * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
423 double e3USCORExprm = - sigmaKerr->
data[0] * sigmaKerr->
data[2] * inva3;
424 double e3USCOREyprm = - sigmaKerr->
data[1] * sigmaKerr->
data[2] * inva3;
425 double e3USCOREzprm = inva - sigmaKerr->
data[2] * sigmaKerr->
data[2] * inva3;
428 double e3xprm = e3USCORExprm;
429 double e3yprm = e3USCOREyprm;
430 double e3zprm = e3USCOREzprm;
432 e3USCORExprm = e3xprm * invnorm - (e3x + 0.1) * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
433 e3USCOREyprm = e3yprm * invnorm - (e3y + 0.1) * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
434 e3USCOREzprm = e3zprm * invnorm - e3z * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
440 double e3USCORExprm = inva - sigmaKerr->
data[0] * sigmaKerr->
data[0] * inva3;
441 double e3USCOREyprm = - sigmaKerr->
data[1] * sigmaKerr->
data[0] * inva3;
442 double e3USCOREzprm = - sigmaKerr->
data[2] * sigmaKerr->
data[0] * inva3;
445 double e3xprm = e3USCORExprm;
446 double e3yprm = e3USCOREyprm;
447 double e3zprm = e3USCOREzprm;
449 e3USCORExprm = e3xprm * invnorm - (e3x + 0.1) * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
450 e3USCOREyprm = e3yprm * invnorm - (e3y + 0.1) * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
451 e3USCOREzprm = e3zprm * invnorm - e3z * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
456 double e3USCORExprm = - sigmaKerr->
data[0] * sigmaKerr->
data[1] * inva3;
457 double e3USCOREyprm = inva - sigmaKerr->
data[1] * sigmaKerr->
data[1] * inva3;
458 double e3USCOREzprm = - sigmaKerr->
data[2] * sigmaKerr->
data[1] * inva3;
461 double e3xprm = e3USCORExprm;
462 double e3yprm = e3USCOREyprm;
463 double e3zprm = e3USCOREzprm;
465 e3USCORExprm = e3xprm * invnorm - (e3x + 0.1) * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
466 e3USCOREyprm = e3yprm * invnorm - (e3y + 0.1) * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
467 e3USCOREzprm = e3zprm * invnorm - e3z * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
472 double e3USCORExprm = - sigmaKerr->
data[0] * sigmaKerr->
data[2] * inva3;
473 double e3USCOREyprm = - sigmaKerr->
data[1] * sigmaKerr->
data[2] * inva3;
474 double e3USCOREzprm = inva - sigmaKerr->
data[2] * sigmaKerr->
data[2] * inva3;
477 double e3xprm = e3USCORExprm;
478 double e3yprm = e3USCOREyprm;
479 double e3zprm = e3USCOREzprm;
481 e3USCORExprm = e3xprm * invnorm - (e3x + 0.1) * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
482 e3USCOREyprm = e3yprm * invnorm - (e3y + 0.1) * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
483 e3USCOREzprm = e3zprm * invnorm - e3z * (((e3x + 0.1) * e3xprm + (e3y + 0.1) * e3yprm + e3z * e3zprm) * invnorm3);
489 if(isnan(derivs[0]*derivs[1]*derivs[2]*derivs[3]*derivs[4]*derivs[5]*derivs[6]*derivs[7]*derivs[8]*derivs[9]*derivs[10]*derivs[11])){
490 XLALPrintError(
"XLALSEOBNRv3_opt_ComputeHamiltonianDerivatives failed!\n");
491 XLALPrintError(
"NAN in derivative! derivs0,1,2,3,4,5,6,7,8,9,10,11 = %e %e %e %e %e %e %e %e %e %e %e %e | divby0 = %d\n",derivs[0],derivs[1],derivs[2],derivs[3],derivs[4],derivs[5],derivs[6],derivs[7],derivs[8],derivs[9],derivs[10],derivs[11],divby0);
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 INT4 XLALSEOBNRv3_opt_ComputeHamiltonianDerivatives(const REAL8 *valuestort1, const REAL8 *valuestort2, SpinEOBHCoeffs *coeffs, REAL8 *derivs, SpinEOBParams *params, REAL8 *HReal)
static INT4 XLALSEOBNRv3_opt_HDerivs_for_Omega(const REAL8 *valuestort, const REAL8 mass1, const REAL8 mass2, const REAL8 eta, SpinEOBHCoeffs *coeffs, REAL8 *derivs, SpinEOBParams *params)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
Parameters for the spinning EOB model, used in calculating the Hamiltonian.
UINT4 SpinAlignedEOBversion
Parameters for the spinning EOB model.