39 USAGE(
"HEEVD",
"N LDA",
40 " - N : size of the matrix A\n"
41 " - LDA : leading dimension of the matrix A\n");
45 int N = atoi(argv[0]);
46 int LDA = atoi(argv[1]);
49 double eps = LAPACKE_dlamch_work(
'e');
56 int info_solution = 0;
57 int info_reduction = 0;
65 double *W1 = (
double *)malloc(N*
sizeof(
double));
66 double *W2 = (
double *)malloc(N*
sizeof(
double));
72 printf(
"Out of Memory \n ");
89 LAPACKE_zlatms_work( LAPACK_COL_MAJOR, N, N,
100 LAPACKE_dlasrt_work(
'I', N, W1 );
102 if (getenv(
"PLASMA_TESTING_VERBOSE"))
104 printf(
"Eigenvalues original\n");
105 for (i = 0; i <
min(N,25); i++){
106 printf(
"%f \n", W1[i]);
116 LAPACKE_zlacpy_work(LAPACK_COL_MAJOR,
'A', N, N, A2, LDA, A1, LDA);
122 if (getenv(
"PLASMA_TESTING_VERBOSE"))
124 printf(
"Eigenvalues computed\n");
125 for (i = 0; i <
min(N,25); i++){
126 printf(
"%f \n", W2[i]);
132 printf(
"------ TESTS FOR PLASMA ZHEEVD ROUTINE ------- \n");
133 printf(
" Size of the Matrix %d by %d\n", N, N);
135 printf(
" The matrix A is randomly generated for each test.\n");
136 printf(
"============\n");
137 printf(
" The relative machine precision (eps) is to be %e \n",eps);
138 printf(
" Computational tests pass if scaled residuals are less than 60.\n");
151 if ( (info_solution == 0) & (info_ortho == 0) & (info_reduction == 0) ) {
152 printf(
"***************************************************\n");
153 printf(
" ---- TESTING ZHEEVD ...................... PASSED !\n");
154 printf(
"***************************************************\n");
157 printf(
"************************************************\n");
158 printf(
" - TESTING ZHEEVD ... FAILED !\n");
159 printf(
"************************************************\n");
167 if (Q != NULL) free(Q);
168 if (A1 != NULL) free(A1);
181 double normQ, result;
183 int minMN =
min(M, N);
184 double *work = (
double *)malloc(minMN*
sizeof(
double));
188 LAPACKE_zlaset_work(LAPACK_COL_MAJOR,
'A', minMN, minMN, 0., 1., Id, minMN);
192 cblas_zherk(
CblasColMajor,
CblasUpper,
CblasConjTrans, N, M, alpha, Q, LDQ, beta, Id, N);
194 cblas_zherk(
CblasColMajor,
CblasUpper,
CblasNoTrans, M, N, alpha, Q, LDQ, beta, Id, M);
198 result = normQ / (minMN * eps);
199 printf(
"============\n");
200 printf(
"Checking the orthogonality of Q \n");
201 printf(
"||Id-Q'*Q||_oo / (minMN*eps) = %e \n", result);
203 if ( isnan(result) || isinf(result) || (result > 60.0) ) {
204 printf(
"-- Orthogonality is suspicious ! \n");
208 printf(
"-- Orthogonality is CORRECT ! \n");
212 free(work); free(Id);
225 double Anorm, Rnorm, result;
232 double *work = (
double *)malloc(N*
sizeof(
double));
237 LAPACKE_zlacpy_work(LAPACK_COL_MAJOR,
lapack_const(uplo), N, N, A2, LDA, T, N);
239 printf(
"============\n");
240 printf(
"Checking the tridiagonal reduction \n");
245 for (i = 0; i < N; i++)
246 for (j =
max(0, i-bw); j < i; j++)
247 T[i*N+j] =
conj(T[j*N+i]);
251 cblas_zgemm(
CblasColMajor,
CblasNoTrans,
CblasNoTrans, N, N, N,
CBLAS_SADDR(alpha), Q, LDA, T, N,
CBLAS_SADDR(beta), Aorig, N);
252 cblas_zgemm(
CblasColMajor,
CblasNoTrans,
CblasConjTrans, N, N, N,
CBLAS_SADDR(alpha), Aorig, N, Q, LDA,
CBLAS_SADDR(beta), T, N);
257 for (i = 0; i < N; i++)
258 for (j = i+1 ; j <
min(i+bw, N); j++)
259 T[i*N+j] =
conj(T[j*N+i]);
263 cblas_zgemm(
CblasColMajor,
CblasConjTrans,
CblasNoTrans, N, N, N,
CBLAS_SADDR(alpha), Q, LDA, T, N,
CBLAS_SADDR(beta), Aorig, N);
264 cblas_zgemm(
CblasColMajor,
CblasNoTrans,
CblasNoTrans, N, N, N,
CBLAS_SADDR(alpha), Aorig, N, Q, LDA,
CBLAS_SADDR(beta), T, N);
268 for (i = 0; i < N; i++)
269 for (j = 0 ; j < N; j++)
270 Residual[j*N+i] = A1[j*LDA+i] - T[j*N+i];
275 result = Rnorm / ( Anorm * N * eps);
277 printf(
"-- ||A-Q*T*Q'||_oo/(||A||_oo.N.eps) = %e \n", result);
279 printf(
"-- ||A-Q'*T*Q||_oo/(||A||_oo.N.eps) = %e \n", result);
281 if ( isnan(result) || isinf(result) || (result > 60.0) ) {
282 printf(
"-- Reduction is suspicious ! \n");
286 printf(
"-- Reduction is CORRECT ! \n");
290 free(Aorig); free(Residual); free(T);
292 return info_reduction;
296 static int check_solution(
int N,
double *E1,
double *E2,
double eps)
298 int info_solution, i;
301 double maxel = fabs( fabs(E1[0]) - fabs(E2[0]) );
302 double maxeig =
max( fabs(E1[0]), fabs(E2[0]) );
303 for (i = 1; i < N; i++){
304 resid = fabs(fabs(E1[i])-fabs(E2[i]));
305 maxtmp =
max(fabs(E1[i]), fabs(E2[i]));
308 maxeig =
max(maxtmp, maxeig);
309 maxel =
max(resid, maxel );
312 maxel = maxel / (maxeig * N * eps);
313 printf(
" ======================================================\n");
314 printf(
" | D - eigcomputed | / (|D| * N * eps) : %15.3E \n", maxel );
315 printf(
" ======================================================\n");
317 printf(
"============\n");
318 printf(
"Checking the eigenvalues of A\n");
319 if ( isnan(maxel) || isinf(maxel) || (maxel > 100) ) {
320 printf(
"-- The eigenvalues are suspicious ! \n");
324 printf(
"-- The eigenvalues are CORRECT ! \n");
328 return info_solution;