38 static const double EPS = 0.00001;
44 double a_norm, a_normEPS, thr, thr_nn;
47 int i, j, k, ij, ik,
l, m, lm, mq, lq, ll, mm, imv, im, iq, ilv, il, nn;
49 double a_ij, a_lm, a_ll, a_mm, a_im, a_il;
53 double sinx, sinx_2, cosx, cosx_2, sincos;
57 nn = (n * (n + 1)) / 2;
62 for (ij = 0; ij < nn; ij++) {
70 v =
new double[n * n];
73 for (i = 0; i < n; i++) {
74 for (j = 0; j < n; j++) {
90 for (i = 1; i <= n; i++) {
91 for (j = 1; j <= i; j++) {
94 a_norm += a_ij * a_ij;
101 a_normEPS = a_norm *
EPS;
105 while (thr > a_normEPS && nb_iter <
MAX_ITER) {
109 for (
l = 1;
l < n;
l++) {
110 for (m =
l + 1; m <= n; m++) {
112 lq = (
l *
l -
l) / 2;
113 mq = (m * m - m) / 2;
117 a_lm_2 = a_lm * a_lm;
119 if (a_lm_2 < thr_nn) {
134 x = -
atan((a_lm + a_lm) / delta) / 2.0;
139 sinx_2 = sinx * sinx;
140 cosx_2 = cosx * cosx;
141 sincos = sinx * cosx;
147 for (i = 1; i <= n; i++) {
148 if (!
ELEM(i,
l, m)) {
149 iq = (i * i - i) / 2;
167 a[il] = a_il * cosx - a_im * sinx;
168 a[im] = a_il * sinx + a_im * cosx;
177 v[ilv] = cosx * v_ilv - sinx * v_imv;
178 v[imv] = sinx * v_ilv + cosx * v_imv;
184 a[ll] = a_ll * cosx_2 + a_mm * sinx_2 -
x;
185 a[mm] = a_ll * sinx_2 + a_mm * cosx_2 +
x;
188 thr =
fabs(thr - a_lm_2);
199 for (i = 0; i < n; i++) {
200 k = i + (i * (i + 1)) / 2;
209 for (i = 0; i < n; i++) {
213 for (i = 0; i < (n - 1); i++) {
217 for (j = i + 1; j < n; j++) {
218 if (
x < eigen_val[j]) {
224 eigen_val[k] = eigen_val[i];
238 for (k = 0; k < n; k++) {
240 for (i = 0; i < n; i++) {
241 eigen_vec[ij++] =
v[ik++];
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert * v
void semi_definite_symmetric_eigen(const double *mat, int n, double *eigen_vec, double *eigen_val)
INLINE Rall1d< T, V, S > cos(const Rall1d< T, V, S > &arg)
INLINE Rall1d< T, V, S > atan(const Rall1d< T, V, S > &x)
INLINE Rall1d< T, V, S > sin(const Rall1d< T, V, S > &arg)
ccl_device_inline float2 fabs(const float2 &a)