28 #include <lal/LALSimIMR.h>
29 #include <lal/LALConstants.h>
31 #include <lal/Units.h>
34 #include <gsl/gsl_linalg.h>
35 #include <gsl/gsl_complex.h>
36 #include <gsl/gsl_complex_math.h>
37 #include <gsl/gsl_roots.h>
39 #include <lal/XLALGSL.h>
40 #include <gsl/gsl_errno.h>
41 #include <gsl/gsl_spline.h>
44 #include <gsl/gsl_sf_legendre.h>
45 #include <gsl/gsl_sf_gamma.h>
47 #include <lal/LALSimInspiralPrecess.h>
57 typedef struct tagPhenomT_precomputed_sqrt
59 REAL8 sqrt2, sqrt2half, sqrt3, sqrt5, sqrt6, sqrt7,
sqrt10, sqrt14, sqrt15, sqrt21, sqrt30, sqrt35, sqrt70, sqrt210;
63 typedef struct tagPhenomTPWignerStruct
125 SQRT->
sqrt2 = sqrt(2.0);
127 SQRT->
sqrt3 = sqrt(3.0);
128 SQRT->
sqrt5 = sqrt(5.0);
129 SQRT->
sqrt6 = sqrt(6.0);
130 SQRT->
sqrt7 = sqrt(7.0);
131 SQRT->
sqrt10 = sqrt(10.0);
132 SQRT->
sqrt14 = sqrt(14.0);
133 SQRT->
sqrt15 = sqrt(15.0);
134 SQRT->
sqrt21 = sqrt(21.0);
135 SQRT->
sqrt30 = sqrt(30.0);
136 SQRT->
sqrt35 = sqrt(35.0);
137 SQRT->
sqrt70 = sqrt(70.0);
151 REAL8 cBetah = sqrt(0.5*fabs(1 + cosBeta));
152 REAL8 sBetah = sign*sqrt(0.5*fabs(1 - cosBeta));
154 REAL8 cBetah2 = cBetah * cBetah;
155 REAL8 cBetah3 = cBetah * cBetah2;
156 REAL8 cBetah4 = cBetah * cBetah3;
158 REAL8 sBetah2 = sBetah * sBetah;
159 REAL8 sBetah3 = sBetah * sBetah2;
160 REAL8 sBetah4 = sBetah * sBetah3;
162 REAL8 C2mS2 = cBetah2 - sBetah2;
164 REAL8 cBetah5, cBetah6, cBetah7, cBetah8, cBetah9, cBetah10;
165 REAL8 sBetah5, sBetah6, sBetah7, sBetah8, sBetah9, sBetah10;
167 cBetah5 = 0.0; cBetah6 = 0.0; cBetah7 = 0.0; cBetah8 = 0.0; cBetah9 = 0.0; cBetah10 = 0.0;
168 sBetah5 = 0.0; sBetah6 = 0.0; sBetah7 = 0.0; sBetah8 = 0.0; sBetah9 = 0.0; sBetah10 = 0.0;
173 REAL8 d22[5] = {sBetah4, 2.0*cBetah*sBetah3, SQRT->
sqrt6*sBetah2*cBetah2, 2.0*cBetah3*sBetah, cBetah4};
174 REAL8 d2m2[5] = {d22[4], -d22[3], d22[2], -d22[1], d22[0]};
176 REAL8 d21[5] = {2.0*cBetah*sBetah3, 3.0*cBetah2*sBetah2 - sBetah4, SQRT->
sqrt6*(cBetah3*sBetah - cBetah*sBetah3), cBetah2*(cBetah2 - 3.0*sBetah2), -2.0*cBetah3*sBetah};
177 REAL8 d2m1[5] = {-d21[4], d21[3], -d21[2], d21[1], -d21[0]};
192 cBetah5 = cBetah * cBetah4;
193 cBetah6 = cBetah * cBetah5;
195 sBetah5 = sBetah * sBetah4;
196 sBetah6 = sBetah * sBetah5;
198 REAL8 d33[7] = {sBetah6, SQRT->
sqrt6*cBetah*sBetah5, SQRT->
sqrt15*cBetah2*sBetah4, 2.0*SQRT->
sqrt5*cBetah3*sBetah3, SQRT->
sqrt15*cBetah4*sBetah2, SQRT->
sqrt6*cBetah5*sBetah, cBetah6};
199 REAL8 d3m3[7] = {d33[6], -d33[5], d33[4], -d33[3], d33[2], -d33[1], d33[0]};
217 cBetah5 = cBetah * cBetah4;
218 cBetah6 = cBetah * cBetah5;
219 cBetah7 = cBetah * cBetah6;
220 cBetah8 = cBetah * cBetah7;
222 sBetah5 = sBetah * sBetah4;
223 sBetah6 = sBetah * sBetah5;
224 sBetah7 = sBetah * sBetah6;
225 sBetah8 = sBetah * sBetah7;
227 REAL8 d33[7] = {sBetah6, SQRT->
sqrt6*cBetah*sBetah5, SQRT->
sqrt15*cBetah2*sBetah4, 2.0*SQRT->
sqrt5*cBetah3*sBetah3, SQRT->
sqrt15*cBetah4*sBetah2, SQRT->
sqrt6*cBetah5*sBetah, cBetah6};
228 REAL8 d3m3[7] = {d33[6], -d33[5], d33[4], -d33[3], d33[2], -d33[1], d33[0]};
230 REAL8 d44[9] = {sBetah8, 2.0*SQRT->
sqrt2*cBetah*sBetah7, 2.0*SQRT->
sqrt7*cBetah2*sBetah6, 2.0*SQRT->
sqrt14*cBetah3*sBetah5, SQRT->
sqrt70*cBetah4*sBetah4, 2.0*SQRT->
sqrt14*cBetah5*sBetah3, 2.0*SQRT->
sqrt7*cBetah6*sBetah2, 2.0*sqrt(2)*cBetah7*sBetah, cBetah8};
231 REAL8 d4m4[9] = {d44[8], -d44[7], d44[6], -d44[5], d44[4], -d44[3], d44[2], -d44[1], d44[0]};
260 cBetah5 = cBetah * cBetah4;
261 cBetah6 = cBetah * cBetah5;
262 cBetah7 = cBetah * cBetah6;
263 cBetah8 = cBetah * cBetah7;
264 cBetah9 = cBetah * cBetah8;
265 cBetah10 = cBetah * cBetah9;
267 sBetah5 = sBetah * sBetah4;
268 sBetah6 = sBetah * sBetah5;
269 sBetah7 = sBetah * sBetah6;
270 sBetah8 = sBetah * sBetah7;
271 sBetah9 = sBetah * sBetah8;
272 sBetah10 = sBetah * sBetah9;
274 REAL8 d33[7] = {sBetah6, SQRT->
sqrt6*cBetah*sBetah5, SQRT->
sqrt15*cBetah2*sBetah4, 2.0*SQRT->
sqrt5*cBetah3*sBetah3, SQRT->
sqrt15*cBetah4*sBetah2, SQRT->
sqrt6*cBetah5*sBetah, cBetah6};
275 REAL8 d3m3[7] = {d33[6], -d33[5], d33[4], -d33[3], d33[2], -d33[1], d33[0]};
277 REAL8 d44[9] = {sBetah8, 2.0*SQRT->
sqrt2*cBetah*sBetah7, 2.0*SQRT->
sqrt7*cBetah2*sBetah6, 2.0*SQRT->
sqrt14*cBetah3*sBetah5, SQRT->
sqrt70*cBetah4*sBetah4, 2.0*SQRT->
sqrt14*cBetah5*sBetah3, 2.0*SQRT->
sqrt7*cBetah6*sBetah2, 2.0*sqrt(2)*cBetah7*sBetah, cBetah8};
278 REAL8 d4m4[9] = {d44[8], -d44[7], d44[6], -d44[5], d44[4], -d44[3], d44[2], -d44[1], d44[0]};
280 REAL8 d55[11] = {sBetah10, SQRT->
sqrt10*cBetah*sBetah9, 3*SQRT->
sqrt5*cBetah2*sBetah8, 2*SQRT->
sqrt30*cBetah3*sBetah7, SQRT->
sqrt210*cBetah4*sBetah6, 6.0*SQRT->
sqrt7*cBetah5*sBetah5,\
281 SQRT->sqrt210*cBetah6*sBetah4, 2*SQRT->
sqrt30*cBetah7*sBetah3, 3*SQRT->
sqrt5*cBetah8*sBetah2, SQRT->
sqrt10*cBetah9*sBetah, cBetah10};
282 REAL8 d5m5[11] = {d55[10], -d55[9], d55[8], -d55[7], d55[6], -d55[5], d55[4], -d55[3], d55[2], -d55[1], d55[0]};
329 UNUSED
REAL8 sinBeta = sign*sqrt(fabs(1.0 - cosBeta*cosBeta));
331 UNUSED
REAL8 cos2Beta = cosBeta*cosBeta - sinBeta*sinBeta;
332 UNUSED
REAL8 cos3Beta = cosBeta*(2.0*cos2Beta - 1.0);
333 UNUSED
REAL8 cos4Beta = pow(sinBeta,4) + pow(cosBeta,4) - 6.0*sinBeta*sinBeta*cosBeta*cosBeta;
339 REAL8 d20[5] = {SQRT->
sqrt6*cBetah2*sBetah2 , SQRT->
sqrt6*cBetah*sBetah*C2mS2 , 0.25*(1 + 3*(-4*cBetah2*sBetah2 + pow(C2mS2,2))) , -SQRT->
sqrt6*cBetah*sBetah*C2mS2 , SQRT->
sqrt6*cBetah2*sBetah2};
349 REAL8 d20[5] = {SQRT->
sqrt6*cBetah2*sBetah2 , SQRT->
sqrt6*cBetah*sBetah*C2mS2 , 0.25*(1 + 3*(-4*cBetah2*sBetah2 + pow(C2mS2,2))) , -SQRT->
sqrt6*cBetah*sBetah*C2mS2 , SQRT->
sqrt6*cBetah2*sBetah2};
351 REAL8 d32[7] = {SQRT->
sqrt6*cBetah*sBetah5, sBetah4*(5.0*cBetah2 - sBetah2), SQRT->
sqrt10*sBetah3*(2.0*cBetah3 - cBetah*sBetah2), SQRT->
sqrt30*cBetah2*(cBetah2 - sBetah2)*sBetah2, SQRT->
sqrt10*cBetah3*(cBetah2*sBetah - 2.0*sBetah3), cBetah4*(cBetah2 - 5.0*sBetah2), -SQRT->
sqrt6*cBetah5*sBetah};
352 REAL8 d3m2[7] = {-d32[6],d32[5],-d32[4],d32[3],-d32[2],d32[1],-d32[0]};
354 REAL8 d31[7] = {SQRT->
sqrt15*cBetah2*sBetah4, SQRT->
sqrt2half*cBetah*sBetah3*(1 + 3.0*C2mS2), 0.125*sBetah2*(13.0 + 20.0*C2mS2 + 15.0*(C2mS2*C2mS2 - 4.0*cBetah2*sBetah2)), 0.25*SQRT->
sqrt3*cBetah*sBetah*(3.0 + 5.0*(C2mS2*C2mS2 - 4.0*cBetah2*sBetah2)),\
355 0.125*cBetah2*(13.0 - 20.0*C2mS2 + 15.0*(C2mS2*C2mS2 - 4.0*cBetah2*sBetah2)), -SQRT->
sqrt2half*cBetah3*sBetah*(-1.0 + 3.0*C2mS2), SQRT->
sqrt15*cBetah4*sBetah2};
356 REAL8 d3m1[7] = {d31[6], -d31[5], d31[4], -d31[3], d31[2], -d31[1], d31[0]};
358 REAL8 d30[7] = {2.0*SQRT->
sqrt5*cBetah3*sBetah3, SQRT->
sqrt30*cBetah2*sBetah2*C2mS2, 0.25*SQRT->
sqrt3*cBetah*sBetah*(3.0 + 5.0*(C2mS2*C2mS2 - 4.0*cBetah2*sBetah2)), 0.125*(5.0*cos3Beta + 3*C2mS2),\
359 -0.25*SQRT->
sqrt3*cBetah*sBetah*(3.0 + 5.0*(C2mS2*C2mS2 - 4.0*cBetah2*sBetah2)), SQRT->
sqrt30*cBetah2*sBetah2*C2mS2, -2.0*SQRT->
sqrt5*cBetah3*sBetah3};
376 REAL8 d20[5] = {SQRT->
sqrt6*cBetah2*sBetah2 , SQRT->
sqrt6*cBetah*sBetah*C2mS2 , 0.25*(1 + 3*(-4*cBetah2*sBetah2 + pow(C2mS2,2))) , -SQRT->
sqrt6*cBetah*sBetah*C2mS2 , SQRT->
sqrt6*cBetah2*sBetah2};
378 REAL8 d32[7] = {SQRT->
sqrt6*cBetah*sBetah5, sBetah4*(5.0*cBetah2 - sBetah2), SQRT->
sqrt10*sBetah3*(2.0*cBetah3 - cBetah*sBetah2), SQRT->
sqrt30*cBetah2*(cBetah2 - sBetah2)*sBetah2, SQRT->
sqrt10*cBetah3*(cBetah2*sBetah - 2.0*sBetah3), cBetah4*(cBetah2 - 5.0*sBetah2), -SQRT->
sqrt6*cBetah5*sBetah};
379 REAL8 d3m2[7] = {-d32[6],d32[5],-d32[4],d32[3],-d32[2],d32[1],-d32[0]};
381 REAL8 d31[7] = {SQRT->
sqrt15*cBetah2*sBetah4, SQRT->
sqrt2half*cBetah*sBetah3*(1 + 3.0*C2mS2), 0.125*sBetah2*(13.0 + 20.0*C2mS2 + 15.0*(C2mS2*C2mS2 - 4.0*cBetah2*sBetah2)), 0.25*SQRT->
sqrt3*cBetah*sBetah*(3.0 + 5.0*(C2mS2*C2mS2 - 4.0*cBetah2*sBetah2)),\
382 0.125*cBetah2*(13.0 - 20.0*C2mS2 + 15.0*(C2mS2*C2mS2 - 4.0*cBetah2*sBetah2)), -SQRT->
sqrt2half*cBetah3*sBetah*(-1.0 + 3.0*C2mS2), SQRT->
sqrt15*cBetah4*sBetah2};
383 REAL8 d3m1[7] = {d31[6], -d31[5], d31[4], -d31[3], d31[2], -d31[1], d31[0]};
385 REAL8 d30[7] = {2.0*SQRT->
sqrt5*cBetah3*sBetah3, SQRT->
sqrt30*cBetah2*sBetah2*C2mS2, 0.25*SQRT->
sqrt3*cBetah*sBetah*(3.0 + 5.0*(C2mS2*C2mS2 - 4.0*cBetah2*sBetah2)), 0.125*(5.0*cos3Beta + 3*C2mS2),\
386 -0.25*SQRT->
sqrt3*cBetah*sBetah*(3.0 + 5.0*(C2mS2*C2mS2 - 4.0*cBetah2*sBetah2)), SQRT->
sqrt30*cBetah2*sBetah2*C2mS2, -2.0*SQRT->
sqrt5*cBetah3*sBetah3};
388 REAL8 d43[9] = {2*SQRT->
sqrt2*cBetah*sBetah7, 7*cBetah2*sBetah6-sBetah8, SQRT->
sqrt14*(3*cBetah3*sBetah5-cBetah*sBetah7), SQRT->
sqrt7*(5*cBetah4*sBetah4-3*cBetah2*sBetah6),\
389 2*5.916079783099616*(cBetah5*sBetah3-cBetah3*sBetah5), SQRT->
sqrt7*(3*cBetah6*sBetah2-5*cBetah4*sBetah4), SQRT->
sqrt14*(cBetah7*sBetah-3*cBetah5*sBetah3), cBetah8-7*cBetah6*sBetah2, -2.*SQRT->
sqrt2*cBetah7*sBetah};
390 REAL8 d4m3[9] = {-d43[8], d43[7], -d43[6], d43[5],-d43[4],d43[3], -d43[2], d43[1], -d43[0]};
392 REAL8 d42[9] = {2*SQRT->
sqrt7*cBetah2*sBetah6, SQRT->
sqrt14*cBetah*sBetah5*(1.0 +2.0*C2mS2), sBetah4*(1.0 + 7.0*C2mS2 + 7.0*C2mS2*C2mS2), 0.5*SQRT->
sqrt2*cBetah*sBetah3*(6.0 + 7.0*cos2Beta + 7.0*C2mS2),\
393 0.5*SQRT->
sqrt2half*cBetah2*(5.0 + 7.0*cos2Beta)*sBetah2, 0.5*SQRT->
sqrt2*cBetah3*sBetah*(6.0 + 7.0*cos2Beta - 7.0*C2mS2), cBetah4*(1.0 - 7.0*C2mS2 + 7.0*C2mS2*C2mS2), -SQRT->
sqrt14*cBetah5*sBetah*(-1.0 +2.0*C2mS2), 2*SQRT->
sqrt7*cBetah6*sBetah2};
394 REAL8 d4m2[9] = {d42[8], -d42[7], d42[6], -d42[5], d42[4], -d42[3], d42[2], -d42[1], d42[0]};
396 REAL8 d41[9] = {2*SQRT->
sqrt14*cBetah3*sBetah5, SQRT->
sqrt7*cBetah2*sBetah4*(1.0 + 4.0*C2mS2), 0.5*SQRT->
sqrt2*cBetah*sBetah3*(6.0 + 7.0*cos2Beta + 7.0*C2mS2), 0.125*sBetah2*(15.0 +21.0*cos2Beta + 14.0*cos3Beta + 30.0*C2mS2),\
397 0.125*SQRT->
sqrt5*cBetah*sBetah*(7.0*cos3Beta + 9.0*C2mS2), 0.125*cBetah2*(-15.0 + 30*cosBeta - 21.0*cos2Beta + 14.0*cos3Beta), 0.5*SQRT->
sqrt2*cBetah3*sBetah*(-6.0 - 7.0*cos2Beta + 7.0*C2mS2),\
398 SQRT->sqrt7*cBetah4*sBetah2*(-1.0 + 4.0*C2mS2), -2*SQRT->
sqrt14*cBetah5*sBetah3};
399 REAL8 d4m1[9] = {-d41[8], d41[7], -d41[6], d41[5], -d41[4], d41[3], -d41[2], d41[1], -d41[0]};
401 REAL8 d40[9] = {SQRT->
sqrt70*cBetah4*sBetah4, 2*SQRT->
sqrt35*cBetah3*sBetah3*C2mS2, 0.5*SQRT->
sqrt2half*cBetah2*(5. + 7.*cos2Beta)*sBetah2, 0.125*SQRT->
sqrt5*cBetah*sBetah*(7.*cos3Beta + 9.*C2mS2),\
402 0.015625*(9 + 20.*cos2Beta + 35.*cos4Beta), -0.125*SQRT->
sqrt5*cBetah*sBetah*(7.*cos3Beta + 9.*C2mS2), 0.5*SQRT->
sqrt2half*cBetah2*(5. + 7.*cos2Beta)*sBetah2, -2.*SQRT->
sqrt35*cBetah3*sBetah3*C2mS2, SQRT->
sqrt70*cBetah4*sBetah4};
428 REAL8 d20[5] = {SQRT->
sqrt6*cBetah2*sBetah2 , SQRT->
sqrt6*cBetah*sBetah*C2mS2 , 0.25*(1 + 3*(-4*cBetah2*sBetah2 + pow(C2mS2,2))) , -SQRT->
sqrt6*cBetah*sBetah*C2mS2 , SQRT->
sqrt6*cBetah2*sBetah2};
430 REAL8 d32[7] = {SQRT->
sqrt6*cBetah*sBetah5, sBetah4*(5.0*cBetah2 - sBetah2), SQRT->
sqrt10*sBetah3*(2.0*cBetah3 - cBetah*sBetah2), SQRT->
sqrt30*cBetah2*(cBetah2 - sBetah2)*sBetah2, SQRT->
sqrt10*cBetah3*(cBetah2*sBetah - 2.0*sBetah3), cBetah4*(cBetah2 - 5.0*sBetah2), -SQRT->
sqrt6*cBetah5*sBetah};
431 REAL8 d3m2[7] = {-d32[6],d32[5],-d32[4],d32[3],-d32[2],d32[1],-d32[0]};
433 REAL8 d31[7] = {SQRT->
sqrt15*cBetah2*sBetah4, SQRT->
sqrt2half*cBetah*sBetah3*(1 + 3.0*C2mS2), 0.125*sBetah2*(13.0 + 20.0*C2mS2 + 15.0*(C2mS2*C2mS2 - 4.0*cBetah2*sBetah2)), 0.25*SQRT->
sqrt3*cBetah*sBetah*(3.0 + 5.0*(C2mS2*C2mS2 - 4.0*cBetah2*sBetah2)),\
434 0.125*cBetah2*(13.0 - 20.0*C2mS2 + 15.0*(C2mS2*C2mS2 - 4.0*cBetah2*sBetah2)), -SQRT->
sqrt2half*cBetah3*sBetah*(-1.0 + 3.0*C2mS2), SQRT->
sqrt15*cBetah4*sBetah2};
435 REAL8 d3m1[7] = {d31[6], -d31[5], d31[4], -d31[3], d31[2], -d31[1], d31[0]};
437 REAL8 d30[7] = {2.0*SQRT->
sqrt5*cBetah3*sBetah3, SQRT->
sqrt30*cBetah2*sBetah2*C2mS2, 0.25*SQRT->
sqrt3*cBetah*sBetah*(3.0 + 5.0*(C2mS2*C2mS2 - 4.0*cBetah2*sBetah2)), 0.125*(5.0*cos3Beta + 3*C2mS2),\
438 -0.25*SQRT->
sqrt3*cBetah*sBetah*(3.0 + 5.0*(C2mS2*C2mS2 - 4.0*cBetah2*sBetah2)), SQRT->
sqrt30*cBetah2*sBetah2*C2mS2, -2.0*SQRT->
sqrt5*cBetah3*sBetah3};
440 REAL8 d43[9] = {2*SQRT->
sqrt2*cBetah*sBetah7, 7*cBetah2*sBetah6-sBetah8, SQRT->
sqrt14*(3*cBetah3*sBetah5-cBetah*sBetah7), SQRT->
sqrt7*(5*cBetah4*sBetah4-3*cBetah2*sBetah6),\
441 2*5.916079783099616*(cBetah5*sBetah3-cBetah3*sBetah5), SQRT->
sqrt7*(3*cBetah6*sBetah2-5*cBetah4*sBetah4), SQRT->
sqrt14*(cBetah7*sBetah-3*cBetah5*sBetah3), cBetah8-7*cBetah6*sBetah2, -2.*SQRT->
sqrt2*cBetah7*sBetah};
442 REAL8 d4m3[9] = {-d43[8], d43[7], -d43[6], d43[5],-d43[4],d43[3], -d43[2], d43[1], -d43[0]};
444 REAL8 d42[9] = {2*SQRT->
sqrt7*cBetah2*sBetah6, SQRT->
sqrt14*cBetah*sBetah5*(1.0 +2.0*C2mS2), sBetah4*(1.0 + 7.0*C2mS2 + 7.0*C2mS2*C2mS2), 0.5*SQRT->
sqrt2*cBetah*sBetah3*(6.0 + 7.0*cos2Beta + 7.0*C2mS2),\
445 0.5*SQRT->
sqrt2half*cBetah2*(5.0 + 7.0*cos2Beta)*sBetah2, 0.5*SQRT->
sqrt2*cBetah3*sBetah*(6.0 + 7.0*cos2Beta - 7.0*C2mS2), cBetah4*(1.0 - 7.0*C2mS2 + 7.0*C2mS2*C2mS2), -SQRT->
sqrt14*cBetah5*sBetah*(-1.0 +2.0*C2mS2), 2*SQRT->
sqrt7*cBetah6*sBetah2};
446 REAL8 d4m2[9] = {d42[8], -d42[7], d42[6], -d42[5], d42[4], -d42[3], d42[2], -d42[1], d42[0]};
448 REAL8 d41[9] = {2*SQRT->
sqrt14*cBetah3*sBetah5, SQRT->
sqrt7*cBetah2*sBetah4*(1.0 + 4.0*C2mS2), 0.5*SQRT->
sqrt2*cBetah*sBetah3*(6.0 + 7.0*cos2Beta + 7.0*C2mS2), 0.125*sBetah2*(15.0 +21.0*cos2Beta + 14.0*cos3Beta + 30.0*C2mS2),\
449 0.125*SQRT->
sqrt5*cBetah*sBetah*(7.0*cos3Beta + 9.0*C2mS2), 0.125*cBetah2*(-15.0 + 30*cosBeta - 21.0*cos2Beta + 14.0*cos3Beta), 0.5*SQRT->
sqrt2*cBetah3*sBetah*(-6.0 - 7.0*cos2Beta + 7.0*C2mS2),\
450 SQRT->sqrt7*cBetah4*sBetah2*(-1.0 + 4.0*C2mS2), -2*SQRT->
sqrt14*cBetah5*sBetah3};
451 REAL8 d4m1[9] = {-d41[8], d41[7], -d41[6], d41[5], -d41[4], d41[3], -d41[2], d41[1], -d41[0]};
453 REAL8 d40[9] = {SQRT->
sqrt70*cBetah4*sBetah4, 2*SQRT->
sqrt35*cBetah3*sBetah3*C2mS2, 0.5*SQRT->
sqrt2half*cBetah2*(5. + 7.*cos2Beta)*sBetah2, 0.125*SQRT->
sqrt5*cBetah*sBetah*(7.*cos3Beta + 9.*C2mS2),\
454 0.015625*(9 + 20.*cos2Beta + 35.*cos4Beta), -0.125*SQRT->
sqrt5*cBetah*sBetah*(7.*cos3Beta + 9.*C2mS2), 0.5*SQRT->
sqrt2half*cBetah2*(5. + 7.*cos2Beta)*sBetah2, -2.*SQRT->
sqrt35*cBetah3*sBetah3*C2mS2, SQRT->
sqrt70*cBetah4*sBetah4};
456 REAL8 d54[11] = {SQRT->
sqrt10*cBetah*sBetah9, sBetah8*(4.0 + 5.0*C2mS2), (3./sqrt(2))*cBetah*sBetah7*(3.0 +5.0*C2mS2), 2.0*SQRT->
sqrt3*cBetah2*sBetah6*(2.0 + 5.0*C2mS2), SQRT->
sqrt21*cBetah3*sBetah5*(1.0 + 5.0*C2mS2),\
457 3.0*SQRT->
sqrt70*cBetah4*sBetah4*C2mS2, SQRT->
sqrt21*cBetah5*sBetah3*(-1.0 + 5.0*C2mS2), 2.0*SQRT->
sqrt3*cBetah6*sBetah2*(-2.0 + 5.0*C2mS2), (3./sqrt(2))*cBetah7*sBetah*(-3.0 +5.0*C2mS2), cBetah8*(-4.0 + 5.0*C2mS2), -SQRT->
sqrt10*cBetah9*sBetah};
458 REAL8 d5m4[11] = {-d54[10], d54[9], -d54[8], d54[7], -d54[6], d54[5], -d54[4], d54[3], -d54[2], d54[1], -d54[0]};
460 REAL8 d53[11] = {3.0*SQRT->
sqrt5*cBetah2*sBetah8, (3.0/SQRT->
sqrt2)*cBetah*sBetah7*(3.0+5.0*C2mS2), 0.25*(13.0 + 54.0*C2mS2 + 45.0*C2mS2*C2mS2)*sBetah6, sqrt(1.5)*(1.0+12.0*C2mS2+15.0*C2mS2*C2mS2)*cBetah*sBetah5, 0.5*sqrt(10.5)*(-1.0+6.0*C2mS2+15.0*C2mS2*C2mS2)*cBetah2*sBetah4,\
461 0.25*SQRT->
sqrt35*(7.0 + 9.0*cos2Beta)*cBetah3*sBetah3, 0.5*sqrt(10.5)*(-1.0-6.0*C2mS2+15.0*C2mS2*C2mS2)*cBetah4*sBetah2, sqrt(1.5)*(1.0-12.0*C2mS2+15.0*C2mS2*C2mS2)*cBetah5*sBetah, 0.25*(13.0 - 54.0*C2mS2 + 45.0*C2mS2*C2mS2)*cBetah6, (3.0/SQRT->
sqrt2)*cBetah7*sBetah*(3.0-5.0*C2mS2), 3.0*SQRT->
sqrt5*cBetah8*sBetah2};
462 REAL8 d5m3[11] = {d53[10], -d53[9], d53[8], -d53[7], d53[6], -d53[5], d53[4], -d53[3], d53[2], -d53[1], d53[0]};
464 REAL8 d52[11] = {2*SQRT->
sqrt30*cBetah3*sBetah7, 2.0*SQRT->
sqrt3*(2.0+5.0*C2mS2)*cBetah2*sBetah6, sqrt(1.5)*(1.0+12.0*C2mS2+15.0*C2mS2*C2mS2)*cBetah*sBetah5, (-1.0+3.0*C2mS2+18.0*C2mS2*C2mS2+15.0*C2mS2*C2mS2*C2mS2)*sBetah4,\
465 0.5*SQRT->
sqrt7*(-1.0-3.0*C2mS2+9.0*C2mS2*C2mS2+15.0*C2mS2*C2mS2*C2mS2)*cBetah*sBetah3, 0.5*sqrt(52.5)*C2mS2*cBetah2*sBetah2*(1.0+3.0*cos2Beta), 0.5*SQRT->
sqrt7*(1.0-3.0*C2mS2-9.0*C2mS2*C2mS2+15.0*C2mS2*C2mS2*C2mS2)*cBetah3*sBetah,\
466 (1.0+3.0*C2mS2-18.0*C2mS2*C2mS2+15.0*C2mS2*C2mS2*C2mS2)*cBetah4, -sqrt(1.5)*(1.0-12.0*C2mS2+15.0*C2mS2*C2mS2)*cBetah5*sBetah, 2.0*SQRT->
sqrt3*(-2.0+5.0*C2mS2)*cBetah6*sBetah2, -2*SQRT->
sqrt30*cBetah7*sBetah3};
467 REAL8 d5m2[11] = {-d52[10], d52[9], -d52[8], d52[7], -d52[6], d52[5], -d52[4], d52[3], -d52[2], d52[1], -d52[0]};
469 REAL8 d51[11] = {SQRT->
sqrt210*cBetah4*sBetah6, SQRT->
sqrt21*(1.0+5.0*C2mS2)*cBetah3*sBetah5, 0.5*sqrt(10.5)*(-1.0+6.0*C2mS2+15.0*C2mS2*C2mS2)*cBetah2*sBetah4,\
470 0.5*SQRT->
sqrt7*(-1.0-3.0*C2mS2+9.0*C2mS2*C2mS2+15.0*C2mS2*C2mS2*C2mS2)*cBetah*sBetah3, 0.125*(1.0-28.0*C2mS2-42.0*C2mS2*C2mS2+84.0*C2mS2*C2mS2*C2mS2+105.0*C2mS2*C2mS2*C2mS2*C2mS2)*sBetah2,\
471 sqrt(7.5)/32.0*cBetah*sBetah*(15.0 + 28.0*cos2Beta + 21.0*cos4Beta), 0.125*(1.0+28.0*C2mS2-42.0*C2mS2*C2mS2-84.0*C2mS2*C2mS2*C2mS2+105.0*C2mS2*C2mS2*C2mS2*C2mS2)*cBetah2,\
472 -0.5*SQRT->
sqrt7*(1.0-3.0*C2mS2-9.0*C2mS2*C2mS2+15.0*C2mS2*C2mS2*C2mS2)*cBetah3*sBetah, 0.5*sqrt(10.5)*(-1.0-6.0*C2mS2+15.0*C2mS2*C2mS2)*cBetah4*sBetah2,\
473 -SQRT->
sqrt21*(-1.0+5.0*C2mS2)*cBetah5*sBetah3, SQRT->
sqrt210*cBetah6*sBetah4};
474 REAL8 d5m1[11] = {d51[10], -d51[9], d51[8], -d51[7], d51[6], -d51[5], d51[4], -d51[3], d51[2], -d51[1], d51[0]};
476 REAL8 d50[11] = {6.0*SQRT->
sqrt7*cBetah5*sBetah5, 3.0*SQRT->
sqrt70*C2mS2*cBetah4*sBetah4, 0.25*SQRT->
sqrt35*cBetah3*sBetah3*(7.0+9.0*cos2Beta), 0.5*sqrt(52.2)*C2mS2*cBetah2*sBetah2*(1.0+3.0*cos2Beta),\
477 sqrt(7.5)/32.0*cBetah*sBetah*(15.0+28.0*cos2Beta+21.0*cos4Beta), 0.125*C2mS2*(15.0-70.0*C2mS2*C2mS2+63.0*C2mS2*C2mS2*C2mS2*C2mS2), -sqrt(7.5)/32.0*cBetah*sBetah*(15.0+28.0*cos2Beta+21.0*cos4Beta),\
478 0.5*sqrt(52.2)*C2mS2*cBetah2*sBetah2*(1.0+3.0*cos2Beta), -0.25*SQRT->
sqrt35*cBetah3*sBetah3*(7.0+9.0*cos2Beta), 3.0*SQRT->
sqrt70*C2mS2*cBetah4*sBetah4, -6.0*SQRT->
sqrt7*cBetah5*sBetah5};
600 complex
double *x_lm =
XLALCalloc( 2*lmax+1,
sizeof(complex
double) );
603 for(
i=0;
i<
alpha->data->length;
i++){
607 for(
l=2;
l<=lmax;
l++){
608 for(
m=0;
m<2*
l+1;
m++){
618 for(
m=0;
m<2*
l+1;
m++){
619 for(mp=0; mp<2*
l+1; mp++){
620 if( !h_xx[
m] )
continue;
621 if(!(creal(h_xx[
m]->
data->data[
i])==0 && creal(x_lm[mp])==0)) {
652 complex
double *x_lm =
XLALCalloc( 2*lmax+1,
sizeof(complex
double) );
659 COMPLEX16 wigner[lmax-1][2*lmax+1][2*lmax+1];
661 for(
l=2;
l<=lmax;
l++){
662 for(
m=0;
m<2*
l+1;
m++){
663 for(mp=0; mp<2*
l+1; mp++){
669 for(
i=0;
i<length;
i++){
670 for(
l=2;
l<=lmax;
l++){
671 for(
m=0;
m<2*
l+1;
m++){
681 for(
m=0;
m<2*
l+1;
m++){
682 for(mp=0; mp<2*
l+1; mp++){
683 if( !h_xx[
m] )
continue;
684 if(!(creal(h_xx[
m]->
data->data[
i])==0 && creal(x_lm[mp])==0)) {
685 h_xx[
m]->
data->
data[
i] += x_lm[mp] * wigner[
l-2][mp][
m];
int PhenomTPHM_RotateModes_Global(SphHarmTimeSeries *h_lm, REAL8 alpha, REAL8 cosbeta, REAL8 gam, size_t length, PhenomT_precomputed_sqrt *SQRT)
void IMRPhenomTPHM_SetPrecomputedSqrt(PhenomT_precomputed_sqrt *SQRT)
int PhenomTPHM_RotateModes(SphHarmTimeSeries *h_lm, REAL8TimeSeries *alpha, REAL8TimeSeries *cosbeta, REAL8TimeSeries *gam, PhenomT_precomputed_sqrt *SQRT)
COMPLEX16 PhenomTWignerDMatrix(int l, int mp, int m, PhenomTPWignerStruct *wS)
void IMRPhenomTPHM_SetWignerDStruct(PhenomTPWignerStruct *wS, PhenomT_precomputed_sqrt *SQRT, REAL8 cosBeta, REAL8 alpha, REAL8 gamma, INT4 LMAX, INT4 sign, UINT4 globalRot)
void * XLALCalloc(size_t m, size_t n)
void * XLALMalloc(size_t n)
COMPLEX16TimeSeries * XLALSphHarmTimeSeriesGetMode(SphHarmTimeSeries *ts, UINT4 l, INT4 m)
Get the time series of a waveform's (l,m) spherical harmonic mode from a SphHarmTimeSeries linked lis...
UINT4 XLALSphHarmTimeSeriesGetMaxL(SphHarmTimeSeries *ts)
Get the largest l index of any mode in the SphHarmTimeSeries linked list.
COMPLEX16 expAlphaPowers[11]
COMPLEX16 expGammaPowers[11]
Structure to carry a collection of spherical harmonic modes in COMPLEX16 time series.