void PLASMA_ALLOC_WORKSPACE_DSYGV(int *M, int *N, intptr_t **T, int *INFO) { *INFO = PLASMA_Alloc_Workspace_dsygv(*M, *N, (PLASMA_desc **)T); }
int testing_dsygv(int argc, char **argv) { /* Check for number of arguments*/ if (argc != 3) { USAGE("HEGV", "N LDA LDB", " - N : size of the matrices A and B\n" " - LDA : leading dimension of the matrix A\n" " - LDB : leading dimension of the matrix B\n"); return -1; } double eps = LAPACKE_dlamch_work('e'); PLASMA_enum vec = PlasmaNoVec; int N = atoi(argv[0]); int LDA = atoi(argv[1]); int LDB = atoi(argv[2]); int LDQ = LDA; int LDAxN = LDA*N; int LDBxN = LDB*N; int LDQxN = LDQ*N; int info_ortho = 0; int info_solution = 0; int info_reduction = 0; int i, u; double *A1 = (double *)malloc(LDAxN*sizeof(double)); double *A2 = (double *)malloc(LDAxN*sizeof(double)); double *B1 = (double *)malloc(LDBxN*sizeof(double)); double *B2 = (double *)malloc(LDBxN*sizeof(double)); double *Q = (double *)malloc(LDQxN*sizeof(double)); double *Ainit = (double *)malloc(LDAxN*sizeof(double)); double *Binit = (double *)malloc(LDBxN*sizeof(double)); double *W1 = (double *)malloc(N*sizeof(double)); double *W2 = (double *)malloc(N*sizeof(double)); double *work = (double *)malloc(3*N* sizeof(double)); PLASMA_desc *T; /* Check if unable to allocate memory */ if ((!A1)||(!A2)||(!B1)||(!B2)||(!Q)||(!Ainit)||(!Binit)){ printf("Out of Memory \n "); return -2; } /* PLASMA_Disable(PLASMA_AUTOTUNING); PLASMA_Set(PLASMA_TILE_SIZE, 120); PLASMA_Set(PLASMA_INNER_BLOCK_SIZE, 20); */ PLASMA_Enable(PLASMA_WARNINGS); PLASMA_Enable(PLASMA_ERRORS); PLASMA_Alloc_Workspace_dsygv(N, N, &T); /*---------------------------------------------------------- * TESTING DSYGV */ /* Initialize A1 and Ainit */ PLASMA_dplgsy(0., N, A1, LDA, 5198); LAPACKE_dlacpy_work(LAPACK_COL_MAJOR, 'A', N, N, A1, LDA, Ainit, LDA); /* Initialize B1 and Binit */ PLASMA_dplgsy((double)N, N, B1, LDB, 4321 ); LAPACKE_dlacpy_work(LAPACK_COL_MAJOR, 'A', N, N, B1, LDB, Binit, LDB); printf("\n"); printf("------ TESTS FOR PLASMA DSYGV ROUTINE ------- \n"); printf(" Size of the Matrix %d by %d\n", N, N); printf("\n"); printf(" The matrix A is randomly generated for each test.\n"); printf("============\n"); printf(" The relative machine precision (eps) is to be %e \n",eps); printf(" Computational tests pass if scaled residuals are less than 60.\n"); /*---------------------------------------------------------- * TESTING DSYGV */ for (i=0; i<3; i++) { for (u=0; u<2; u++) { LAPACKE_dlaset_work(LAPACK_COL_MAJOR, 'A', LDA, N, 0., 1., Q, LDA); memcpy(A2, Ainit, LDAxN*sizeof(double)); memcpy(B2, Binit, LDBxN*sizeof(double)); PLASMA_dsygv(itype[i], vec, uplo[u], N, A2, LDA, B2, LDB, W2, T, Q, LDQ); /* Check the orthogonality, reduction and the eigen solutions */ if (vec == PlasmaVec) info_ortho = check_orthogonality(N, N, Q, LDA, eps); /* * WARNING: For now, Q is associated to Band tridiagonal reduction and * not to the final tridiagonal reduction, so we can not call the check */ if (0) info_reduction = check_reduction(itype[i], uplo[u], N, 1, A1, A2, LDA, B2, LDB, Q, eps); memcpy(A1, Ainit, LDAxN*sizeof(double)); memcpy(B1, Binit, LDBxN*sizeof(double)); LAPACKE_dsygv( LAPACK_COL_MAJOR, itype[i], lapack_const(vec), lapack_const(uplo[u]), N, A1, LDA, B1, LDB, W1); /*info_solution = check_solution(N, N, N, A1, LDA, B1, B2, LDB, eps);*/ info_solution = check_solution(N, W1, W2, eps); if ( (info_ortho == 0) & (info_reduction == 0) & (info_solution == 0)) { printf("***************************************************\n"); printf(" ---- TESTING DSYGV (%s, %s) ...................... PASSED !\n", itypestr[i], uplostr[u]); printf("***************************************************\n"); } else { printf("************************************************\n"); printf(" - TESTING DSYGV (%s, %s) ... FAILED !\n", itypestr[i], uplostr[u]); printf("************************************************\n"); } } } PLASMA_Dealloc_Handle_Tile(&T); free(A1); free(A2); free(B1); free(B2); free(Q); free(Ainit); free(Binit); free(W1); free(W2); free(work); return 0; }