29 static int check_solution(
int,
int,
double*,
int,
double*,
double*,
int,
double);
35 USAGE(
"CPOSV",
"N LDA NRHS LDB",
36 " - N : the size of the matrix\n"
37 " - LDA : leading dimension of the matrix A\n"
38 " - NRHS : number of RHS\n"
39 " - LDB : leading dimension of the RHS B\n");
43 int N = atoi(argv[0]);
44 int LDA = atoi(argv[1]);
45 int NRHS = atoi(argv[2]);
46 int LDB = atoi(argv[3]);
51 int info_solution = 0;
53 double *A1 = (
double *)malloc(LDA*N *
sizeof(
double));
54 double *A2 = (
double *)malloc(LDA*N *
sizeof(
double));
55 double *B1 = (
double *)malloc(LDB*NRHS*
sizeof(
double));
56 double *B2 = (
double *)malloc(LDB*NRHS*
sizeof(
double));
59 if ( (!A1) || (!A2) || (!B1) || (!B2) ){
60 printf(
"Out of Memory \n ");
64 eps = LAPACKE_dlamch_work(
'e');
79 printf(
"------ TESTS FOR PLASMA DSPOSV ROUTINE ------ \n");
80 printf(
" Size of the Matrix %d by %d\n", N, N);
82 printf(
" The matrix A is randomly generated for each test.\n");
83 printf(
"============\n");
84 printf(
" The relative machine precision (eps) is to be %e \n", eps);
85 printf(
" Computational tests pass if scaled residuals are less than 60.\n");
89 info =
PLASMA_dsposv(uplo, N, NRHS, A2, LDA, B1, LDB, B2, LDB, &ITER);
92 printf(
"PLASMA_dsposv is not completed: info = %d\n", info);
95 printf(
" Solution obtained with %d iterations\n", ITER);
98 info_solution =
check_solution(N, NRHS, A1, LDA, B1, B2, LDB, eps);
101 if (info_solution == 0){
102 printf(
"***************************************************\n");
103 printf(
" ---- TESTING DSPOSV ..................... PASSED !\n");
104 printf(
"***************************************************\n");
107 printf(
"***************************************************\n");
108 printf(
" - TESTING DSPOSV .. FAILED !\n");
109 printf(
"***************************************************\n");
112 free(A1); free(A2); free(B1); free(B2);
121 static int check_solution(
int N,
int NRHS,
double *A1,
int LDA,
double *B1,
double *B2,
int LDB,
double eps )
124 double Rnorm, Anorm, Xnorm, Bnorm, result;
126 double *work = (
double *)malloc(N*
sizeof(
double));
135 cblas_dgemm(
CblasColMajor,
CblasNoTrans,
CblasNoTrans, N, NRHS, N, (alpha), A1, LDA, B2, LDB, (beta), B1, LDB);
138 if (getenv(
"PLASMA_TESTING_VERBOSE"))
139 printf(
"||A||_oo=%f\n||X||_oo=%f\n||B||_oo=%f\n||A X - B||_oo=%e\n", Anorm, Xnorm, Bnorm, Rnorm );
141 result = Rnorm / ( (Anorm*Xnorm+Bnorm)*N*eps ) ;
142 printf(
"============\n");
143 printf(
"Checking the Residual of the solution \n");
144 printf(
"-- ||Ax-B||_oo/((||A||_oo||x||_oo+||B||_oo).N.eps) = %e \n", result);
146 if ( isnan(Xnorm) || isinf(Xnorm) || isnan(result) || isinf(result) || (result > 60.0) ) {
147 printf(
"-- The solution is suspicious ! \n");
151 printf(
"-- The solution is CORRECT ! \n");
157 return info_solution;