72 dl = (
double*)calloc(L*L,
sizeof(
double));
76 dl = (
double*)calloc((L+2)*(L+2),
sizeof(
double));
80 dl = (
double*)calloc(L*(2*L-1),
sizeof(double));
84 dl = (
double*)calloc((2*L-1)*(2*L-1),
sizeof(
double));
192 int el,
double *sqrt_tbl) {
195 double cosb, sinb, coshb, sinhb;
207 dl[(0+offset)*stride + 0 + offset] = 1.0;
214 coshb = cos(beta / 2.0);
215 sinhb = sin(beta / 2.0);
217 dl[(-1 + offset)*stride - 1 + offset] = coshb * coshb;
218 dl[(-1 + offset)*stride + 0 + offset] = sinb /
SSHT_SQRT2;
219 dl[(-1 + offset)*stride + 1 + offset] = sinhb * sinhb;
221 dl[(0 + offset)*stride - 1 + offset] = -sinb /
SSHT_SQRT2;
222 dl[(0 + offset)*stride + 0 + offset] = cosb;
223 dl[(0 + offset)*stride + 1 + offset] = sinb /
SSHT_SQRT2;
225 dl[(1 + offset)*stride - 1 + offset] = sinhb * sinhb;
226 dl[(1 + offset)*stride + 0 + offset] = -sinb /
SSHT_SQRT2;
227 dl[(1 + offset)*stride + 1 + offset] = coshb * coshb;
232 coshb = -cos(beta / 2.0);
233 sinhb = sin(beta / 2.0);
237 dd = (
double*)calloc((2*el+2)*(2*el+2),
sizeof(
double));
242 for (k=0; k<=j-1; k++) {
243 for (i=0; i<=j-1; i++) {
244 dlj = dl[(k-(el-1)+offset)*stride + i-(el-1) + offset] / rj;
245 dd[k*(2*el+2) + i] +=
246 sqrt_tbl[j-i] * sqrt_tbl[j-k] * dlj * coshb;
247 dd[k*(2*el+2) + i+1] -=
248 sqrt_tbl[i+1] * sqrt_tbl[j-k] * dlj * sinhb;
249 dd[(k+1)*(2*el+2) + i] +=
250 sqrt_tbl[j-i] * sqrt_tbl[k+1] * dlj * sinhb;
251 dd[(k+1)*(2*el+2) + i+1] +=
252 sqrt_tbl[i+1] * sqrt_tbl[k+1] * dlj * coshb;
259 for (k=-el; k<=el; k++)
260 for (i=-el; i<=el; i++)
261 dl[(k+offset)*stride + i + offset] = 0.0;
265 for (k=0; k<=j-1; k++) {
266 for (i=0; i<=j-1; i++) {
267 ddj = dd[k*(2*el+2) + i] / rj;
268 dl[(k-el+offset)*stride + i-el + offset] +=
269 sqrt_tbl[j-i] * sqrt_tbl[j-k] * ddj * coshb;
270 dl[(k-el+offset)*stride + i+1-el + offset] -=
271 sqrt_tbl[i+1] * sqrt_tbl[j-k] * ddj * sinhb;
272 dl[(k+1-el+offset)*stride + i-el + offset] +=
273 sqrt_tbl[j-i] * sqrt_tbl[k+1] * ddj * sinhb;
274 dl[(k+1-el+offset)*stride + i+1-el + offset] +=
275 sqrt_tbl[i+1] * sqrt_tbl[k+1] * ddj * coshb;
315 int el,
double *sqrt_tbl,
319 double cosb, sinb, coshb, sinhb;
332 dl[(0+offset)*stride + 0 + offset] = 1.0;
339 coshb = cos(beta / 2.0);
340 sinhb = sin(beta / 2.0);
342 dl[(-1 + offset)*stride - 1 + offset] = coshb * coshb;
343 dl[(-1 + offset)*stride + 0 + offset] = sinb /
SSHT_SQRT2;
344 dl[(-1 + offset)*stride + 1 + offset] = sinhb * sinhb;
346 dl[(0 + offset)*stride - 1 + offset] = -sinb /
SSHT_SQRT2;
347 dl[(0 + offset)*stride + 0 + offset] = cosb;
348 dl[(0 + offset)*stride + 1 + offset] = sinb /
SSHT_SQRT2;
350 dl[(1 + offset)*stride - 1 + offset] = sinhb * sinhb;
351 dl[(1 + offset)*stride + 0 + offset] = -sinb /
SSHT_SQRT2;
352 dl[(1 + offset)*stride + 1 + offset] = coshb * coshb;
357 coshb = -cos(beta / 2.0);
358 sinhb = sin(beta / 2.0);
362 dd = (
double*)calloc((2*el+2)*(2*el+2),
sizeof(
double));
367 for (k=0; k<=j-1; k++) {
368 for (i=0; i<=el; i++) {
369 dlj = dl[(k-(el-1)+offset)*stride + i-(el-1) + offset] / rj;
370 dd[k*(2*el+2) + i] +=
371 sqrt_tbl[j-i] * sqrt_tbl[j-k] * dlj * coshb;
372 dd[k*(2*el+2) + i+1] -=
373 sqrt_tbl[i+1] * sqrt_tbl[j-k] * dlj * sinhb;
374 dd[(k+1)*(2*el+2) + i] +=
375 sqrt_tbl[j-i] * sqrt_tbl[k+1] * dlj * sinhb;
376 dd[(k+1)*(2*el+2) + i+1] +=
377 sqrt_tbl[i+1] * sqrt_tbl[k+1] * dlj * coshb;
384 for (k=-el; k<=el; k++)
385 for (i=-el; i<=el; i++)
386 dl[(k+offset)*stride + i + offset] = 0.0;
390 for (k=0; k<=j-1; k++) {
391 for (i=0; i<=el; i++) {
392 ddj = dd[k*(2*el+2) + i] / rj;
393 dl[(k-el+offset)*stride + i-el + offset] +=
394 sqrt_tbl[j-i] * sqrt_tbl[j-k] * ddj * coshb;
395 dl[(k-el+offset)*stride + i+1-el + offset] -=
396 sqrt_tbl[i+1] * sqrt_tbl[j-k] * ddj * sinhb;
397 dl[(k+1-el+offset)*stride + i-el + offset] +=
398 sqrt_tbl[j-i] * sqrt_tbl[k+1] * ddj * sinhb;
399 dl[(k+1-el+offset)*stride + i+1-el + offset] +=
400 sqrt_tbl[i+1] * sqrt_tbl[k+1] * ddj * coshb;
405 for (m=-el; m<=el; m++)
406 for (mm=1; mm<=el; mm++)
407 dl[(m+offset)*stride + mm + offset] =
408 signs[abs(m)] * signs[abs(mm)]
409 * dl[(-m+offset)*stride - mm + offset];
451 int el,
double *sqrt_tbl,
454 int offset, stride, imax;
455 double cosb, sinb, coshb, sinhb;
468 dl[(0+offset)*stride + 0 + offset] = 1.0;
475 coshb = cos(beta / 2.0);
476 sinhb = sin(beta / 2.0);
478 dl[(-1 + offset)*stride - 1 + offset] = coshb * coshb;
479 dl[(-1 + offset)*stride + 0 + offset] = sinb /
SSHT_SQRT2;
480 dl[(-1 + offset)*stride + 1 + offset] = sinhb * sinhb;
482 dl[(0 + offset)*stride - 1 + offset] = -sinb /
SSHT_SQRT2;
483 dl[(0 + offset)*stride + 0 + offset] = cosb;
484 dl[(0 + offset)*stride + 1 + offset] = sinb /
SSHT_SQRT2;
486 dl[(1 + offset)*stride - 1 + offset] = sinhb * sinhb;
487 dl[(1 + offset)*stride + 0 + offset] = -sinb /
SSHT_SQRT2;
488 dl[(1 + offset)*stride + 1 + offset] = coshb * coshb;
493 coshb = -cos(beta / 2.0);
494 sinhb = sin(beta / 2.0);
498 dd = (
double*)calloc((el+3)*(el+3),
sizeof(
double));
503 for (k=0; k<=el; k++) {
508 for (i=0; i<=imax; i++) {
509 dlj = dl[(k-(el-1)+offset)*stride + i-(el-1) + offset] / rj;
511 sqrt_tbl[j-i] * sqrt_tbl[j-k] * dlj * coshb;
512 dd[k*(el+3) + i+1] -=
513 sqrt_tbl[i+1] * sqrt_tbl[j-k] * dlj * sinhb;
514 dd[(k+1)*(el+3) + i] +=
515 sqrt_tbl[j-i] * sqrt_tbl[k+1] * dlj * sinhb;
516 dd[(k+1)*(el+3) + i+1] +=
517 sqrt_tbl[i+1] * sqrt_tbl[k+1] * dlj * coshb;
524 for (k=-el; k<=1; k++)
525 for (i=-el; i<=3; i++)
526 dl[(k+offset)*stride + i + offset] = 0.0;
530 for (k=0; k<=el; k++) {
531 for (i=0; i<=k+1; i++) {
532 ddj = dd[k*(el+3) + i] / rj;
533 dl[(k-el+offset)*stride + i-el + offset] +=
534 sqrt_tbl[j-i] * sqrt_tbl[j-k] * ddj * coshb;
535 dl[(k-el+offset)*stride + i+1-el + offset] -=
536 sqrt_tbl[i+1] * sqrt_tbl[j-k] * ddj * sinhb;
537 dl[(k+1-el+offset)*stride + i-el + offset] +=
538 sqrt_tbl[j-i] * sqrt_tbl[k+1] * ddj * sinhb;
539 dl[(k+1-el+offset)*stride + i+1-el + offset] +=
540 sqrt_tbl[i+1] * sqrt_tbl[k+1] * ddj * coshb;
548 for (m=-el; m<=0; m++)
549 for (mm=m+1; mm<=m+2; mm++)
550 dl[(m+offset)*stride + mm + offset] =
551 signs[abs(m)] * signs[abs(mm)]
552 * dl[(mm+offset)*stride + m + offset];
556 for (mm=-el; mm<=0; mm++)
557 dl[(m+offset)*stride + mm + offset] =
558 signs[abs(el)] * signs[abs(mm)]
559 * dl[(-m+offset)*stride + mm + offset];
562 for (m=-el; m<=1; m++)
563 for (mm=1; mm<=1; mm++)
564 dl[(m+offset)*stride + mm + offset] =
565 signs[abs(el)] * signs[abs(m)]
566 * dl[(m+offset)*stride - mm + offset];
607 int offset, stride, offset8, stride8;
618 for (m=0; m<=el; m++)
619 for (mm=m; mm<=el; mm++)
620 dl[(m+offset)*stride + mm + offset] =
622 * dl8[(-m+offset8)*stride8 - mm + offset8];
625 for (m=0; m<=el; m++)
626 for (mm=0; mm<=m-1; mm++)
627 dl[(m+offset)*stride + mm + offset] =
629 * dl[(mm+offset)*stride + m + offset];
666 double *sqrt_tbl,
double *signs) {
669 double cosb, sinb, coshb, sinhb;
670 double lnAlm, lnfact2el;
681 dlm1p1[(0+offset)*stride + 0 + offset] = 1.0;
688 coshb = cos(beta / 2.0);
689 sinhb = sin(beta / 2.0);
694 dlm1p1[(-1 + offset)*stride - 1 + offset] = coshb * coshb;
695 dlm1p1[(-1 + offset)*stride + 0 + offset] = sinb /
SSHT_SQRT2;
696 dlm1p1[(-1 + offset)*stride + 1 + offset] = sinhb * sinhb;
698 dlm1p1[(0 + offset)*stride - 1 + offset] = -sinb /
SSHT_SQRT2;
699 dlm1p1[(0 + offset)*stride + 0 + offset] = cosb;
700 dlm1p1[(0 + offset)*stride + 1 + offset] = sinb /
SSHT_SQRT2;
702 dlm1p1[(1 + offset)*stride - 1 + offset] = sinhb * sinhb;
703 dlm1p1[(1 + offset)*stride + 0 + offset] = -sinb /
SSHT_SQRT2;
704 dlm1p1[(1 + offset)*stride + 1 + offset] = coshb * coshb;
710 coshb = cos(beta / 2.0);
711 sinhb = sin(beta / 2.0);
715 elm1r = (double) elm1;
718 for (m=-(el-1); m<=el-1; m++) {
719 for (mm=-(el-1); mm<=el-1; mm++) {
722 dlm1p1[(m + offset)*stride + mm + offset] =
723 (cosb - m*mm/(elm1r*elr)) * dl[(m + offset)*stride + mm + offset]
725 sqrt_tbl[elm1+m] * sqrt_tbl[elm1-m] * sqrt_tbl[elm1+mm] * sqrt_tbl[elm1-mm]
726 / (elm1r * (2.0*elm1r + 1.0))
727 * dlm1p1[(m + offset)*stride + mm + offset];
730 dlm1p1[(m + offset)*stride + mm + offset] *=
732 / (sqrt_tbl[el-m] * sqrt_tbl[el+m] * sqrt_tbl[el-mm] * sqrt_tbl[el+mm]);
739 for (m=-el; m<=el; m++) {
744 dlm1p1[(el + offset)*stride + m + offset] =
745 signs[el] * signs[abs(m)]
746 * exp(lnAlm + (el+m)*log(coshb) + (el-m)*log(sinhb));
749 dlm1p1[(-el + offset)*stride + m + offset] =
750 exp(lnAlm + (el-m)*log(coshb) + (el+m)*log(sinhb));
753 dlm1p1[(m + offset)*stride + el + offset] =
754 exp(lnAlm + (el+m)*log(coshb) + (el-m)*log(sinhb));
757 dlm1p1[(m + offset)*stride - el + offset] =
758 signs[el] * signs[abs(m)]
759 * exp(lnAlm + (el-m)*log(coshb) + (el+m)*log(sinhb));
796 double beta,
int L,
int mm,
int el,
797 double *sqrt_tbl,
double *signs) {
800 double cosb, sinb, coshb, sinhb;
801 double lnAlm, lnAlmm, lnfact2el;
817 coshb = cos(beta / 2.0);
818 sinhb = sin(beta / 2.0);
821 dlm1p1_line[-1 + offset] = coshb * coshb;
822 dlm1p1_line[ 0 + offset] = -sinb /
SSHT_SQRT2;
823 dlm1p1_line[ 1 + offset] = sinhb * sinhb;
827 dlm1p1_line[ 0 + offset] = cosb;
828 dlm1p1_line[ 1 + offset] = -sinb /
SSHT_SQRT2;
832 dlm1p1_line[-1 + offset] = sinhb * sinhb;
834 dlm1p1_line[ 1 + offset] = coshb * coshb;
838 else if (el == abs(mm)) {
840 coshb = cos(beta / 2.0);
841 sinhb = sin(beta / 2.0);
848 for (m=-el; m<=el; m++) {
850 dlm1p1_line[m + offset] =
851 exp(lnAlm + (el+m)*log(coshb) + (el-m)*log(sinhb));
859 for (m=-el; m<=el; m++) {
861 dlm1p1_line[m + offset] =
862 signs[el] * signs[abs(m)]
863 * exp(lnAlm + (el-m)*log(coshb) + (el+m)*log(sinhb));
872 coshb = cos(beta / 2.0);
873 sinhb = sin(beta / 2.0);
877 elm1r = (double) elm1;
880 for (m=-(el-1); m<=el-1; m++) {
883 dlm1p1_line[m + offset] =
884 (cosb - m*mm/(elm1r*elr)) * dl_line[m + offset]
886 sqrt_tbl[elm1+m] * sqrt_tbl[elm1-m] * sqrt_tbl[elm1+mm] * sqrt_tbl[elm1-mm]
887 / (elm1r * (2.0*elm1r + 1.0))
888 * dlm1p1_line[m + offset];
891 dlm1p1_line[m + offset] *=
893 / (sqrt_tbl[el-m] * sqrt_tbl[el+m] * sqrt_tbl[el-mm] * sqrt_tbl[el+mm]);
902 dlm1p1_line[-el + offset] =
903 exp(lnAlmm + (el-mm)*log(coshb) + (el+mm)*log(sinhb));
906 dlm1p1_line[el + offset] =
907 signs[el] * signs[abs(mm)]
908 * exp(lnAlmm + (el+mm)*log(coshb) + (el-mm)*log(sinhb));
944 double beta,
int L,
int mm,
int el,
945 double *sqrt_tbl,
double *signs) {
948 double cosb, sinb, coshb, sinhb;
949 double lnAlm, lnAlmm, lnfact2el;
965 coshb = cos(beta / 2.0);
966 sinhb = sin(beta / 2.0);
969 dlm1p1_line[ 0 + offset] = -sinb /
SSHT_SQRT2;
970 dlm1p1_line[ 1 + offset] = sinhb * sinhb;
973 dlm1p1_line[ 0 + offset] = cosb;
974 dlm1p1_line[ 1 + offset] = -sinb /
SSHT_SQRT2;
979 dlm1p1_line[ 1 + offset] = coshb * coshb;
983 else if (el == abs(mm)) {
985 coshb = cos(beta / 2.0);
986 sinhb = sin(beta / 2.0);
993 for (m=0; m<=el; m++) {
995 dlm1p1_line[m + offset] =
996 exp(lnAlm + (el+m)*log(coshb) + (el-m)*log(sinhb));
1004 for (m=0; m<=el; m++) {
1006 dlm1p1_line[m + offset] =
1007 signs[el] * signs[abs(m)]
1008 * exp(lnAlm + (el-m)*log(coshb) + (el+m)*log(sinhb));
1017 coshb = cos(beta / 2.0);
1018 sinhb = sin(beta / 2.0);
1022 elm1r = (double) elm1;
1025 for (m=0; m<=el-1; m++) {
1028 dlm1p1_line[m + offset] =
1029 (cosb - m*mm/(elm1r*elr)) * dl_line[m + offset]
1031 sqrt_tbl[elm1+m] * sqrt_tbl[elm1-m] * sqrt_tbl[elm1+mm] * sqrt_tbl[elm1-mm]
1032 / (elm1r * (2.0*elm1r + 1.0))
1033 * dlm1p1_line[m + offset];
1036 dlm1p1_line[m + offset] *=
1038 / (sqrt_tbl[el-m] * sqrt_tbl[el+m] * sqrt_tbl[el-mm] * sqrt_tbl[el+mm]);
1047 dlm1p1_line[el + offset] =
1048 signs[el] * signs[abs(mm)]
1049 * exp(lnAlmm + (el+mm)*log(coshb) + (el-mm)*log(sinhb));
1079 int el,
double *sqrt_tbl) {
1081 int m, mm, offset, stride;
1083 double t1, t2, s1, s2;
1086 dmm = (
double*)calloc(el+1,
sizeof(
double));
1096 dl[0*stride + 0 + offset] = 1.0;
1102 dmm[0] = - sqrt_tbl[2*el-1] / sqrt_tbl[2*el]
1103 * dl[(el-1)*stride + 0 + offset];
1106 for (mm=1; mm<=el; mm++) {
1108 * sqrt_tbl[2*el-1] / sqrt_tbl[el+mm] / sqrt_tbl[el+mm-1]
1109 * dl[(el-1)*stride + (mm-1) + offset];
1113 for (mm=0; mm<=el; mm++) {
1114 dl[el*stride + mm + offset] = dmm[mm];
1141 s1 = sqrt_tbl[el-m] * sqrt_tbl[el+m+1];
1142 for (mm=0; mm<=el; mm++) {
1144 dl[m*stride + mm + offset] = 2e0 * mm / s1
1145 * dl[(m+1)*stride + mm + offset];
1148 for (m=el-2; m>=0; m--) {
1149 s1 = sqrt_tbl[el-m] * sqrt_tbl[el+m+1];
1150 s2 = sqrt_tbl[el-m-1] * sqrt_tbl[el+m+2] / sqrt_tbl[el-m] / sqrt_tbl[el+m+1];
1151 for (mm=0; mm<=m; mm++) {
1153 * dl[(m+1)*stride + mm + offset];
1155 * dl[(m+2)*stride + mm + offset];
1156 dl[m*stride + mm + offset] = t1 - t2;
1197 int el,
double *sqrt_tbl) {
1199 int m, mm, offset, stride;
1201 double t1, t2, s1, s2;
1204 dmm = (
double*)calloc(el+1,
sizeof(
double));
1214 dl[0*stride + 0 + offset] = 1.0;
1220 dmm[0] = - sqrt_tbl[2*el-1] / sqrt_tbl[2*el]
1221 * dl[(el-1)*stride + 0 + offset];
1224 for (mm=1; mm<=el; mm++) {
1226 * sqrt_tbl[2*el-1] / sqrt_tbl[el+mm] / sqrt_tbl[el+mm-1]
1227 * dl[(el-1)*stride + (mm-1) + offset];
1231 for (mm=0; mm<=el; mm++) {
1232 dl[el*stride + mm + offset] = dmm[mm];
1259 s1 = sqrt_tbl[el-m] * sqrt_tbl[el+m+1];
1260 for (mm=0; mm<=el; mm++) {
1262 dl[m*stride + mm + offset] = 2e0 * mm / s1
1263 * dl[(m+1)*stride + mm + offset];
1266 for (m=el-2; m>=0; m--) {
1267 s1 = sqrt_tbl[el-m] * sqrt_tbl[el+m+1];
1268 s2 = sqrt_tbl[el-m-1] * sqrt_tbl[el+m+2] / sqrt_tbl[el-m] / sqrt_tbl[el+m+1];
1269 for (mm=0; mm<=el; mm++) {
1271 * dl[(m+1)*stride + mm + offset];
1273 * dl[(m+2)*stride + mm + offset];
1274 dl[m*stride + mm + offset] = t1 - t2;
1309 int el,
double *signs) {
1311 int m, mm, offset, stride;
1318 for (m=0; m<=el; m++)
1319 for (mm=m+1; mm<=el; mm++)
1320 dl[m*stride + mm + offset] =
1321 signs[m] * signs[mm] * dl[mm*stride + m + offset];
1324 for (m=0; m<=el; m++)
1325 for (mm=-el; mm<=-1; mm++)
1326 dl[m*stride + mm + offset] =
1327 signs[el] * signs[m] * dl[m*stride - mm + offset];
1354 int el,
double *signs) {
1356 int m, mm, offset, stride;
1363 for (m=0; m<=el; m++)
1364 for (mm=m+1; mm<=el; mm++)
1365 dl[m*stride + mm + offset] =
1366 signs[m] * signs[mm] * dl[mm*stride + m + offset];
1381 double y, temp, sum, c[6], loggamma, x;
1394 x = (double) (n) + 1.0;
1398 c[0] = 76.18009172947146;
1399 c[1] = - 86.50532032941677;
1400 c[2] = 24.01409824083091;
1401 c[3] = - 1.231739572450155;
1402 c[4] = 0.1208650973866179e-2;
1403 c[5] = - 0.5395239384953e-5;
1407 temp = x + 5.5 - (x + 0.5) * log(x + 5.5);
1408 sum = 1.000000000190015;
1411 for (nn=0; nn<=5; nn++) {
1413 sum = sum + c[nn] / y;
1416 loggamma = - temp + log(2.5066282746310005 * sum / x);