22 return (b < (VA_REAL) 0.) ? -fabs(a) : fabs(a);
32 #if defined(VA_USE_DOUBLE_PRECISION)
33 return make_cuDoubleComplex(a, b);
35 return make_cuFloatComplex(a, b);
38 #if defined(VA_USE_DOUBLE_PRECISION)
39 return make_hipDoubleComplex(a, b);
41 return make_hipFloatComplex(a, b);
55 #if defined(VA_USE_DOUBLE_PRECISION)
61 #if defined(VA_USE_DOUBLE_PRECISION)
78 #if defined(VA_USE_DOUBLE_PRECISION)
84 #if defined(VA_USE_DOUBLE_PRECISION)
102 return sqrt(ar*ar + ai*ai);
109VA_DEVICE_FUN VA_COMPLEX
valib_cadd(VA_COMPLEX a, VA_COMPLEX b)
125 VA_REAL cr = ar*br - ai*bi;
126 VA_REAL ci = ar*bi + ai*br;
136 return valib_sign(pow(fabs(x), (VA_REAL) 1.0/3.0), x);
146 return (a > b) ? a : b;
156 return (a < b) ? a : b;
189 VA_REAL c, VA_REAL d,
197 VA_REAL q = pow(b/(3.*a), (VA_REAL) 3.) - (b*c)/(6.*a*a) + d/(2.*a);
198 VA_REAL p = (3*a*c - b*b) / (9*a*a);
200 VA_REAL delta = p*p*p + q*q;
203 printf(
"q: %lf \n", q);
204 printf(
"p: %lf \n", p);
205 printf(
"delta: %lf \n", delta);
210 printf(
"This is a good case with two complex roots.\n");
215 printf(
"Discriminant is negative, this is not a good way to get roots.\n");
221 VA_REAL sr = sqrt(delta);
224 printf(
"sr: %lf \n", sr);
227 VA_REAL mqpsr = -q + sr;
228 VA_REAL mqmsr = -q - sr;
231 printf(
"mqpsr: %lf \n", mqpsr);
232 printf(
"mqmsr: %lf \n", mqmsr);
257 VA_REAL shift = -b/(3.*a);
271 VA_REAL check1 = a*(*x1)*(*x1)*(*x1) + b*(*x1)*(*x1) + c*(*x1) + d;
275 if (fabs(check1) > 1.e-5) {
276 printf(
"Check of x1 failed.");
279 printf(
"Check of x2 failed.");
282 printf(
"Check of x3 failed.");
304 for (i = 0; i < 3; i++) {
315 VA_REAL result = (VA_REAL) 0.;
317 for (i = 0; i < 3; i++)
319 result = result + v1[i]*v2[i];
330 v3[0] = v1[1] * v2[2] - v1[2] * v2[1];
331 v3[1] = v1[2] * v2[0] - v1[0] * v2[2];
332 v3[2] = v1[0] * v2[1] - v1[1] * v2[0];
349 for (j = 0; j < 3; j++) {
350 for (i = 0; i < 3; i++) {
363 for (j = 0; j < 3; j++) {
364 for (i = 0; i < 3; i++) {
378 for (j = 0; j < 3; j++) {
379 for (i = 0; i < 3; i++) {
380 *norm = *norm + A[j*3+i]*A[j*3+i];
392 *tr3 = A[0] + A[4] + A[8];
400 VA_REAL *second_invariant)
402 *second_invariant = ( A[0]*A[4] + A[4]*A[8] + A[0]*A[8] )
403 - ( A[1]*A[3] + A[2]*A[6] + A[5]*A[7] );
412 *det = A[0] * A[4] * A[8]
417 - A[6] * A[4] * A[2];
442 for (i = 0; i < 3; i++) {
443 for (j = i+1; j < 3; j++) {
447 A[i + j*3] = (VA_REAL) 0.5 * (ud + ld);
448 A[j + i*3] = (VA_REAL) 0.5 * (ld - ud);
468 A[0] = A[0] - (VA_REAL) (1./3.) * trace;
469 A[4] = A[4] - (VA_REAL) (1./3.) * trace;
470 A[8] = A[8] - (VA_REAL) (1./3.) * trace;
479 VA_REAL *x, VA_REAL *y)
482 for (i = 0; i < 3; i++) {
484 for (j = 0; j < 3; j++) {
486 y[i] = y[i] + A[j*3+i]*x[j];
489 y[i] = y[i] + A[i*3+j]*x[j];
501 VA_REAL *x, VA_REAL *y,
509 for (j = 0; j < 3; j++) {
511 for (i = 0; i < 3; i++) {
512 A[ind] = A[ind] + x[i]*tmp;
523VA_DEVICE_FUN
void valib_tatt3(VA_REAL *A, VA_REAL *T, VA_REAL *TATT)
532 for (i = 0; i < 3; i++) {
533 for (j = 0; j < 3; j++) {
547 VA_REAL *A, VA_REAL *B, VA_REAL *C)
550 for (i = 0; i < 3; i++) {
551 for (j = 0; j < 3; j++) {
552 for (k = 0; k < 3; k++) {
553 if (trans_a == 0 && trans_b == 0) {
554 C[j*3+i] = C[j*3+i] + A[k*3+i] * B[j*3+k];
556 else if (trans_a != 0 && trans_b == 0) {
557 C[j*3+i] = C[j*3+i] + A[i*3+k] * B[j*3+k];
559 else if (trans_a == 0 && trans_b != 0) {
560 C[j*3+i] = C[j*3+i] + A[k*3+i] * B[k*3+j];
563 C[j*3+i] = C[j*3+i] + A[i*3+k] * B[k*3+j];
575VA_DEVICE_FUN
void valib_ttat3(VA_REAL *A, VA_REAL *T, VA_REAL *TTAT)
599 for (j = 0; j < 3; j++) {
600 for (i = 0; i < j; i++) {
605 for (k = 0; k < 3; k++) {
606 Q[j*3+k] = Q[j*3+k] - factor * Q[i*3+k];
612 VA_REAL numerical_zero = 1.e-7;
613 if (factor > numerical_zero) {
615 for (k = 0; k < 3; k++) {
616 Q[j*3+k] = Q[j*3+k] / sqrt(factor);
631 VA_REAL IdevMod = Idev / 3.;
636 dev[0] = dev[0] - IdevMod;
637 dev[4] = dev[4] - IdevMod;
638 dev[8] = dev[8] - IdevMod;
643 VA_REAL IIdevMod = -IIdev / 3.;
648 VA_REAL IIIdevMod = 0.5 * IIIdev;
651 double dIIdevMod = IIdevMod;
652 double dIIIdevMod = IIIdevMod;
653 double daux = pow(dIIdevMod,3) - pow(dIIIdevMod,2);
659 phi = atan2( sqrt(daux), dIIIdevMod ) / 3.;
661 if (phi < 0.) phi += VA_PI / 3.;
664 eigval[0] = IdevMod + 2.*sqrt(IIdevMod) * cos(phi);
665 eigval[1] = IdevMod - sqrt(IIdevMod) * (cos(phi) + sqrt(3.) * sin(phi));
666 eigval[2] = IdevMod - sqrt(IIdevMod) * (cos(phi) - sqrt(3.) * sin(phi));
686 for (
int i = start+1; i<3; i++) {
687 if (fabs(A[i+jcol*3]) > fabs(A[ipiv+jcol*3]))
691 VA_REAL numerical_zero = 1.e-5;
692 if (fabs(A[ipiv+jcol*3]) < numerical_zero) {
694 printf(
"Warning: no nonzero pivot in column %d.\n", jcol);
714 x[0] = 0.; x[1] = 0.; x[2] = 0.;
717 int num_zero_cols = 0;
720 for (
int ji = 0; ji < 3; ji++) {
725 printf(
"There is no meaningful pivot in the %d-th column.\n",j);
732 if (num_zero_cols > 0) {
733 if (num_zero_cols > 1) {
735 printf(
"Oops! The matrix has more than one zero columns. I search only for 1-dimensional nullspace.\n");
749 for (
int j = 0; j < 3; j++) {
755 printf(
"Matrix in GEM after 1st swap: \n");
756 for (
int i = 0; i < 3; i++) {
757 for (
int j = 0; j < 3; j++) {
758 printf(
" %lf ", A[i+j*3]);
767 for (
int i = 1; i < 3; i++) {
769 for (
int j = 0; j < 3; j++) {
770 A[i+j*3] -= coef*A[j*3];
775 printf(
"Matrix in GEM without 1st col: \n");
776 for (
int i = 0; i < 3; i++) {
777 for (
int j = 0; j < 3; j++) {
778 printf(
" %lf ", A[i+j*3]);
800 printf(
"Matrix in GEM when it should not find another pivot: \n");
801 for (
int i = 0; i < 3; i++) {
802 for (
int j = 0; j < 3; j++) {
803 printf(
" %lf ", A[i+j*3]);
807 printf(
"Something is wrong with the matrix, the defect seems larger than one.");
814 for (
int j = 0; j < 3; j++) {
820 coef = A[2+jpiv*3] / A[1+jpiv*3];
821 for (
int j = 0; j < 3; j++) {
822 A[2+j*3] -= coef*A[1+j*3];
825 coef = A[0+jpiv*3] / A[1+jpiv*3];
826 for (
int j = 0; j < 3; j++) {
827 A[j*3] -= coef*A[1+j*3];
834 printf(
"Matrix in GEM when it should not find last pivot: \n");
835 for (
int i = 0; i < 3; i++) {
836 for (
int j = 0; j < 3; j++) {
837 printf(
" %lf ", A[i+j*3]);
842 printf(
"Warning: The matrix for finding eigenvectors seems to be full rank.\n");
848 printf(
"Matrix in GEM before dividing by diagonal: \n");
849 for (
int i = 0; i < 3; i++) {
850 for (
int j = 0; j < 3; j++) {
851 printf(
" %lf ", A[i+j*3]);
859 for (
int j = 0; j < 3; j++) {
863 for (
int j = 0; j < 3; j++) {
868 printf(
"Matrix in GEM in the upper right echelon form:\n");
869 for (
int i = 0; i < 3; i++) {
870 for (
int j = 0; j < 3; j++) {
871 printf(
" %d %lf ", i+j*3, A[i+j*3]);
879 x[jpiv] = -A[jpiv+jfree*3];
884 for (
int i = 0; i < 3; i++) {
899 VA_REAL sinb, VA_REAL cosb,
900 VA_REAL sing, VA_REAL cosg,
903 Q[0] = cosa*cosb*cosg - sina*sing;
904 Q[1] = -cosa*cosb*sing - sina*cosg;
906 Q[3] = sina*cosb*cosg + cosa*sing;
907 Q[4] = -sina*cosb*sing + cosa*cosg;
926 Q[0] = n[0]; Q[1] = n[1]; Q[2] = n[2];
929 Q[3] = n[1]; Q[4] = n[2]; Q[5] = n[0];
930 Q[6] = n[2]; Q[7] = n[0]; Q[8] = n[1];
938 for (i = 0; i < 3; i++) {
950 for (i = 0; i < 3; i++) {
VA_DEVICE_FUN VA_REAL valib_cubic_root(VA_REAL x)
VA_DEVICE_FUN VA_REAL valib_cimag(VA_COMPLEX a)
VA_DEVICE_FUN VA_COMPLEX valib_cmultiply(VA_COMPLEX a, VA_COMPLEX b)
VA_DEVICE_FUN void valib_cross_prod3(VA_REAL *v1, VA_REAL *v2, VA_REAL *v3)
VA_DEVICE_FUN void valib_tatt3(VA_REAL *A, VA_REAL *T, VA_REAL *TATT)
VA_DEVICE_FUN VA_COMPLEX valib_cadd(VA_COMPLEX a, VA_COMPLEX b)
VA_DEVICE_FUN void valib_rank1_update3(VA_REAL alpha, VA_REAL *x, VA_REAL *y, VA_REAL *A)
VA_DEVICE_FUN void valib_ttat3(VA_REAL *A, VA_REAL *T, VA_REAL *TTAT)
VA_DEVICE_FUN void valib_deviatorise3(VA_REAL *A)
VA_DEVICE_FUN VA_REAL valib_scalar_prod3(VA_REAL *v1, VA_REAL *v2)
VA_DEVICE_FUN void valib_vec_zero3(VA_REAL *v)
VA_DEVICE_FUN void valib_matvec3_prod(int trans_a, VA_REAL *A, VA_REAL *x, VA_REAL *y)
VA_DEVICE_FUN VA_REAL valib_min(VA_REAL a, VA_REAL b)
VA_DEVICE_FUN void valib_sym_antisym3(VA_REAL *A)
VA_DEVICE_FUN VA_COMPLEX valib_makec(VA_REAL a, VA_REAL b)
VA_DEVICE_FUN void valib_transpose3(VA_REAL *A)
VA_DEVICE_FUN void valib_mat_copy3(VA_REAL *A, VA_REAL *B)
VA_DEVICE_FUN VA_REAL valib_cabs(VA_COMPLEX a)
VA_DEVICE_FUN void valib_swap_values(VA_REAL *a, VA_REAL *b)
VA_DEVICE_FUN VA_REAL valib_square(VA_REAL a)
VA_DEVICE_FUN void valib_second_invariant3(VA_REAL *A, VA_REAL *second_invariant)
VA_DEVICE_FUN void valib_find_nullspace3(VA_REAL *A, VA_REAL *x, int *info)
VA_DEVICE_FUN void valib_gram_schmidt3(VA_REAL *Q)
VA_DEVICE_FUN void valib_constructQfromN3(VA_REAL *n, VA_REAL *Q)
VA_DEVICE_FUN int valib_find_pivot3(VA_REAL *A, int jcol, int start)
VA_DEVICE_FUN void valib_mat_zero3(VA_REAL *A)
VA_DEVICE_FUN VA_REAL valib_creal(VA_COMPLEX a)
VA_DEVICE_FUN void valib_solve_cubic_equation(VA_REAL a, VA_REAL b, VA_REAL c, VA_REAL d, VA_REAL *x1, VA_COMPLEX *x2, VA_COMPLEX *x3, int *info)
VA_DEVICE_FUN VA_REAL valib_sign(VA_REAL a, VA_REAL b)
VA_DEVICE_FUN void valib_eigenvalues_sym3(VA_REAL *A, VA_REAL *eigval)
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)
VA_DEVICE_FUN void valib_matmat3_prod(int trans_a, int trans_b, VA_REAL *A, VA_REAL *B, VA_REAL *C)
VA_DEVICE_FUN void valib_trace3(VA_REAL *A, VA_REAL *tr3)
VA_DEVICE_FUN void valib_norm_frobenius3(VA_REAL *A, VA_REAL *norm)
VA_DEVICE_FUN void valib_determinant3(VA_REAL *A, VA_REAL *det)
VA_DEVICE_FUN VA_REAL valib_max(VA_REAL a, VA_REAL b)