valib
Vortex Analysis LIBrary
linalg3.h
1 
5 #ifndef VA_LINALG3_H
6 #define VA_LINALG3_H
7 
8 #include "common_defs.h"
9 
10 /***************************************************************************/
15 /***************************************************************************/
20 VA_DEVICE_FUN VA_REAL valib_sign(VA_REAL a, VA_REAL b)
21 {
22  return (b < (VA_REAL) 0.) ? -fabs(a) : fabs(a);
23 }
24 
25 /***************************************************************************/
29 VA_DEVICE_FUN VA_REAL valib_cubic_root(VA_REAL x)
30 {
31  return valib_sign(pow(fabs(x), 1.0/3.0), x);
32 }
33 
34 /***************************************************************************/
39 VA_DEVICE_FUN VA_REAL valib_max(VA_REAL a, VA_REAL b)
40 {
41  return (a > b) ? a : b;
42 }
43 
44 /***************************************************************************/
49 VA_DEVICE_FUN VA_REAL valib_min(VA_REAL a, VA_REAL b)
50 {
51  return (a < b) ? a : b;
52 }
53 
54 /***************************************************************************/
58 VA_DEVICE_FUN void valib_swap_values(VA_REAL *a, VA_REAL *b)
59 {
60  VA_REAL buf;
61  buf = *a;
62  *a = *b;
63  *b = buf;
64 }
65 
66 /***************************************************************************/
74 VA_DEVICE_FUN void valib_solve_cubic_equation(VA_REAL a, VA_REAL b,
75  VA_REAL c, VA_REAL d,
76  VA_REAL complex *x1,
77  VA_REAL complex *x2,
78  VA_REAL complex *x3,
79  int *info)
80 {
81  int debug = 0;
82 
83  VA_REAL q = pow(b/(3.*a),3) - (b*c)/(6.*a*a) + d/(2.*a);
84  VA_REAL p = (3*a*c - b*b) / (9*a*a);
85 
86  VA_REAL delta = - (p*p*p + q*q);
87 
88  if (debug) {
89  printf("q: %lf \n", q);
90  printf("p: %lf \n", p);
91  printf("delta: %lf \n", delta);
92  }
93 
94  if (delta < 0) {
95  if (debug) {
96  printf("This is a good case with two complex roots.\n");
97  }
98  }
99  else {
100  if (debug) {
101  printf("Discriminant is positive, this is not a good way to get roots.\n");
102  }
103  *info = -1;
104  return;
105  }
106 
107  VA_REAL sr = sqrt(-delta);
108 
109  if (debug) {
110  printf("sr: %lf \n", sr);
111  }
112 
113  VA_REAL mqpsr = -q + sr;
114  VA_REAL mqmsr = -q - sr;
115 
116  if (debug) {
117  printf("mqpsr: %lf \n", mqpsr);
118  printf("mqmsr: %lf \n", mqmsr);
119  }
120 
121  VA_REAL u = valib_cubic_root(mqpsr);
122  VA_REAL v = valib_cubic_root(mqmsr);
123 
124  if (debug) {
125  printf("fabs(u*v + p): %lf \n", fabs(u*v + p));
126  }
127  if (fabs(u*v + p) > 1.e-7) {
128  if (debug) {
129  printf("Check of uv = -p failed.");
130  }
131  *info = -2;
132  return;
133  }
134 
135  VA_REAL complex e1 = -0.5 + sqrt(3.)/2.*I;
136  VA_REAL complex e2 = -0.5 - sqrt(3.)/2.*I;
137 
138  VA_REAL complex y1 = u + v;
139  VA_REAL complex y2 = e1*u + e2*v;
140  VA_REAL complex y3 = e2*u + e1*v;
141 
142  VA_REAL shift = -b/(3.*a);
143 
144  *x1 = y1 + shift;
145  *x2 = y2 + shift;
146  *x3 = y3 + shift;
147 
148  // check
149  VA_REAL complex check1 = pow(a*(*x1),3) + pow(b*(*x1),2) + c*(*x1) + d;
150  VA_REAL complex check2 = pow(a*(*x2),3) + pow(b*(*x2),2) + c*(*x2) + d;
151  VA_REAL complex check3 = pow(a*(*x3),3) + pow(b*(*x3),2) + c*(*x3) + d;
152 
153  if (abs(check1) > 1.e-6) {
154  if (debug) {
155  printf("Check of x1 failed.");
156  }
157  }
158  if (abs(check2) > 1.e-6) {
159  if (debug) {
160  printf("Check of x2 failed.");
161  }
162  }
163  if (abs(check3) > 1.e-6) {
164  if (debug) {
165  printf("Check of x3 failed.");
166  }
167  }
168 
169  // finished correctly
170  *info = 0;
171 }
172 
173 /***************************************************************************/
180 /***************************************************************************/
184 VA_DEVICE_FUN void valib_vec_zero3(VA_REAL *v)
185 {
186  int i;
187  for (i = 0; i < 3; i++) {
188  v[i] = 0.;
189  }
190 }
191 
192 /***************************************************************************/
196 VA_DEVICE_FUN VA_REAL valib_scalar_prod3(VA_REAL *v1, VA_REAL *v2)
197 {
198  VA_REAL result = (VA_REAL) 0.;
199  int i;
200  for (i = 0; i < 3; i++)
201  {
202  result = result + v1[i]*v2[i];
203  }
204  return result;
205 }
206 
207 /***************************************************************************/
211 VA_DEVICE_FUN void valib_cross_prod3(VA_REAL *v1, VA_REAL *v2, VA_REAL *v3)
212 {
213  v3[0] = v1[1] * v2[2] - v1[2] * v2[1];
214  v3[1] = v1[2] * v2[0] - v1[0] * v2[2];
215  v3[2] = v1[0] * v2[1] - v1[1] * v2[0];
216 }
217 
218 /***************************************************************************/
225 /***************************************************************************/
229 VA_DEVICE_FUN void valib_mat_zero3(VA_REAL *A)
230 {
231  int i, j;
232  for (j = 0; j < 3; j++) {
233  for (i = 0; i < 3; i++) {
234  A[j*3+i] = 0.;
235  }
236  }
237 }
238 
239 /***************************************************************************/
243 VA_DEVICE_FUN void valib_mat_copy3(VA_REAL *A, VA_REAL *B)
244 {
245  int i, j;
246  for (j = 0; j < 3; j++) {
247  for (i = 0; i < 3; i++) {
248  B[j*3+i] = A[j*3+i];
249  }
250  }
251 }
252 
253 /***************************************************************************/
257 VA_DEVICE_FUN void valib_norm_frobenius3(VA_REAL *A, VA_REAL *norm)
258 {
259  *norm = 0.0;
260  int i, j;
261  for (j = 0; j < 3; j++) {
262  for (i = 0; i < 3; i++) {
263  *norm = *norm + A[j*3+i]*A[j*3+i];
264  }
265  }
266  *norm = sqrt(*norm);
267 }
268 
269 /***************************************************************************/
273 VA_DEVICE_FUN void valib_trace3(VA_REAL *A, VA_REAL *tr3)
274 {
275  *tr3 = A[0] + A[4] + A[8];
276 }
277 
278 /***************************************************************************/
282 VA_DEVICE_FUN void valib_second_invariant3(VA_REAL *A,
283  VA_REAL *second_invariant)
284 {
285  *second_invariant = ( A[0]*A[4] + A[4]*A[8] + A[0]*A[8] )
286  - ( A[1]*A[3] + A[2]*A[6] + A[5]*A[7] );
287 }
288 
289 /***************************************************************************/
293 VA_DEVICE_FUN void valib_determinant3(VA_REAL *A, VA_REAL *det)
294 {
295  *det = A[0] * A[4] * A[8]
296  + A[3] * A[7] * A[2]
297  + A[6] * A[1] * A[5]
298  - A[0] * A[7] * A[5]
299  - A[3] * A[1] * A[8]
300  - A[6] * A[4] * A[2];
301 }
302 
303 /***************************************************************************/
307 VA_DEVICE_FUN void valib_transpose3(VA_REAL *A)
308 {
309  valib_swap_values(&A[1], &A[3]);
310  valib_swap_values(&A[2], &A[6]);
311  valib_swap_values(&A[5], &A[7]);
312 }
313 
314 /***************************************************************************/
320 VA_DEVICE_FUN void valib_sym_antisym3(VA_REAL *A)
321 {
322  VA_REAL ud, ld;
323 
324  int i, j;
325  for (i = 0; i < 3; i++) {
326  for (j = i+1; j < 3; j++) {
327  ud = A[i + j*3];
328  ld = A[j + i*3];
329 
330  A[i + j*3] = (VA_REAL) 0.5 * (ud + ld);
331  A[j + i*3] = (VA_REAL) 0.5 * (ld - ud);
332  }
333  }
334 }
335 
336 /***************************************************************************/
344 VA_DEVICE_FUN void valib_deviatorise3(VA_REAL *A)
345 {
346  // get trace(A)
347  VA_REAL trace;
348  valib_trace3(A, &trace);
349 
350  // subtract a multiple of the third of the trace from the diagonal
351  A[0] = A[0] - (VA_REAL) (1./3.) * trace;
352  A[4] = A[4] - (VA_REAL) (1./3.) * trace;
353  A[8] = A[8] - (VA_REAL) (1./3.) * trace;
354 }
355 
356 /***************************************************************************/
361 VA_DEVICE_FUN void valib_matvec3_prod(int trans_a, VA_REAL *A,
362  VA_REAL *x, VA_REAL *y)
363 {
364  int i, j;
365  for (i = 0; i < 3; i++) {
366  y[i] = 0.0;
367  for (j = 0; j < 3; j++) {
368  if (trans_a == 0) {
369  y[i] = y[i] + A[j*3+i]*x[j];
370  }
371  else {
372  y[i] = y[i] + A[i*3+j]*x[j];
373  }
374  }
375  }
376 }
377 
378 /***************************************************************************/
383 VA_DEVICE_FUN void valib_rank1_update3(VA_REAL alpha,
384  VA_REAL *x, VA_REAL *y,
385  VA_REAL *A)
386 {
387  int ind;
388  VA_REAL tmp;
389 
390  ind = 0;
391  int i, j;
392  for (j = 0; j < 3; j++) {
393  tmp = alpha * y[j];
394  for (i = 0; i < 3; i++) {
395  A[ind] = A[ind] + x[i]*tmp;
396  ind = ind + 1;
397  }
398  }
399 }
400 
401 /***************************************************************************/
406 VA_DEVICE_FUN void valib_tatt3(VA_REAL *A, VA_REAL *T, VA_REAL *TATT)
407 {
408  unsigned i, j, ind;
409 
410  // zero TATT
411  valib_mat_zero3(TATT);
412 
413  // perform series of rank one updates
414  ind = 0;
415  for (i = 0; i < 3; i++) {
416  for (j = 0; j < 3; j++) {
417  // call rank one update on each element of A
418  valib_rank1_update3(A[ind], &T[j*3], &T[i*3], TATT);
419  ind = ind + 1;
420  }
421  }
422 }
423 
424 /***************************************************************************/
429 VA_DEVICE_FUN void valib_matmat3_prod(int trans_a, int trans_b,
430  VA_REAL *A, VA_REAL *B, VA_REAL *C)
431 {
432  int i, j, k;
433  for (i = 0; i < 3; i++) {
434  for (j = 0; j < 3; j++) {
435  for (k = 0; k < 3; k++) {
436  if (trans_a == 0 && trans_b == 0) {
437  C[j*3+i] = C[j*3+i] + A[k*3+i] * B[j*3+k];
438  }
439  else if (trans_a != 0 && trans_b == 0) {
440  C[j*3+i] = C[j*3+i] + A[i*3+k] * B[j*3+k];
441  }
442  else if (trans_a == 0 && trans_b != 0) {
443  C[j*3+i] = C[j*3+i] + A[k*3+i] * B[k*3+j];
444  }
445  else {//(trans_a != 0 && trans_b != 0)
446  C[j*3+i] = C[j*3+i] + A[i*3+k] * B[k*3+j];
447  }
448  }
449  }
450  }
451 }
452 
453 /***************************************************************************/
457 VA_DEVICE_FUN void valib_gram_schmidt3(VA_REAL *Q)
458 {
459  VA_REAL factor;
460 
461  // column-wise process
462  int i, j, k;
463  for (j = 0; j < 3; j++) {
464  for (i = 0; i < j; i++) {
465  // compute the scalar product with previous columns
466  factor = valib_scalar_prod3(&Q[j*3], &Q[i*3]);
467 
468  // subtract the projected vector
469  for (k = 0; k < 3; k++) {
470  Q[j*3+k] = Q[j*3+k] - factor * Q[i*3+k];
471  }
472  }
473 
474  // normalize the column
475  factor = valib_scalar_prod3(&Q[j*3], &Q[j*3]);
476  for (k = 0; k < 3; k++) {
477  Q[j*3+k] = Q[j*3+k] / sqrt(factor);
478  }
479  }
480 }
481 
482 /***************************************************************************/
486 VA_DEVICE_FUN void valib_eigenvalues_sym3(VA_REAL *A, VA_REAL *eigval)
487 {
488  // compute first invariant
489  VA_REAL Idev;
490  valib_trace3(A, &Idev);
491  VA_REAL IdevMod = Idev / 3.;
492 
493  // compute deviator
494  VA_REAL dev[9];
495  valib_mat_copy3(A, dev);
496  dev[0] = dev[0] - IdevMod;
497  dev[4] = dev[4] - IdevMod;
498  dev[8] = dev[8] - IdevMod;
499 
500  // compute second invariant of deviator
501  VA_REAL IIdev;
502  valib_second_invariant3(dev, &IIdev);
503  VA_REAL IIdevMod = -IIdev / 3.;
504 
505  // compute half the determinant (third invariant) of deviator
506  VA_REAL IIIdev;
507  valib_determinant3(dev, &IIIdev);
508  VA_REAL IIIdevMod = 0.5 * IIIdev;
509 
510  // compute strange angle
511  VA_REAL aux = IIdevMod*IIdevMod*IIdevMod - IIIdevMod*IIIdevMod;
512  VA_REAL phi;
513  if (aux < 0. || fabs(IIIdevMod) < 1.e-15) {
514  phi = 0.;
515  }
516  else {
517  phi = atan( sqrt(aux) / IIIdevMod ) / 3.;
518  }
519 
520  // readjust
521  if (phi < 0.) phi += VA_PI / 3.;
522 
523  // eigenvalues
524  eigval[0] = IdevMod + 2.*sqrt(IIdevMod) * cos(phi);
525  eigval[1] = IdevMod - sqrt(IIdevMod) * (cos(phi) + sqrt(3.) * sin(phi));
526  eigval[2] = IdevMod - sqrt(IIdevMod) * (cos(phi) - sqrt(3.) * sin(phi));
527 
528  // sort eigenvalues
529  if (eigval[0] > eigval[1] ) valib_swap_values( &eigval[0], &eigval[1] );
530  if (eigval[1] > eigval[2] ) valib_swap_values( &eigval[1], &eigval[2] );
531  if (eigval[0] > eigval[1] ) valib_swap_values( &eigval[0], &eigval[1] );
532 
533  return;
534 }
535 
536 /***************************************************************************/
542 VA_DEVICE_FUN int valib_find_pivot3(VA_REAL *A, int jcol, int start)
543 {
544  int debug = 0;
545  int ipiv = start;
546  for (int i = start+1; i<3; i++) {
547  if (fabs(A[i+jcol*3]) > fabs(A[ipiv+jcol*3]))
548  ipiv = i;
549  }
550 
551  VA_REAL numerical_zero = 1.0e-6;
552  if (fabs(A[ipiv+jcol*3]) < numerical_zero) {
553  if (debug)
554  printf("Warning: no nonzero pivot in column %d.\n", jcol);
555 
556  ipiv = -1;
557  }
558 
559  return ipiv;
560 }
561 
562 /***************************************************************************/
569 VA_DEVICE_FUN void valib_find_nullspace3(VA_REAL *A, VA_REAL *x, int *info)
570 {
571  int debug = 0;
572 
573  // zero the vector
574  x[0] = 0.; x[1] = 0.; x[2] = 0.;
575 
576  // handle special cases with zero column
577  int num_zero_cols = 0;
578  int i_zero_col = -1;
579  int ip;
580  for (int ji = 0; ji < 3; ji++) {
581  int j = 2-ji;
582  ip = valib_find_pivot3(A,j,0);
583  if (ip == -1) {
584  if (debug) {
585  printf("There is no meaningful pivot in the %d-th column.\n",j);
586  }
587  num_zero_cols++;
588  i_zero_col = j;
589  }
590  }
591 
592  if (num_zero_cols > 0) {
593  if (num_zero_cols > 1) {
594  if (debug) {
595  printf("Oops! The matrix has more than one zero columns. I search only for 1-dimensional nullspace.\n");
596  }
597  *info = -1;
598  return;
599  }
600  else {
601  x[i_zero_col] = 1.;
602  *info = 0;
603  return;
604  }
605  }
606 
607  // in the usual case, permute the rows and eliminate first column
608  if (ip != 0) {
609  for (int j = 0; j < 3; j++) {
610  valib_swap_values(&A[j*3], &A[ip+j*3]);
611  }
612  }
613 
614  if (debug) {
615  printf("Matrix in GEM after 1st swap: \n");
616  for (int i = 0; i < 3; i++) {
617  for (int j = 0; j < 3; j++) {
618  printf(" %lf ", A[i+j*3]);
619  }
620  printf("\n");
621  }
622  }
623 
624  VA_REAL coef;
625 
626  // eliminate the first column using the pivot
627  for (int i = 1; i < 3; i++) {
628  coef = A[i] / A[0];
629  for (int j = 0; j < 3; j++) {
630  A[i+j*3] -= coef*A[j*3];
631  }
632  }
633 
634  if (debug) {
635  printf("Matrix in GEM without 1st col: \n");
636  for (int i = 0; i < 3; i++) {
637  for (int j = 0; j < 3; j++) {
638  printf(" %lf ", A[i+j*3]);
639  }
640  printf("\n");
641  }
642  }
643 
644  // now work on the second column
645  int jpiv, jfree;
646  ip = valib_find_pivot3(A,1,1);
647  if (ip == -1) {
648  // the second column is not a pivot one, we can search for the nullspace
649  jpiv = 2;
650  jfree = 1;
651  }
652  else {
653  jpiv = 1;
654  jfree = 2;
655  }
656 
657  ip = valib_find_pivot3(A,jpiv,1);
658  if (ip == -1) {
659  if (debug) {
660  printf("Something is wrong with the matrix, the defect seems larger than one.");
661  }
662  *info = -2;
663  return;
664  }
665  if (ip == 2) {
666  // swap the rows
667  for (int j = 0; j < 3; j++) {
668  valib_swap_values(&A[1+j*3], &A[2+j*3]);
669  }
670  }
671 
672  // eliminate the last row
673  coef = A[2+jpiv*3] / A[1+jpiv*3];
674  for (int j = 0; j < 3; j++) {
675  A[2+j*3] -= coef*A[1+j*3];
676  }
677  // eliminate the first row
678  coef = A[0+jpiv*3] / A[1+jpiv*3];
679  for (int j = 0; j < 3; j++) {
680  A[j*3] -= coef*A[1+j*3];
681  }
682 
683  // check that the last row, in particular the last entry, is zero
684  if (valib_find_pivot3(A,2,2) != -1) {
685  if (debug) {
686  printf("Something is wrong, the matrix seems to be full rank.\n");
687  }
688  *info = -2;
689  return;
690  }
691 
692  if (debug) {
693  printf("Matrix in GEM before dividing by diagonal: \n");
694  for (int i = 0; i < 3; i++) {
695  for (int j = 0; j < 3; j++) {
696  printf(" %lf ", A[i+j*3]);
697  }
698  printf("\n");
699  }
700  }
701 
702  // finalize the Gauss-Jordan elimination by dividing with the diagonal values
703  coef = A[0];
704  for (int j = 0; j < 3; j++) {
705  A[j*3] /= coef;
706  }
707  coef = A[1+jpiv*3];
708  for (int j = 0; j < 3; j++) {
709  A[1+j*3] /= coef;
710  }
711 
712  if (debug) {
713  printf("Matrix in GEM in the upper right echelon form:\n");
714  for (int i = 0; i < 3; i++) {
715  for (int j = 0; j < 3; j++) {
716  printf(" %d %lf ", i+j*3, A[i+j*3]);
717  }
718  printf("\n");
719  }
720  }
721 
722  // fill the nullspace basis vector
723  x[jfree] = 1.;
724  x[jpiv] = -A[jpiv+jfree*3];
725  x[0] = -A[jfree*3];
726 
727  // normalize the basis vector
728  VA_REAL norm = sqrt(valib_scalar_prod3(&x[0], &x[0]));
729  for (int i = 0; i < 3; i++) {
730  x[i] /= norm;
731  }
732 
733  *info = 0;
734 }
735 
736 
737 /***************************************************************************/
743 VA_DEVICE_FUN void valib_constructQ3(VA_REAL sina, VA_REAL cosa,
744  VA_REAL sinb, VA_REAL cosb,
745  VA_REAL sing, VA_REAL cosg,
746  VA_REAL *Q )
747 {
748  Q[0] = cosa*cosb*cosg - sina*sing;
749  Q[1] = -cosa*cosb*sing - sina*cosg;
750  Q[2] = cosa*sinb;
751  Q[3] = sina*cosb*cosg + cosa*sing;
752  Q[4] = -sina*cosb*sing + cosa*cosg;
753  Q[5] = sina*sinb;
754  Q[6] = -sinb*cosg;
755  Q[7] = sinb*sing;
756  Q[8] = cosb;
757 }
758 
759 /***************************************************************************/
765 VA_DEVICE_FUN void valib_constructQfromN3(VA_REAL *n, VA_REAL *Q)
766 {
767  VA_REAL vec[3];
768  VA_REAL factor;
769 
770  // initialize the first row of Q with n
771  Q[0] = n[0]; Q[1] = n[1]; Q[2] = n[2];
772 
773  // fill some entries to initialize the other entries in matrix Q
774  Q[3] = n[1]; Q[4] = n[2]; Q[5] = n[0];
775  Q[6] = n[2]; Q[7] = n[0]; Q[8] = n[1];
776 
777  // perform Gram-Schmidt orthogonalization
779 
780  // swap the first and the third column - at the moment, the matrix contains
781  // | z y x |
782  int i;
783  for (i = 0; i < 3; i++) {
784  valib_swap_values(&Q[i], &Q[6+i]);
785  }
786 
787  // verify that the matrix has a right-hand oriented coordinate system,
788  // Q_1 x Q_2 = Q_3
789  valib_cross_prod3(&Q[0], &Q[3], vec);
790 
791  // revert sign of the new x-axis to keep right-hand oriented coordinate
792  // system
793  factor = valib_scalar_prod3(vec, &Q[6]);
794  if (factor < 0.) {
795  for (i = 0; i < 3; i++) {
796  Q[i] = -Q[i];
797  }
798  }
799 
800  // transpose the matrix
801  valib_transpose3(Q);
802 }
803 
804 /***************************************************************************/
808 #endif // VA_LINALG3_H
valib_vec_zero3
VA_DEVICE_FUN void valib_vec_zero3(VA_REAL *v)
Definition: linalg3.h:184
valib_constructQfromN3
VA_DEVICE_FUN void valib_constructQfromN3(VA_REAL *n, VA_REAL *Q)
Definition: linalg3.h:765
valib_tatt3
VA_DEVICE_FUN void valib_tatt3(VA_REAL *A, VA_REAL *T, VA_REAL *TATT)
Definition: linalg3.h:406
valib_cubic_root
VA_DEVICE_FUN VA_REAL valib_cubic_root(VA_REAL x)
Definition: linalg3.h:29
valib_scalar_prod3
VA_DEVICE_FUN VA_REAL valib_scalar_prod3(VA_REAL *v1, VA_REAL *v2)
Definition: linalg3.h:196
valib_sign
VA_DEVICE_FUN VA_REAL valib_sign(VA_REAL a, VA_REAL b)
Definition: linalg3.h:20
valib_transpose3
VA_DEVICE_FUN void valib_transpose3(VA_REAL *A)
Definition: linalg3.h:307
valib_determinant3
VA_DEVICE_FUN void valib_determinant3(VA_REAL *A, VA_REAL *det)
Definition: linalg3.h:293
valib_rank1_update3
VA_DEVICE_FUN void valib_rank1_update3(VA_REAL alpha, VA_REAL *x, VA_REAL *y, VA_REAL *A)
Definition: linalg3.h:383
valib_mat_copy3
VA_DEVICE_FUN void valib_mat_copy3(VA_REAL *A, VA_REAL *B)
Definition: linalg3.h:243
valib_matvec3_prod
VA_DEVICE_FUN void valib_matvec3_prod(int trans_a, VA_REAL *A, VA_REAL *x, VA_REAL *y)
Definition: linalg3.h:361
valib_cross_prod3
VA_DEVICE_FUN void valib_cross_prod3(VA_REAL *v1, VA_REAL *v2, VA_REAL *v3)
Definition: linalg3.h:211
valib_gram_schmidt3
VA_DEVICE_FUN void valib_gram_schmidt3(VA_REAL *Q)
Definition: linalg3.h:457
valib_max
VA_DEVICE_FUN VA_REAL valib_max(VA_REAL a, VA_REAL b)
Definition: linalg3.h:39
valib_eigenvalues_sym3
VA_DEVICE_FUN void valib_eigenvalues_sym3(VA_REAL *A, VA_REAL *eigval)
Definition: linalg3.h:486
valib_trace3
VA_DEVICE_FUN void valib_trace3(VA_REAL *A, VA_REAL *tr3)
Definition: linalg3.h:273
valib_min
VA_DEVICE_FUN VA_REAL valib_min(VA_REAL a, VA_REAL b)
Definition: linalg3.h:49
valib_find_nullspace3
VA_DEVICE_FUN void valib_find_nullspace3(VA_REAL *A, VA_REAL *x, int *info)
Definition: linalg3.h:569
valib_solve_cubic_equation
VA_DEVICE_FUN void valib_solve_cubic_equation(VA_REAL a, VA_REAL b, VA_REAL c, VA_REAL d, VA_REAL complex *x1, VA_REAL complex *x2, VA_REAL complex *x3, int *info)
Definition: linalg3.h:74
valib_norm_frobenius3
VA_DEVICE_FUN void valib_norm_frobenius3(VA_REAL *A, VA_REAL *norm)
Definition: linalg3.h:257
valib_sym_antisym3
VA_DEVICE_FUN void valib_sym_antisym3(VA_REAL *A)
Definition: linalg3.h:320
valib_matmat3_prod
VA_DEVICE_FUN void valib_matmat3_prod(int trans_a, int trans_b, VA_REAL *A, VA_REAL *B, VA_REAL *C)
Definition: linalg3.h:429
valib_constructQ3
VA_DEVICE_FUN void valib_constructQ3(VA_REAL sina, VA_REAL cosa, VA_REAL sinb, VA_REAL cosb, VA_REAL sing, VA_REAL cosg, VA_REAL *Q)
Definition: linalg3.h:743
valib_mat_zero3
VA_DEVICE_FUN void valib_mat_zero3(VA_REAL *A)
Definition: linalg3.h:229
valib_second_invariant3
VA_DEVICE_FUN void valib_second_invariant3(VA_REAL *A, VA_REAL *second_invariant)
Definition: linalg3.h:282
valib_find_pivot3
VA_DEVICE_FUN int valib_find_pivot3(VA_REAL *A, int jcol, int start)
Definition: linalg3.h:542
valib_swap_values
VA_DEVICE_FUN void valib_swap_values(VA_REAL *a, VA_REAL *b)
Definition: linalg3.h:58
valib_deviatorise3
VA_DEVICE_FUN void valib_deviatorise3(VA_REAL *A)
Definition: linalg3.h:344