1 #include "test.h"
2 
3 datatype *A[2], *B[2], *C[2], *D[2], *E[2], *F[2], *Work, scale[2], dif[2];
4 int *iWork, lWork, info;
5 
6 #define xlascl XPREF(LAPACK(lascl))
7 void xlascl(const char *, const int *, const int *, const datatype *, const
8         datatype *, const int *, const int *, datatype *, const int *, int *);
9 
10 #define xscal XPREF(LAPACK(scal))
11 void xscal(const int *, const datatype *, datatype *, const int *);
12 
pre()13 void pre() {
14     int i;
15 
16     x2matgen(n, n, A[0], A[1]);
17     x2matgen(n, n, B[0], B[1]);
18     x2matgen(n, n, C[0], C[1]);
19     x2matgen(n, n, D[0], D[1]);
20     x2matgen(n, n, E[0], E[1]);
21     x2matgen(n, n, F[0], F[1]);
22 
23     for (i = 0; i < n; i++) {
24         // set diagonal
25         A[0][x1 * (i + n * i)] =
26         A[1][x1 * (i + n * i)] = (datatype) rand() / RAND_MAX;
27         E[0][x1 * (i + n * i)] =
28         E[1][x1 * (i + n * i)] = (datatype) rand() / RAND_MAX;
29         // clear first subdiagonal
30         A[0][x1 * (i + 1 + n * i)] =
31         A[1][x1 * (i + 1 + n * i)] =
32         B[0][x1 * (i + 1 + n * i)] =
33         B[1][x1 * (i + 1 + n * i)] =
34         A[0][x1 * (i + 1 + n * i) + x1 - 1] =
35         A[1][x1 * (i + 1 + n * i) + x1 - 1] =
36         B[0][x1 * (i + 1 + n * i) + x1 - 1] =
37         B[1][x1 * (i + 1 + n * i) + x1 - 1] = 0;
38     }
39 }
40 
41 
post()42 void post() {
43     if (scale[0] != 1 || scale[0] != 1)
44         printf("scale[RELAPACK] = %12g\tscale[LAPACK] = %12g\n", scale[0], scale[1]);
45     if (scale[0]) {
46         xlascl("G", iZERO, iZERO, &scale[0], &scale[1], &n, &n, C[0], &n, &info);
47         xlascl("G", iZERO, iZERO, &scale[0], &scale[1], &n, &n, F[0], &n, &info);
48     }
49     error = x2vecerr(n * n, C[0], C[1]) + x2vecerr(n * n, F[0], F[1]);
50 }
51 
tests()52 void tests() {
53     lWork = 2 * n * n;
54     A[0] = xmalloc(n * n);
55     A[1] = xmalloc(n * n);
56     B[0] = xmalloc(n * n);
57     B[1] = xmalloc(n * n);
58     C[0] = xmalloc(n * n);
59     C[1] = xmalloc(n * n);
60     D[0] = xmalloc(n * n);
61     D[1] = xmalloc(n * n);
62     E[0] = xmalloc(n * n);
63     E[1] = xmalloc(n * n);
64     F[0] = xmalloc(n * n);
65     F[1] = xmalloc(n * n);
66     Work = xmalloc(lWork);
67     iWork = imalloc(n + n + 2);
68 
69     #define ROUTINE XPREF(tgsyl)
70 
71     TEST("N", iZERO, &n, &n, A[i], &n, B[i], &n, C[i], &n, D[i], &n, E[i], &n, F[i], &n, &scale[i], &dif[i], Work, &lWork, iWork, &info);
72     TEST("N", iZERO, &n2, &n, A[i], &n, B[i], &n, C[i], &n, D[i], &n, E[i], &n, F[i], &n, &scale[i], &dif[i], Work, &lWork, iWork, &info);
73     TEST("N", iZERO, &n, &n2, A[i], &n, B[i], &n, C[i], &n, D[i], &n, E[i], &n, F[i], &n, &scale[i], &dif[i], Work, &lWork, iWork, &info);
74     TEST("N", iONE, &n, &n, A[i], &n, B[i], &n, C[i], &n, D[i], &n, E[i], &n, F[i], &n, &scale[i], &dif[i], Work, &lWork, iWork, &info);
75     TEST("N", iTWO, &n, &n, A[i], &n, B[i], &n, C[i], &n, D[i], &n, E[i], &n, F[i], &n, &scale[i], &dif[i], Work, &lWork, iWork, &info);
76     TEST("N", iTHREE, &n, &n, A[i], &n, B[i], &n, C[i], &n, D[i], &n, E[i], &n, F[i], &n, &scale[i], &dif[i], Work, &lWork, iWork, &info);
77     TEST("N", iFOUR, &n, &n, A[i], &n, B[i], &n, C[i], &n, D[i], &n, E[i], &n, F[i], &n, &scale[i], &dif[i], Work, &lWork, iWork, &info);
78     TEST(xCTRANS, iZERO, &n, &n, A[i], &n, B[i], &n, C[i], &n, D[i], &n, E[i], &n, F[i], &n, &scale[i], &dif[i], Work, &lWork, iWork, &info);
79 
80     free(A[0]);
81     free(A[1]);
82     free(B[0]);
83     free(B[1]);
84     free(C[0]);
85     free(C[1]);
86     free(D[0]);
87     free(D[1]);
88     free(E[0]);
89     free(E[1]);
90     free(F[0]);
91     free(F[1]);
92     free(Work);
93     free(iWork);
94 }
95