293 =
SQRT(
A[0][0] *
A[0][0] +
A[0][1] *
A[0][1] +
A[0][2] *
A[0][2] +
A[1][0] *
A[1][0] +
A[1][1] *
A[1][1]
294 +
A[1][2] *
A[1][2] +
A[2][0] *
A[2][0] +
A[2][1] *
A[2][1] +
A[2][2] *
A[2][2]);
297 for(
size_t i = 0;
i < 3;
i++)
298 for(
size_t j = 0; j < 3; j++)
A[
i][j] /= norm;
301 TYPE m =
A[1][1] *
A[2][2] -
A[1][2] *
A[2][1];
304 m =
A[1][0] *
A[2][2] -
A[1][2] *
A[2][0];
306 m =
A[1][0] *
A[2][1] -
A[1][1] *
A[2][0];
309 m =
A[0][0] *
A[2][1] -
A[0][1] *
A[2][0];
311 m =
A[0][0] *
A[2][2] -
A[0][2] *
A[2][0];
313 m =
A[0][1] *
A[2][2] -
A[0][2] *
A[2][1];
316 m =
A[0][1] *
A[1][2] -
A[0][2] *
A[1][1];
318 m =
A[0][0] *
A[1][2] -
A[0][2] *
A[1][0];
320 m =
A[0][0] *
A[1][1] -
A[0][1] *
A[1][0];
330 TYPE U[3] = { 0.0, 0.0, 0.0 };
336 if((b - 1.0 + 1.0e-4) > 0.0)
393 const TYPE m0 = AA[0][1] / AA[0][0];
394 const TYPE m1 = AA[0][2] / AA[0][0];
395 TYPE AAA[2][2] = { { AA[1][1] - AA[1][0] * m0, AA[1][2] - AA[1][0] * m1 },
396 { AA[2][1] - AA[2][0] * m0, AA[2][2] - AA[2][0] * m1 } };
400 if(
ABS(AAA[1][0]) >
ABS(AAA[0][0]))
r = 1;
401 if(
ABS(AAA[0][1]) >
ABS(AAA[
r][c]))
406 if(
ABS(AAA[1][1]) >
ABS(AAA[
r][c]))
421 U[2] = AAA[1 -
r][1 - c] - AAA[
r][1 - c] * AAA[1 -
r][c] / U[1];
424 dd = dd * U[0] * U[1] * U[2];
433 nit = 16.8 + 2.0 * log10(AU);
434 nit = ceil(15.0 / nit);
453 copy(AA[0],
A[1], 3);
454 copy(AA[1],
A[0], 3);
455 copy(AA[2],
A[2], 3);
468 copy(AA[0],
A[2], 3);
469 copy(AA[1],
A[1], 3);
470 copy(AA[2],
A[0], 3);
479 const TYPE m0 = AA[0][1] / AA[0][0];
480 const TYPE m1 = AA[0][2] / AA[0][0];
481 TYPE AAA[2][2] = { { AA[1][1] - AA[1][0] * m0, AA[1][2] - AA[1][0] * m1 },
482 { AA[2][1] - AA[2][0] * m0, AA[2][2] - AA[2][0] * m1 } };
484 if(
ABS(AAA[0][0]) <
ABS(AAA[1][0]))
487 U[2] = AAA[0][1] - AAA[0][0] * AAA[1][1] / AAA[1][0];
493 else if(AAA[0][0] == 0)
501 U[2] = AAA[1][1] - AAA[1][0] * AAA[0][1] / AAA[0][0];
506 dd = dd * U[0] * U[1] * U[2];
513 const TYPE t =
A[0][0] +
A[1][1] +
A[2][2];
514 TYPE B[4][4] = { {
t,
A[1][2] -
A[2][1],
A[2][0] -
A[0][2],
A[0][1] -
A[1][0] },
515 { 0.0, 2.0 *
A[0][0] -
t,
A[0][1] +
A[1][0],
A[0][2] +
A[2][0] },
516 { 0.0, 0.0, 2.0 *
A[1][1] -
t,
A[1][2] +
A[2][1] },
517 { 0.0, 0.0, 0.0, 2.0 *
A[2][2] -
t } };
519 for(
size_t i = 0;
i < 4;
i++)
520 for(
size_t j = 0; j < 4; j++)
B[
i][j] *=
d;
533 const TYPE Delta0 = 1.0 + 3.0 * b;
534 const TYPE Delta1 = -1.0 + (27.0 / 16.0) * dd * dd + 9.0 * b;
535 TYPE phi = Delta1 / Delta0;
537 const TYPE SS = (4.0 / 3.0) * (1.0 + cos(acos(phi) / 3.0) *
SQRT(Delta0));
539 x =
S + 0.5 *
SQRT(fmax(0.0, -SS + 4.0 + dd /
S));
545 while((xold -
x) > 1.0e-12)
548 const TYPE px =
x * (
x * (
x *
x - 2.0) - dd) + b;
549 const TYPE dpx =
x * (4.0 *
x *
x - 4.0) - dd;
554 TYPE v[4] = { 0.0, 0.0, 0.0, 0.0 };
561 for(
size_t i = 0;
i < 4;
i++)
563 for(
size_t j = 0; j < 4; j++) BB[
i][j] = -BB[
i][j];
567 size_t p[4] = { 0, 1, 2, 3 };
569 = { { 1.0, 0.0, 0.0, 0.0 }, { 0.0, 1.0, 0.0, 0.0 }, { 0.0, 0.0, 1.0, 0.0 }, { 0.0, 0.0, 0.0, 1.0 } };
570 TYPE Ddiag[4] = { 0.0, 0.0, 0.0, 0.0 };
574 if(BB[3][3] < BB[2][2])
r = 2;
575 if(BB[
r][
r] < BB[1][1])
r = 1;
576 if(BB[
r][
r] > BB[0][0])
578 const size_t tmp =
p[0];
586 L[1][0] = BB[1][0] / Ddiag[0];
587 L[2][0] = BB[2][0] / Ddiag[0];
588 L[3][0] = BB[3][0] / Ddiag[0];
590 BB[1][1] -=
L[1][0] * BB[0][1];
591 BB[2][1] -=
L[1][0] * BB[0][2];
593 BB[3][1] -=
L[1][0] * BB[0][3];
595 BB[2][2] -=
L[2][0] * BB[0][2];
596 BB[3][2] -=
L[2][0] * BB[0][3];
598 BB[3][3] -=
L[3][0] * BB[0][3];
602 if(BB[3][3] < BB[2][2])
r = 2;
603 if(BB[
r][
r] > BB[1][1])
605 const size_t tmp =
p[1];
615 L[2][1] = BB[2][1] / Ddiag[1];
616 L[3][1] = BB[3][1] / Ddiag[1];
617 BB[2][2] -=
L[2][1] * BB[1][2];
618 BB[3][2] -=
L[2][1] * BB[1][3];
620 BB[3][3] -=
L[3][1] * BB[1][3];
623 if(BB[2][2] < BB[3][3])
630 const size_t tmp =
p[2];
639 L[3][2] = BB[3][2] / Ddiag[2];
640 v[0] =
L[1][0] *
L[3][1] +
L[2][0] *
L[3][2] -
L[1][0] *
L[3][2] *
L[2][1] -
L[3][0];
641 v[1] =
L[3][2] *
L[2][1] -
L[3][1];
648 for(
size_t i = 0;
i < 4;
i++)
v[
p[
i]] = temp[
i];
655 for(
size_t i = 0;
i < 4;
i++)
657 for(
size_t j = 0; j < 4; j++) BB[
i][j] = -BB[
i][j];
661 size_t p[4] = { 0, 1, 2, 3 };
663 = { { 1.0, 0.0, 0.0, 0.0 }, { 0.0, 1.0, 0.0, 0.0 }, { 0.0, 0.0, 1.0, 0.0 }, { 0.0, 0.0, 0.0, 1.0 } };
665 = { { 0.0, 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0, 0.0 } };
669 if(BB[3][3] < BB[2][2])
r = 2;
670 if(BB[
r][
r] < BB[1][1])
r = 1;
671 if(BB[
r][
r] > BB[0][0])
673 const size_t tmp =
p[0];
681 L[1][0] = BB[1][0] / D[0][0];
682 L[2][0] = BB[2][0] / D[0][0];
683 L[3][0] = BB[3][0] / D[0][0];
684 BB[1][1] -=
L[1][0] * BB[0][1];
685 BB[2][1] -=
L[1][0] * BB[0][2];
687 BB[3][1] -=
L[1][0] * BB[0][3];
689 BB[2][2] -=
L[2][0] * BB[0][2];
690 BB[3][2] -=
L[2][0] * BB[0][3];
692 BB[3][3] -=
L[3][0] * BB[0][3];
696 if(BB[2][2] < BB[1][1])
r = 1;
697 if(BB[
r][
r] > BB[0][0])
699 const size_t tmp =
p[1];
709 L[2][1] = BB[2][1] / D[1][1];
710 L[3][1] = BB[3][1] / D[1][1];
711 D[2][2] = BB[2][2] -
L[2][1] * BB[1][2];
712 D[3][2] = BB[3][2] -
L[2][1] * BB[1][3];
714 D[3][3] = BB[3][3] -
L[3][1] * BB[1][3];
716 const TYPE DD = D[2][2] * D[3][3] - D[2][3] * D[2][3];
719 const TYPE max_abs = fmax(fmax(
ABS(D[2][2]),
ABS(D[2][3])),
ABS(D[3][3]));
722 v[0] =
L[1][0] *
L[3][1] -
L[3][0];
732 v[2] = nullspace[0] -
L[3][2] *
v[3];
733 v[1] = -
L[2][1] *
v[2] -
L[3][1] *
v[3];
734 v[0] = -
L[1][0] *
v[1] -
L[2][0] *
v[2] -
L[3][0] *
v[3];
740 const TYPE ID[2][2] = { { D[3][3], -D[2][3] }, { -D[2][3], D[2][2] } };
744 TYPE vmat[4][2] = { {
L[1][0] *
L[2][1] -
L[2][0],
L[1][0] *
L[3][1] -
L[3][0] },
745 { -
L[2][1], -
L[3][1] },
748 TYPE IL[4][4] = { { 1.0, 0.0, 0.0, 0.0 },
749 { -
L[1][0], 1.0, 0.0, 0.0 },
750 { vmat[0][0], vmat[1][0], vmat[2][0], vmat[3][0] },
751 { vmat[0][1], vmat[1][1], vmat[2][1], vmat[3][1] } };
754 TYPE col0[4] = { vmat[0][0], vmat[1][0], vmat[2][0], vmat[3][0] };
755 TYPE col1[4] = { vmat[0][1], vmat[1][1], vmat[2][1], vmat[3][1] };
758 for(
size_t i = 0;
i < 4;
i++) col1[
i] -= proj * col0[
i];
760 for(
size_t i = 0;
i < 4;
i++)
762 vmat[
i][0] = col0[
i];
763 vmat[
i][1] = col1[
i];
767 for(
size_t it = 0; it < 2; it++)
769 TYPE tmp[4][2] = { { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 } };
770 TYPE tmp2[4][2] = { { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 } };
772 for(
size_t i = 0;
i < 4;
i++)
773 for(
size_t j = 0; j < 2; j++)
774 for(
size_t k = 0;
k < 4;
k++) tmp[
i][j] += IL[
i][
k] * vmat[
k][j];
776 for(
size_t j = 0; j < 2; j++)
778 tmp[0][j] /= D[0][0];
779 tmp[1][j] /= D[1][1];
780 const TYPE t0 = tmp[2][j];
781 const TYPE t1 = tmp[3][j];
782 tmp[2][j] = (ID[0][0] * t0 + ID[0][1] * t1) / DD;
783 tmp[3][j] = (ID[1][0] * t0 + ID[1][1] * t1) / DD;
786 for(
size_t i = 0;
i < 4;
i++)
787 for(
size_t j = 0; j < 2; j++)
788 for(
size_t k = 0;
k < 4;
k++) tmp2[
i][j] += IL[
k][
i] * tmp[
k][j];
790 copy(*vmat, *tmp2, 8);
794 TYPE col0[4] = { vmat[0][0], vmat[1][0], vmat[2][0], vmat[3][0] };
795 TYPE col1[4] = { vmat[0][1], vmat[1][1], vmat[2][1], vmat[3][1] };
798 for(
size_t i = 0;
i < 4;
i++) col1[
i] -= proj * col0[
i];
800 for(
size_t i = 0;
i < 4;
i++)
802 vmat[
i][0] = col0[
i];
803 vmat[
i][1] = col1[
i];
807 TYPE HL[2][4] = { { 0.0, 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0, 0.0 } };
808 TYPE HD[2][4] = { { 0.0, 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0, 0.0 } };
809 TYPE Hsmall[2][2] = { { 0.0, 0.0 }, { 0.0, 0.0 } };
811 for(
size_t i = 0;
i < 2;
i++)
812 for(
size_t j = 0; j < 4; j++)
813 for(
size_t k = 0;
k < 4;
k++) HL[
i][j] += vmat[
k][
i] *
L[
k][j];
815 for(
size_t i = 0;
i < 2;
i++)
816 for(
size_t j = 0; j < 4; j++)
817 for(
size_t k = 0;
k < 4;
k++) HD[
i][j] += HL[
i][
k] * D[
k][j];
819 for(
size_t i = 0;
i < 2;
i++)
820 for(
size_t j = 0; j < 2; j++)
821 for(
size_t k = 0;
k < 4;
k++) Hsmall[
i][j] -= HD[
i][
k] * HL[j][
k];
823 if(
ABS(Hsmall[0][1]) < 1.0e-15)
825 for(
size_t i = 0; i < 4; i++) v[i] = vmat[i][Hsmall[0][0] > Hsmall[0][1] ? 0 : 1];
829 const TYPE ratio = (Hsmall[0][0] - Hsmall[1][1]) / (2.0 * Hsmall[0][1]);
830 const TYPE alpha = ratio + (Hsmall[0][1] < 0 ? -1.0 : 1.0) *
SQRT(1.0 + ratio * ratio);
831 for(
size_t i = 0;
i < 4;
i++)
v[
i] = vmat[
i][0] * alpha + vmat[
i][1];
837 v[0] =
L[1][0] *
L[3][1] +
L[2][0] *
L[3][2] -
L[1][0] *
L[3][2] *
L[2][1] -
L[3][0];
838 v[1] =
L[3][2] *
L[2][1] -
L[3][1];
842 TYPE IL[4][4] = { { 1.0, 0.0, 0.0, 0.0 },
843 { -
L[1][0], 1.0, 0.0, 0.0 },
844 {
L[1][0] *
L[2][1] -
L[2][0], -
L[2][1], 1.0, 0.0 },
845 {
v[0],
v[1],
v[2],
v[3] } };
849 for(
size_t it = 0; it < (size_t)nit; it++)
851 TYPE tmp[4] = { 0.0, 0.0, 0.0, 0.0 };
852 TYPE tmp2[4] = { 0.0, 0.0, 0.0, 0.0 };
854 for(
size_t i = 0;
i < 4;
i++)
855 for(
size_t k = 0;
k < 4;
k++) tmp[
i] += IL[
i][
k] *
v[
k];
860 const TYPE t0 = tmp[2];
861 const TYPE t1 = tmp[3];
862 tmp[2] = (ID[0][0] * t0 + ID[0][1] * t1) / DD;
863 tmp[3] = (ID[1][0] * t0 + ID[1][1] * t1) / DD;
866 for(
size_t i = 0;
i < 4;
i++)
867 for(
size_t k = 0;
k < 4;
k++) tmp2[
i] += IL[
k][
i] * tmp[
k];
876 for(
size_t i = 0;
i < 4;
i++)
v[
p[
i]] = temp[
i];
881 const TYPE v22 = 2.0 *
v[1] *
v[1];
882 const TYPE v33 = 2.0 *
v[2] *
v[2];
883 const TYPE v44 = 2.0 *
v[3] *
v[3];
884 const TYPE v23 = 2.0 *
v[1] *
v[2];
885 const TYPE v14 = 2.0 *
v[0] *
v[3];
886 const TYPE v24 = 2.0 *
v[1] *
v[3];
887 const TYPE v13 = 2.0 *
v[0] *
v[2];
888 const TYPE v12 = 2.0 *
v[0] *
v[1];
889 const TYPE v34 = 2.0 *
v[2] *
v[3];
891 Q[0][0] = 1.0 - v33 - v44;
895 Q[1][1] = 1.0 - v22 - v44;
899 Q[2][2] = 1.0 - v22 - v33;
901 if(
d == -1)
for(
size_t i = 0;
i < 3;
i++)
for(
size_t j = 0; j < 3; j++) Q[
i][j] = -Q[
i][j];
904 for(
size_t i = 0;
i < 3;
i++)
905 for(
size_t j = 0; j < 3; j++) QT[j][
i] = Q[
i][j];
908 for(
size_t i = 0;
i < 9;
i++)