20 #ifndef _LALSIMIMRSPINPRECEOBFACTORIZEDWAVEFORM_C
21 #define _LALSIMIMRSPINPRECEOBFACTORIZEDWAVEFORM_C
22 #include <gsl/gsl_deriv.h>
24 #include <lal/LALSimInspiral.h>
25 #include <lal/LALSimIMR.h>
26 #include <gsl/gsl_spline.h>
27 #include <gsl/gsl_linalg.h>
133 for (
INT4 l = 2;
l <= lMax;
l++)
145 REAL8 UNUSED
r ,
pp, Omega, v2, k, hathatk, eulerlogxabs;
147 REAL8 UNUSED rcrossp_x, rcrossp_y, rcrossp_z;
148 REAL8 Slm , rholm, rholmPwrl;
150 REAL8 hathatksq4, hathatk4pi, Tlmprefac, Tlmprodfac;
167 eta =
params->eobParams->eta;
171 XLALPrintError(
"XLAL Error - %s: Eta seems to be > 0.25 - this isn't allowed!\n", __func__);
183 pp = values->data[3];
185 rcrossp_x = cartvalues->data[1] * cartvalues->data[5] - cartvalues->data[2] * cartvalues->data[4];
186 rcrossp_y = cartvalues->data[2] * cartvalues->data[3] - cartvalues->data[0] * cartvalues->data[5];
187 rcrossp_z = cartvalues->data[0] * cartvalues->data[4] - cartvalues->data[1] * cartvalues->data[3];
200 vPhi =
r * cbrt(vPhi);
203 XLAL_PRINT_INFO(
"In XLALSimIMRSpinEOBFluxCalculateNewtonianMultipole, getting rW = %.12e\n",
218 XLAL_PRINT_INFO(
"Calculating hNewton, with v = %.12e, vPhi = %.12e, r = %.12e, Phi = %.12e, l = %d, m = %d\n",
227 if (((
l +
m) % 2) == 0) {
234 XLAL_PRINT_INFO(
"In XLALSimIMRSpinEOBFluxGetSpinFactorizedWaveform: Hreal = %e, Slm = %e, eta = %e\n",
Hreal, Slm, eta);
243 hathatksq4 = 4. * hathatk * hathatk;
244 hathatk4pi = 4. *
LAL_PI * hathatk;
252 if (
status != GSL_SUCCESS) {
253 XLALPrintError(
"XLAL Error - %s: Error in GSL function\n", __func__);
262 Tlmprefac = sqrt(hathatk4pi / (1. - exp(-hathatk4pi))) /
z2.val;
265 for (Tlmprodfac = 1.,
i = 1;
i <=
l;
i++) {
266 Tlmprodfac *= (hathatksq4 + (
REAL8)
i *
i);
269 Tlm = Tlmprefac * sqrt(Tlmprodfac);
297 XLAL_PRINT_INFO(
"PK:: rho22v2 = %.12e, rho22v3 = %.12e, rho22v4 = %.12e,\n rho22v5 = %.16e, rho22v6 = %.16e, rho22v6LOG = %.16e, \n rho22v7 = %.12e, rho22v8 = %.16e, rho22v8LOG = %.16e, \n rho22v10 = %.16e, rho22v10LOG = %.16e\n, rho22v6 = %.12e, rho22v8 = %.12e, rho22v10 = %.12e\n",
308 rholm = 1. + v * (hCoeffs->
rho21v1
314 auxflm = v * hCoeffs->
f21v1 + v2 * v * hCoeffs->
f21v3;
328 auxflm = v * v2 * hCoeffs->
f33v3;
331 rholm = 1. + v * (hCoeffs->
rho32v
340 auxflm = v * v2 * hCoeffs->
f31v3;
351 rholm = 1. + v2 * (hCoeffs->
rho44v2
354 + hCoeffs->
rho44v6l * eulerlogxabs) * v))));
357 rholm = 1. + v * (hCoeffs->
rho43v
361 auxflm = v * hCoeffs->
f43v;
364 rholm = 1. + v2 * (hCoeffs->
rho42v2
369 rholm = 1. + v * (hCoeffs->
rho41v
373 auxflm = v * hCoeffs->
f41v;
383 rholm = 1. + v2 * (hCoeffs->
rho55v2
392 rholm = 1. + v2 * (hCoeffs->
rho53v2
400 rholm = 1. + v2 * (hCoeffs->
rho51v2
442 rholm = 1. + hCoeffs->
rho76v2 * v2;
448 rholm = 1. + hCoeffs->
rho74v2 * v2;
454 rholm = 1. + hCoeffs->
rho72v2 * v2;
467 rholm = 1. + hCoeffs->
rho88v2 * v2;
470 rholm = 1. + hCoeffs->
rho87v2 * v2;
473 rholm = 1. + hCoeffs->
rho86v2 * v2;
476 rholm = 1. + hCoeffs->
rho85v2 * v2;
479 rholm = 1. + hCoeffs->
rho84v2 * v2;
482 rholm = 1. + hCoeffs->
rho83v2 * v2;
485 rholm = 1. + hCoeffs->
rho82v2 * v2;
488 rholm = 1. + hCoeffs->
rho81v2 * v2;
517 if (eta == 0.25 &&
m % 2) {
523 if (
r > 0.0 && debugPK) {
524 XLAL_PRINT_INFO(
"YP::dynamics variables in waveform: %i, %i, r = %.12e, v = %.12e\n",
l,
m,
r, v);
525 XLAL_PRINT_INFO(
"rholm^l = %.16e, Tlm = %.16e + i %.16e, \nSlm = %.16e, hNewton = %.16e + i %.16e, delta = %.16e\n", rholmPwrl, Tlm, 0.0, Slm, creal(hNewton), cimag(hNewton), 0.0);
528 *hlm = Tlm * Slm * rholmPwrl;
563 REAL8 UNUSED
r ,
pp, Omega, v2, Omegav2, vh, vh3, k, hathatk, eulerlogxabs;
565 REAL8 UNUSED rcrossp_x, rcrossp_y, rcrossp_z;
568 REAL8 hathatksq4, hathatk4pi, Tlmprefac, Tlmprodfac;
586 eta =
params->eobParams->eta;
590 XLALPrintError(
"XLAL Error - %s: Eta seems to be > 0.25 - this isn't allowed!\n", __func__);
600 pp = values->data[3];
602 rcrossp_x = cartvalues->data[1] * cartvalues->data[5] - cartvalues->data[2] * cartvalues->data[4];
603 rcrossp_y = cartvalues->data[2] * cartvalues->data[3] - cartvalues->data[0] * cartvalues->data[5];
604 rcrossp_z = cartvalues->data[0] * cartvalues->data[4] - cartvalues->data[1] * cartvalues->data[3];
619 if (
params->alignedSpins) {
626 vPhi =
r * cbrt(vPhi);
629 XLAL_PRINT_INFO(
"In XLALSimIMRSpinEOBFluxCalculateNewtonianMultipole, getting rW = %.12e\n",
638 vPhi =
r * cbrt(vPhi);
641 XLAL_PRINT_INFO(
"In XLALSimIMRSpinEOBFluxCalculateNewtonianMultipole, getting rW = %.12e\n",
646 *hCoeffs = oldCoeffs;
652 XLAL_PRINT_INFO(
"\nValues inside XLALSimIMRSpinEOBFluxGetSpinFactorizedWaveform:\n");
653 for (
i = 0;
i < 11;
i++)
656 XLAL_PRINT_INFO(
"Calculating hNewton, with v = %.12e, vPhi = %.12e, r = %.12e, Phi = %.12e, l = %d, m = %d\n",
660 vPhi2,
r, cartvalues->data[12] + cartvalues->data[13], (
UINT4)
l,
m,
params->eobParams);
666 if (((
l +
m) % 2) == 0) {
673 XLAL_PRINT_INFO(
"In XLALSimIMRSpinEOBGetPrecSpinFactorizedWaveform: Hreal = %e, Slm = %e, eta = %e\n",
Hreal, Slm, eta);
683 gsl_sf_result lnr1, arg1;
685 if (
status != GSL_SUCCESS) {
686 XLALPrintError(
"XLAL Error - %s: Error in GSL function\n", __func__);
690 if (
status != GSL_SUCCESS) {
691 XLALPrintError(
"XLAL Error - %s: Error in GSL function\n", __func__);
694 Tlm = cexp((lnr1.val +
LAL_PI * hathatk) + I * (
695 arg1.val + 2.0 * hathatk * log(4.0 * k / sqrt(
LAL_E))));
700 hathatksq4 = 4. * hathatk * hathatk;
701 hathatk4pi = 4. *
LAL_PI * hathatk;
703 Tlmprefac = sqrt(hathatk4pi / (1. - exp(-hathatk4pi))) /
z2.val;
706 for (Tlmprodfac = 1.,
i = 1;
i <=
l;
i++)
707 Tlmprodfac *= (hathatksq4 + (
REAL8)
i *
i);
710 Tlmold = Tlmprefac * sqrt(Tlmprodfac);
711 XLAL_PRINT_INFO(
"Tlm = %e + i%e, |Tlm| = %.16e (should be %.16e)\n", creal(Tlm), cimag(Tlm), cabs(Tlm), Tlmold);
743 XLAL_PRINT_INFO(
"PK:: rho22v2 = %.12e, rho22v3 = %.12e, rho22v4 = %.12e,\n rho22v5 = %.16e, rho22v6 = %.16e, rho22v6LOG = %.16e, \n rho22v7 = %.12e, rho22v8 = %.16e, rho22v8LOG = %.16e, \n rho22v10 = %.16e, rho22v10LOG = %.16e\n, rho22v6 = %.12e, rho22v8 = %.12e, rho22v10 = %.12e\n",
757 rholm = 1. + v * (hCoeffs->
rho21v1
782 auxflm = v * (v2 * (hCoeffs->
f33v3 + v * (hCoeffs->
f33v4 + v * (hCoeffs->
f33v5 + v * hCoeffs->
f33v6)))) + _Complex_I * vh3 * vh3 * hCoeffs->
f33vh6;
787 rholm = 1. + v * (hCoeffs->
rho32v
799 auxflm = v * v2 * hCoeffs->
f31v3;
813 rholm = 1. + v2 * (hCoeffs->
rho44v2
820 rholm = 1. + v * (hCoeffs->
rho43v
824 auxflm = v * hCoeffs->
f43v;
828 rholm = 1. + v2 * (hCoeffs->
rho42v2
835 rholm = 1. + v * (hCoeffs->
rho41v
839 auxflm = v * hCoeffs->
f41v;
858 auxflm = v2 * v * (hCoeffs->
f55v3 + v * (hCoeffs->
f55v4 + v * (hCoeffs->
f55v5c) ));
867 rholm = 1. + v2 * (hCoeffs->
rho53v2
877 rholm = 1. + v2 * (hCoeffs->
rho51v2
927 rholm = 1. + hCoeffs->
rho76v2 * v2;
935 rholm = 1. + hCoeffs->
rho74v2 * v2;
943 rholm = 1. + hCoeffs->
rho72v2 * v2;
958 rholm = 1. + hCoeffs->
rho88v2 * v2;
962 rholm = 1. + hCoeffs->
rho87v2 * v2;
966 rholm = 1. + hCoeffs->
rho86v2 * v2;
970 rholm = 1. + hCoeffs->
rho85v2 * v2;
974 rholm = 1. + hCoeffs->
rho84v2 * v2;
978 rholm = 1. + hCoeffs->
rho83v2 * v2;
982 rholm = 1. + hCoeffs->
rho82v2 * v2;
986 rholm = 1. + hCoeffs->
rho81v2 * v2;
1000 XLAL_PRINT_INFO(
"rho_%d_%d = %.12e + %.12e \n",
l,
m, creal(rholm),cimag(rholm));
1002 XLAL_PRINT_INFO(
"exp(delta_%d_%d) = %.16e + i%.16e (abs=%e)\n",
l,
m, creal(cexp(I * deltalm)),
1003 cimag(cexp(I * deltalm)), cabs(cexp(I * deltalm)));
1018 if (eta == 0.25 &&
m % 2) {
1021 rholmPwrl += auxflm;
1027 if (
r > 0.0 && debugPK) {
1028 XLAL_PRINT_INFO(
"YP::dynamics variables in waveform: %i, %i, r = %.12e, v = %.12e\n",
l,
m,
r, v);
1029 XLAL_PRINT_INFO(
"rholm^l = %.16e + %.16e, Tlm = %.16e + i %.16e, \nSlm = %.16e, hNewton = %.16e + i %.16e, delta = %.16e\n", creal(rholmPwrl), cimag(rholmPwrl), creal(Tlm), cimag(Tlm), Slm, creal(hNewton), cimag(hNewton), 0.0);
1032 *hlm = Tlm * cexp(I * deltalm) * Slm * rholmPwrl;
1034 if (
r > 8.5 && debugPK) {
1035 XLAL_PRINT_INFO(
"YP::FullWave: %.16e,%.16e, %.16e\n", creal(*hlm), cimag(*hlm), cabs(*hlm));
1055 if (abs (modeM) > (
INT4) modeL)
1063 eta =
params->eobParams->eta;
1066 if (eta > 0.25 && eta < 0.25 +1
e-4) {
1072 (
"XLAL Error - %s: Eta seems to be > 0.25 - this isn't allowed!\n",
1079 switch (abs (modeM))
1121 auxflm = v * (hCoeffs->
f21v1 + v2 * (hCoeffs->
f21v3 + v * hCoeffs->
f21v4 + v2 * (hCoeffs->
f21v5 + v * hCoeffs->
f21v6)));
1143 eulerlogxabs)))))));
1144 auxflm = v * v2 * hCoeffs->
f33v3;
1148 1. + v * (hCoeffs->
rho32v +
1158 eulerlogxabs) * v2))))));
1171 eulerlogxabs) * v))))));
1172 auxflm = v * v2 * hCoeffs->
f31v3;
1183 rholm = 1. + v2 * (hCoeffs->
rho44v2
1199 1. + v * (hCoeffs->
rho43v +
1204 hCoeffs->
rho43v6l * eulerlogxabs) *
1206 auxflm = v * hCoeffs->
f43v;
1209 rholm = 1. + v2 * (hCoeffs->
rho42v2
1215 eulerlogxabs) * v))));
1219 1. + v * (hCoeffs->
rho41v +
1224 hCoeffs->
rho41v6l * eulerlogxabs) *
1226 auxflm = v * hCoeffs->
f41v;
1247 auxflm = v2 * v * (hCoeffs->
f55v3 + v * (hCoeffs->
f55v4));
1255 rholm = 1. + v2 * (hCoeffs->
rho53v2
1265 rholm = 1. + v2 * (hCoeffs->
rho51v2
1311 rholm = 1. + hCoeffs->
rho76v2 * v2;
1317 rholm = 1. + hCoeffs->
rho74v2 * v2;
1323 rholm = 1. + hCoeffs->
rho72v2 * v2;
1337 rholm = 1. + hCoeffs->
rho88v2 * v2;
1340 rholm = 1. + hCoeffs->
rho87v2 * v2;
1343 rholm = 1. + hCoeffs->
rho86v2 * v2;
1346 rholm = 1. + hCoeffs->
rho85v2 * v2;
1349 rholm = 1. + hCoeffs->
rho84v2 * v2;
1352 rholm = 1. + hCoeffs->
rho83v2 * v2;
1355 rholm = 1. + hCoeffs->
rho82v2 * v2;
1358 rholm = 1. + hCoeffs->
rho81v2 * v2;
1382 if (eta == 0.25 && modeM % 2)
1388 rholmPwrl += auxflm;
1390 *rholmpwrl = rholmPwrl;
1404 const REAL8 timeorb,
1415 REAL8Vector *timeVec = NULL, *hLMdivrholmVec = NULL;
1417 REAL8 valuesdata[14] = {0.};
1418 REAL8 polarDynamicsdata[4] = {0.};
1419 polarDynamics.
length = 4;
1421 polarDynamics.
data = polarDynamicsdata;
1422 values.
data = valuesdata;
1423 REAL8 omegaAttachmentPoint, hLMdivrholmAttachmentPoint, rholmNRAttachmentPoint,rholmBeforeCalibAttachmentPoint;
1434 REAL8 s1dotZ = 0, s2dotZ = 0, chi1dotZ = 0, chi2dotZ = 0;
1438 REAL8 spin1z_omegaPeak =
params->spin1z_omegaPeak;
1439 REAL8 spin2z_omegaPeak =
params->spin2z_omegaPeak;
1440 REAL8 chiS_omegaPeak = 0.5*(spin1z_omegaPeak+ spin2z_omegaPeak);
1441 REAL8 chiA_omegaPeak = 0.5*(spin1z_omegaPeak-spin2z_omegaPeak);
1452 if (!hLMVec || !rholmpwrlVec|| !timeVec|| !rholmpwrlVec || !rholmpwrlVecReal)
1460 gsl_spline *spline = NULL;
1461 gsl_interp_accel *acc = NULL;
1465 if (!((modeL == 2 && modeM == 1) || (modeL == 5 && modeM == 5)))
1467 XLALPrintError (
"Mode %d,%d is not supported by this function.\n", modeL,
1477 spline = gsl_spline_alloc (gsl_interp_cspline, orbOmegaVec.
length);
1478 acc = gsl_interp_accel_alloc ();
1481 gsl_spline_init (spline, timeVec->
data, orbOmegaVec.
data, orbOmegaVec.
length);
1482 gsl_interp_accel_reset (acc);
1483 omegaAttachmentPoint = gsl_spline_eval (spline, timewavePeak, acc);
1487 for (
UINT4 j=0; j<14; j++) {
1496 chi1dotZ = s1dotZ * mtot*mtot / (m1*m1);
1497 chi2dotZ = s2dotZ * mtot*mtot / (m2*m2);
1498 chiS = 0.5*(chi1dotZ+chi2dotZ);
1499 chiA = 0.5*(chi1dotZ-chi2dotZ);
1500 tplspin = (1.-2.*eta) * chiS + (m1 - m2)/(m1 + m2) * chiA;
1501 v = cbrt (orbOmegaVec.
data[
i]);
1504 XLALPrintError(
"XLAL Error - %s: failure in XLALSimIMREOBCalcSpinPrecFacWaveformCoefficients at step %d of the loop.\n", __func__,
i);
1509 XLALPrintError(
"XLAL Error - %s: failure in XLALSimIMRSpinEOBGetPrecSpinFactorizedWaveform at step %d of the loop.\n", __func__,
i);
1518 rholmpwrlVecReal->
data[
i] = (
REAL8)creal(rholmpwrlVec->data[
i]);
1519 hLMdivrholmVec->data[
i] = ((
REAL8)cabs(hLMVec->
data[
i]))/fabs(rholmpwrlVecReal->
data[
i]);
1521 gsl_spline_init (spline, timeVec->
data, hLMdivrholmVec->data, hLMdivrholmVec->length);
1522 gsl_interp_accel_reset (acc);
1523 hLMdivrholmAttachmentPoint = gsl_spline_eval (spline, timewavePeak, acc);
1526 if((fabs(nra/eta)< 3
e-2) && ((modeL == 2) && (modeM == 1))){
1528 nra = GSL_SIGN(nra)*eta*3
e-2;
1530 if((fabs(nra/eta)< 1
e-4) && ((modeL == 5) && (modeM == 5))){
1532 nra = GSL_SIGN(nra)*eta*1
e-4;
1534 rholmNRAttachmentPoint = nra/hLMdivrholmAttachmentPoint;
1535 gsl_spline_init (spline, timeVec->
data, rholmpwrlVecReal->
data, rholmpwrlVecReal->
length);
1536 gsl_interp_accel_reset (acc);
1538 rholmBeforeCalibAttachmentPoint = gsl_spline_eval (spline, timewavePeak, acc);
1540 FILE *timeomegapeak = NULL;
1541 timeomegapeak = fopen (
"timeomegapeak.dat",
"w");
1542 fprintf(timeomegapeak,
"%.16f\n", timewavePeak);
1543 fclose(timeomegapeak);
1545 if ((modeL == 2) && (modeM == 1))
1549 params->cal21 = (rholmNRAttachmentPoint - rholmBeforeCalibAttachmentPoint)/(pow(omegaAttachmentPoint,7./3.));
1552 if ((modeL == 5) && (modeM == 5))
1556 params->cal55 = (rholmNRAttachmentPoint - rholmBeforeCalibAttachmentPoint)/(pow(omegaAttachmentPoint,5./3.));
1561 gsl_spline_free (spline);
1562 gsl_interp_accel_free (acc);
static UNUSED REAL8 XLALSimIMREOBGetNRSpinPeakAmplitudeV4(INT4 modeL, INT4 modeM, REAL8 m1, REAL8 m2, REAL8 chiS, REAL8 chiA)
Peak amplitude predicted by fitting NR results The coefficients for the mode (2,2) are in Eq.
static UNUSED REAL8 XLALSimIMREOBGetNRSpinPeakDeltaTv4(INT4 UNUSED l, INT4 UNUSED m, REAL8 UNUSED m1, REAL8 UNUSED m2, REAL8 UNUSED chi1, REAL8 UNUSED chi2)
The time difference between the orbital peak and the peak amplitude of the mode in question (currentl...
static UNUSED int XLALSimIMRSpinEOBCalculateNewtonianMultipole(COMPLEX16 *multipole, REAL8 x, UNUSED REAL8 r, REAL8 phi, UINT4 l, INT4 m, EOBParams *params)
This function calculates the Newtonian multipole part of the factorized waveform for the SEOBNRv1 mod...
static UNUSED int XLALSimIMRSpinEOBFluxCalculateNewtonianMultipole(COMPLEX16 *multipole, REAL8 x, UNUSED REAL8 r, UNUSED REAL8 phi, UINT4 l, INT4 m, EOBParams *params)
This function calculates the Newtonian multipole part of the factorized waveform for the SEOBNRv1 mod...
static REAL8 XLALSimIMRSpinAlignedEOBNonKeplerCoeff(const REAL8 values[], SpinEOBParams *funcParams)
Function to calculate the non-Keplerian coefficient for the spin-aligned EOB model.
static UNUSED REAL8 XLALSimIMRSpinPrecEOBNonKeplerCoeff(const REAL8 values[], SpinEOBParams *funcParams)
Function to calculate the non-Keplerian coefficient for the PRECESSING EOB model.
static REAL8 UNUSED z2(REAL8 e0, REAL8 f0, REAL8 inc, REAL8 bet, REAL8 FPlus, REAL8 FCross)
#define XLAL_CALLGSL(statement)
COMPLEX16Vector * XLALCreateCOMPLEX16Vector(UINT4 length)
REAL8Vector * XLALCreateREAL8Vector(UINT4 length)
void XLALDestroyREAL8Vector(REAL8Vector *vector)
void XLALDestroyCOMPLEX16Vector(COMPLEX16Vector *vector)
#define XLAL_PRINT_INFO(...)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
#define XLAL_IS_REAL8_FAIL_NAN(val)
Structure the EOB dynamics for precessing waveforms.
Parameters for the spinning EOB model.