From fb5f85cc17151a89fa0c4d0a9ec94c89d622504f Mon Sep 17 00:00:00 2001 From: Raphael Boucherie <raphael.boucherie@inria.fr> Date: Mon, 22 May 2017 14:57:35 +0200 Subject: [PATCH] removed param --- testing/CMakeLists.txt | 1 - testing/testing_zauxiliary.c | 3 - testing/testing_zauxiliary.h | 1 - testing/testing_zgels_param.c | 510 ---------------------------------- 4 files changed, 515 deletions(-) delete mode 100644 testing/testing_zgels_param.c diff --git a/testing/CMakeLists.txt b/testing/CMakeLists.txt index 8e440b48f..b8d07a963 100644 --- a/testing/CMakeLists.txt +++ b/testing/CMakeLists.txt @@ -64,7 +64,6 @@ set(ZSRC # LAPACK ################## testing_zgels.c - testing_zgels_param.c testing_zgels_hqr.c testing_zgels_systolic.c #testing_zgesv.c diff --git a/testing/testing_zauxiliary.c b/testing/testing_zauxiliary.c index 3b0b92075..f1f061213 100644 --- a/testing/testing_zauxiliary.c +++ b/testing/testing_zauxiliary.c @@ -248,9 +248,6 @@ int main (int argc, char **argv) else if ( strcmp(func, "GESV_INCPIV") == 0 ) { info += testing_zgesv_incpiv( argc, argv ); } - else if ( strcmp(func, "GELS_PARAM") == 0 ) { - info += testing_zgels_param( argc, argv ); - } else if ( strcmp(func, "GELS_HQR") == 0 ) { info += testing_zgels_hqr( argc, argv ); } diff --git a/testing/testing_zauxiliary.h b/testing/testing_zauxiliary.h index e652e085a..2285df339 100644 --- a/testing/testing_zauxiliary.h +++ b/testing/testing_zauxiliary.h @@ -92,7 +92,6 @@ int testing_zgeadd(int argc, char **argv); int testing_zposv(int argc, char **argv); int testing_zgels(int argc, char **argv); -int testing_zgels_param(int argc, char **argv); int testing_zgels_hqr(int argc, char **argv); int testing_zgels_systolic(int argc, char **argv); int testing_zgesv(int argc, char **argv); diff --git a/testing/testing_zgels_param.c b/testing/testing_zgels_param.c deleted file mode 100644 index cebf4300e..000000000 --- a/testing/testing_zgels_param.c +++ /dev/null @@ -1,510 +0,0 @@ -/** - * - * @copyright (c) 2009-2014 The University of Tennessee and The University - * of Tennessee Research Foundation. - * All rights reserved. - * @copyright (c) 2012-2014 Inria. All rights reserved. - * @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. - * - **/ - -/** - * - * @file testing_zgels_param.c - * - * MORSE testing routines - * MORSE is a software package provided by Univ. of Tennessee, - * Univ. of California Berkeley and Univ. of Colorado Denver - * - * @version 2.5.0 - * @comment This file has been automatically generated - * from Plasma 2.5.0 for MORSE 1.0.0 - * @author Bilel Hadri - * @author Hatem Ltaief - * @author Mathieu Faverge - * @author Emmanuel Agullo - * @author Cedric Castagnede - * @author Boucherie Raphael - * @date 2010-11-15 - * @precisions normal z -> c d s - * - **/ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <math.h> -#include <assert.h> - -#include <morse.h> -#include <coreblas/include/cblas.h> -#include <coreblas/include/lapacke.h> -#include <coreblas/include/coreblas.h> -#include "testing_zauxiliary.h" - -#undef REAL -#define COMPLEX - -static int check_orthogonality(int, int, int, MORSE_Complex64_t*, double); -static int check_factorization(int, int, MORSE_Complex64_t*, MORSE_Complex64_t*, int, MORSE_Complex64_t*, double); -static int check_solution(int, int, int, MORSE_Complex64_t*, int, MORSE_Complex64_t*, MORSE_Complex64_t*, int, double); - -int testing_zgels_param(int argc, char **argv) -{ - int hres = 0; - - if ( argc < 1 ){ - goto usage; - } - - /* Check for number of arguments*/ - if ( argc != 5 ) { - usage: - USAGE("GELS_PARAM", "M N LDA NRHS LDB", - " - M : number of rows of the matrix A\n" - " - N : number of columns of the matrix A\n" - " - LDA : leading dimension of the matrix A\n" - " - NRHS : number of RHS\n" - " - LDB : leading dimension of the matrix B\n"); - return -1; - } - - int M = atoi(argv[0]); - int N = atoi(argv[1]); - int LDA = max( atoi(argv[2]), M ); - int NRHS = atoi(argv[3]); - int LDB = max( max( atoi(argv[4]), M ), N ); - libhqr_tree_t qrtree; - libhqr_tiledesc_t matrix; - - int K = min(M, N); - double eps; - int info_ortho, info_solution, info_factorization; - int LDAxN = LDA*N; - int LDBxNRHS = LDB*NRHS; - int domino, tsrr, llvl, hlvl, qr_a, qr_p; - - MORSE_Complex64_t *A1 = (MORSE_Complex64_t *)malloc(LDA*N*sizeof(MORSE_Complex64_t)); - MORSE_Complex64_t *A2 = (MORSE_Complex64_t *)malloc(LDA*N*sizeof(MORSE_Complex64_t)); - MORSE_Complex64_t *B1 = (MORSE_Complex64_t *)malloc(LDB*NRHS*sizeof(MORSE_Complex64_t)); - MORSE_Complex64_t *B2 = (MORSE_Complex64_t *)malloc(LDB*NRHS*sizeof(MORSE_Complex64_t)); - MORSE_Complex64_t *Q = (MORSE_Complex64_t *)malloc(LDA*N*sizeof(MORSE_Complex64_t)); - MORSE_desc_t *TS; - MORSE_desc_t *TT = NULL; - - /* Check if unable to allocate memory */ - if ((!A1)||(!A2)||(!B1)||(!B2)||(!Q)){ - printf("Out of Memory \n "); - return -2; - } - - MORSE_Alloc_Workspace_zgels(M, N, &TS, 1, 1); - MORSE_Alloc_Workspace_zgels(M, N, &TT, 1, 1); - memset(TS->mat, 0, (TS->llm*TS->lln)*sizeof(MORSE_Complex64_t)); - memset(TT->mat, 0, (TT->llm*TT->lln)*sizeof(MORSE_Complex64_t)); - - eps = LAPACKE_dlamch_work( 'e' ); - - /*---------------------------------------------------------- - * TESTING ZGEQRF_PARAM - */ - - /* Initialize matrix */ - matrix.mt = TS->mt; - matrix.nt = TS->nt; - matrix.nodes = 1; - matrix.p = 1; - - /* Initialize qrtree */ - domino = -1; /* -1 */ - llvl = -1; /* -1 */ - hlvl = -1; /* -1 */ - qr_a = ( M >= N ) ? -1 : TS->nt; /* -1 */ - qr_p = 1; /* matrix.p */ - tsrr = 0; /* 0 */ - - libhqr_hqr_init( &qrtree, - ( M >= N ) ? LIBHQR_QR : LIBHQR_LQ, - &matrix, llvl, hlvl, qr_a, qr_p, domino, tsrr ); - - /* Initialize A1 and A2 */ - LAPACKE_zlarnv_work(IONE, ISEED, LDAxN, A1); - LAPACKE_zlacpy_work(LAPACK_COL_MAJOR, 'A', M, N, A1, LDA, A2, LDA ); - - /* Initialize B1 and B2 */ - memset(B2, 0, LDB*NRHS*sizeof(MORSE_Complex64_t)); - LAPACKE_zlarnv_work(IONE, ISEED, LDBxNRHS, B1); - LAPACKE_zlacpy_work(LAPACK_COL_MAJOR, 'A', M, NRHS, B1, LDB, B2, LDB ); - - /* MORSE ZGELS */ - MORSE_zgels_param(&qrtree, MorseNoTrans, M, N, NRHS, A2, LDA, TS, TT, B2, LDB); - - /* MORSE ZGELS */ - if (M >= N) - /* Building the economy-size Q */ - MORSE_zungqr_param(&qrtree, M, N, K, A2, LDA, TS, TT, Q, LDA); - else - /* Building the economy-size Q */ - MORSE_zunglq_param(&qrtree, M, N, K, A2, LDA, TS, TT, Q, LDA); - - printf("\n"); - printf("------ TESTS FOR CHAMELEON ZGELS_PARAM ROUTINE ------- \n"); - printf(" Size of the Matrix %d by %d\n", M, 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"); - - /* Check the orthogonality, factorization and the solution */ - info_ortho = check_orthogonality(M, N, LDA, Q, eps); - info_factorization = check_factorization(M, N, A1, A2, LDA, Q, eps); - info_solution = check_solution(M, N, NRHS, A1, LDA, B1, B2, LDB, eps); - - if ((info_solution == 0)&(info_factorization == 0)&(info_ortho == 0)) { - printf("***************************************************\n"); - printf(" ---- TESTING ZGELS_PARAM ............... PASSED !\n"); - printf("***************************************************\n"); - } - else { - printf("************************************************\n"); - printf(" - TESTING ZGELS_PARAM ... FAILED !\n"); hres++; - printf("************************************************\n"); - } - - /*------------------------------------------------------------- - * TESTING ZGEQRF + ZGEQRS or ZGELQF + ZGELQS - */ - /* Initialize A1 and A2 */ - LAPACKE_zlarnv_work(IONE, ISEED, LDAxN, A1); - LAPACKE_zlacpy_work(LAPACK_COL_MAJOR, 'A', M, N, A1, LDA, A2, LDA ); - - /* Initialize B1 and B2 */ - memset(B2, 0, LDB*NRHS*sizeof(MORSE_Complex64_t)); - LAPACKE_zlarnv_work(IONE, ISEED, LDBxNRHS, B1); - LAPACKE_zlacpy_work(LAPACK_COL_MAJOR, 'A', M, NRHS, B1, LDB, B2, LDB ); - - if (M >= N) { - printf("\n"); - printf("------ TESTS FOR CHAMELEON ZGEQRF + ZGEQRS ROUTINE ------- \n"); - printf(" Size of the Matrix %d by %d\n", M, 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"); - - /* Morse routines */ - MORSE_zgeqrf_param( &qrtree, M, N, A2, LDA, TS, TT ); - MORSE_zungqr_param( &qrtree, M, N, K, A2, LDA, TS, TT, Q, LDA); - MORSE_zgeqrs_param( &qrtree, M, N, NRHS, A2, LDA, TS,TT, B2, LDB); - - /* Check the orthogonality, factorization and the solution */ - info_ortho = check_orthogonality(M, N, LDA, Q, eps); - info_factorization = check_factorization(M, N, A1, A2, LDA, Q, eps); - info_solution = check_solution(M, N, NRHS, A1, LDA, B1, B2, LDB, eps); - - if ((info_solution == 0)&(info_factorization == 0)&(info_ortho == 0)) { - printf("***************************************************\n"); - printf(" ---- TESTING ZGEQRF + ZGEQRS ............ PASSED !\n"); - printf("***************************************************\n"); - } - else{ - printf("***************************************************\n"); - printf(" - TESTING ZGEQRF + ZGEQRS ... FAILED !\n"); - printf("***************************************************\n"); - } - } - else { - printf("\n"); - printf("------ TESTS FOR CHAMELEON ZGELQF + ZGELQS ROUTINE ------- \n"); - printf(" Size of the Matrix %d by %d\n", M, 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"); - - /* Morse routines */ - MORSE_zgelqf_param(&qrtree, M, N, A2, LDA, TS, TT); - MORSE_zunglq_param(&qrtree, M, N, K, A2, LDA, TS, TT, Q, LDA); - MORSE_zgelqs_param(&qrtree, M, N, NRHS, A2, LDA, TS, TT, B2, LDB); - - /* Check the orthogonality, factorization and the solution */ - info_ortho = check_orthogonality(M, N, LDA, Q, eps); - info_factorization = check_factorization(M, N, A1, A2, LDA, Q, eps); - info_solution = check_solution(M, N, NRHS, A1, LDA, B1, B2, LDB, eps); - - if ( (info_solution == 0) & (info_factorization == 0) & (info_ortho == 0) ) { - printf("***************************************************\n"); - printf(" ---- TESTING ZGELQF + ZGELQS ............ PASSED !\n"); - printf("***************************************************\n"); - } - else { - printf("***************************************************\n"); - printf(" - TESTING ZGELQF + ZGELQS ... FAILED !\n"); - printf("***************************************************\n"); - } - } - - /*---------------------------------------------------------- - * TESTING ZGEQRF + ZORMQR + ZTRSM - */ - - /* Initialize A1 and A2 */ - LAPACKE_zlarnv_work(IONE, ISEED, LDAxN, A1); - LAPACKE_zlacpy_work(LAPACK_COL_MAJOR, 'A', M, N, A1, LDA, A2, LDA ); - - /* Initialize B1 and B2 */ - memset(B2, 0, LDB*NRHS*sizeof(MORSE_Complex64_t)); - LAPACKE_zlarnv_work(IONE, ISEED, LDBxNRHS, B1); - LAPACKE_zlacpy_work(LAPACK_COL_MAJOR, 'A', M, NRHS, B1, LDB, B2, LDB ); - - /* Initialize Q */ - LAPACKE_zlaset_work(LAPACK_COL_MAJOR, 'A', LDA, N, 0., 1., Q, LDA ); - - /* MORSE ZGEQRF+ ZUNMQR + ZTRSM */ - if (M >= N) { - printf("\n"); - printf("------ TESTS FOR CHAMELEON ZGEQRF + ZUNMQR + ZTRSM ROUTINE ------- \n"); - printf(" Size of the Matrix %d by %d\n", M, 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"); - - MORSE_zgeqrf_param( &qrtree, M, N, A2, LDA, TS, TT ); - MORSE_zungqr_param( &qrtree, M, N, K, A2, LDA, TS, TT, Q, LDA); - MORSE_zunmqr_param( &qrtree, MorseLeft, MorseConjTrans, M, NRHS, N, A2, LDA, TS, TT, B2, LDB); - MORSE_ztrsm(MorseLeft, MorseUpper, MorseNoTrans, MorseNonUnit, N, NRHS, 1.0, A2, LDA, B2, LDB); - } - else { - printf("\n"); - printf("------ TESTS FOR CHAMELEON ZGELQF + ZUNMLQ + ZTRSM ROUTINE ------- \n"); - printf(" Size of the Matrix %d by %d\n", M, 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"); - - MORSE_zgelqf_param(&qrtree, M, N, A2, LDA, TS, TT); - MORSE_ztrsm(MorseLeft, MorseLower, MorseNoTrans, MorseNonUnit, M, NRHS, 1.0, A2, LDA, B2, LDB); - MORSE_zunglq_param(&qrtree, M, N, K, A2, LDA, TS, TT, Q, LDA); - MORSE_zunmlq_param(&qrtree, MorseLeft, MorseConjTrans, N, NRHS, M, A2, LDA, TS, TT, B2, LDB); - } - - /* Check the orthogonality, factorization and the solution */ - info_ortho = check_orthogonality(M, N, LDA, Q, eps); - info_factorization = check_factorization(M, N, A1, A2, LDA, Q, eps); - info_solution = check_solution(M, N, NRHS, A1, LDA, B1, B2, LDB, eps); - - if ( (info_solution == 0) & (info_factorization == 0) & (info_ortho == 0) ) { - if (M >= N) { - printf("***************************************************\n"); - printf(" ---- TESTING ZGEQRF + ZUNMQR + ZTRSM .... PASSED !\n"); - printf("***************************************************\n"); - } - else { - printf("***************************************************\n"); - printf(" ---- TESTING ZGELQF + ZTRSM + ZUNMLQ .... PASSED !\n"); - printf("***************************************************\n"); - } - } - else { - if (M >= N) { - printf("***************************************************\n"); - printf(" - TESTING ZGEQRF + ZUNMQR + ZTRSM ... FAILED !\n"); - printf("***************************************************\n"); - } - else { - printf("***************************************************\n"); - printf(" - TESTING ZGELQF + ZTRSM + ZUNMLQ ... FAILED !\n"); - printf("***************************************************\n"); - } - } - - libhqr_matrix_finalize( &qrtree ); - - free(A1); free(A2); free(B1); free(B2); free(Q); - MORSE_Dealloc_Workspace( &TS ); - MORSE_Dealloc_Workspace( &TT ); - - return hres; -} - -/*------------------------------------------------------------------- - * Check the orthogonality of Q - */ - -static int check_orthogonality(int M, int N, int LDQ, MORSE_Complex64_t *Q, double eps) -{ - double alpha, beta; - double normQ; - int info_ortho; - int minMN = min(M, N); - - double *work = (double *)malloc(minMN*sizeof(double)); - - alpha = 1.0; - beta = -1.0; - - /* Build the idendity matrix USE DLASET?*/ - MORSE_Complex64_t *Id = (MORSE_Complex64_t *) malloc(minMN*minMN*sizeof(MORSE_Complex64_t)); - LAPACKE_zlaset_work(LAPACK_COL_MAJOR, 'A', minMN, minMN, 0., 1., Id, minMN ); - - /* Perform Id - Q'Q */ - if (M >= N) - cblas_zherk(CblasColMajor, CblasUpper, CblasConjTrans, N, M, alpha, Q, LDQ, beta, Id, N); - else - cblas_zherk(CblasColMajor, CblasUpper, CblasNoTrans, M, N, alpha, Q, LDQ, beta, Id, M); - - normQ = LAPACKE_zlansy( LAPACK_COL_MAJOR, 'I', 'U', minMN, Id, minMN ); - - printf("============\n"); - printf("Checking the orthogonality of Q \n"); - printf("||Id-Q'*Q||_oo / (N*eps) = %e \n", normQ/(minMN*eps)); - - if ( isnan(normQ / (minMN * eps)) || isinf(normQ / (minMN * eps)) || (normQ / (minMN * eps) > 60.0) ) { - printf("-- Orthogonality is suspicious ! \n"); - info_ortho=1; - } - else { - printf("-- Orthogonality is CORRECT ! \n"); - info_ortho=0; - } - - free(work); free(Id); - - return info_ortho; -} - -/*------------------------------------------------------------ - * Check the factorization QR - */ - -static int check_factorization(int M, int N, MORSE_Complex64_t *A1, MORSE_Complex64_t *A2, int LDA, MORSE_Complex64_t *Q, double eps ) -{ - double Anorm, Rnorm; - MORSE_Complex64_t alpha, beta; - int info_factorization; - int i,j; - - MORSE_Complex64_t *Ql = (MORSE_Complex64_t *)malloc(M*N*sizeof(MORSE_Complex64_t)); - MORSE_Complex64_t *Residual = (MORSE_Complex64_t *)malloc(M*N*sizeof(MORSE_Complex64_t)); - double *work = (double *)malloc(max(M,N)*sizeof(double)); - - alpha=1.0; - beta=0.0; - - if (M >= N) { - /* Extract the R */ - MORSE_Complex64_t *R = (MORSE_Complex64_t *)malloc(N*N*sizeof(MORSE_Complex64_t)); - memset((void*)R, 0, N*N*sizeof(MORSE_Complex64_t)); - LAPACKE_zlacpy_work(LAPACK_COL_MAJOR,'u', M, N, A2, LDA, R, N); - - /* Perform Ql=Q*R */ - memset((void*)Ql, 0, M*N*sizeof(MORSE_Complex64_t)); - cblas_zgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, M, N, N, CBLAS_SADDR(alpha), Q, LDA, R, N, CBLAS_SADDR(beta), Ql, M); - free(R); - } - else { - /* Extract the L */ - MORSE_Complex64_t *L = (MORSE_Complex64_t *)malloc(M*M*sizeof(MORSE_Complex64_t)); - memset((void*)L, 0, M*M*sizeof(MORSE_Complex64_t)); - LAPACKE_zlacpy_work(LAPACK_COL_MAJOR,'l', M, N, A2, LDA, L, M); - - /* Perform Ql=LQ */ - memset((void*)Ql, 0, M*N*sizeof(MORSE_Complex64_t)); - cblas_zgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, M, N, M, CBLAS_SADDR(alpha), L, M, Q, LDA, CBLAS_SADDR(beta), Ql, M); - free(L); - } - - /* Compute the Residual */ - for (i = 0; i < M; i++) - for (j = 0 ; j < N; j++) - Residual[j*M+i] = A1[j*LDA+i]-Ql[j*M+i]; - - Rnorm = LAPACKE_zlange( LAPACK_COL_MAJOR, 'I', M, N, Residual, M ); - Anorm = LAPACKE_zlange( LAPACK_COL_MAJOR, 'I', M, N, A2, LDA ); - - if (M >= N) { - printf("============\n"); - printf("Checking the QR Factorization \n"); - printf("-- ||A-QR||_oo/(||A||_oo.N.eps) = %e \n",Rnorm/(Anorm*N*eps)); - } - else { - printf("============\n"); - printf("Checking the LQ Factorization \n"); - printf("-- ||A-LQ||_oo/(||A||_oo.N.eps) = %e \n",Rnorm/(Anorm*N*eps)); - } - - if (isnan(Rnorm / (Anorm * N *eps)) || isinf(Rnorm / (Anorm * N *eps)) || (Rnorm / (Anorm * N * eps) > 60.0) ) { - printf("-- Factorization is suspicious ! \n"); - info_factorization = 1; - } - else { - printf("-- Factorization is CORRECT ! \n"); - info_factorization = 0; - } - - free(work); free(Ql); free(Residual); - - return info_factorization; -} - -/*-------------------------------------------------------------- - * Check the solution - */ - -static int check_solution(int M, int N, int NRHS, MORSE_Complex64_t *A, int LDA, MORSE_Complex64_t *B, MORSE_Complex64_t *X, int LDB, double eps) -{ - int info_solution; - double Rnorm, Anorm, Xnorm, Bnorm; - MORSE_Complex64_t alpha, beta; - double result; - double *work = (double *)malloc(max(M, N)* sizeof(double)); - - alpha = 1.0; - beta = -1.0; - - Anorm = LAPACKE_zlange( LAPACK_COL_MAJOR, 'I', M, N, A, LDA ); - Bnorm = LAPACKE_zlange( LAPACK_COL_MAJOR, 'I', N, NRHS, B, LDB ); - Xnorm = LAPACKE_zlange( LAPACK_COL_MAJOR, 'I', M, NRHS, X, LDB ); - - cblas_zgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, M, NRHS, N, CBLAS_SADDR(alpha), A, LDA, X, LDB, CBLAS_SADDR(beta), B, LDB); - - if (M >= N) { - MORSE_Complex64_t *Residual = (MORSE_Complex64_t *)malloc(M*NRHS*sizeof(MORSE_Complex64_t)); - memset((void*)Residual, 0, M*NRHS*sizeof(MORSE_Complex64_t)); - cblas_zgemm(CblasColMajor, CblasConjTrans, CblasNoTrans, N, NRHS, M, CBLAS_SADDR(alpha), A, LDA, B, LDB, CBLAS_SADDR(beta), Residual, M); - Rnorm = LAPACKE_zlange( LAPACK_COL_MAJOR, 'I', M, NRHS, Residual, M ); - free(Residual); - } - else { - MORSE_Complex64_t *Residual = (MORSE_Complex64_t *)malloc(N*NRHS*sizeof(MORSE_Complex64_t)); - memset((void*)Residual, 0, N*NRHS*sizeof(MORSE_Complex64_t)); - cblas_zgemm(CblasColMajor, CblasConjTrans, CblasNoTrans, N, NRHS, M, CBLAS_SADDR(alpha), A, LDA, B, LDB, CBLAS_SADDR(beta), Residual, N); - Rnorm = LAPACKE_zlange( LAPACK_COL_MAJOR, 'I', N, NRHS, Residual, N ); - free(Residual); - } - - if (getenv("MORSE_TESTING_VERBOSE")) - printf( "||A||_oo=%f\n||X||_oo=%f\n||B||_oo=%f\n||A X - B||_oo=%e\n", Anorm, Xnorm, Bnorm, Rnorm ); - - result = Rnorm / ( (Anorm*Xnorm+Bnorm)*N*eps ) ; - printf("============\n"); - printf("Checking the Residual of the solution \n"); - printf("-- ||Ax-B||_oo/((||A||_oo||x||_oo+||B||_oo).N.eps) = %e \n", result); - - if ( isnan(Xnorm) || isinf(Xnorm) || isnan(result) || isinf(result) || (result > 60.0) ) { - printf("-- The solution is suspicious ! \n"); - info_solution = 1; - } - else{ - printf("-- The solution is CORRECT ! \n"); - info_solution = 0; - } - free(work); - return info_solution; -} -- GitLab