From 787b785670ef27ef83d6b03b94430b8d7aeaf2a7 Mon Sep 17 00:00:00 2001 From: Jianzhong Xu Date: Fri, 27 Mar 2015 15:41:46 -0400 Subject: [PATCH] Clean up examples eig and ludinv. --- examples/eig/main.c | 4 +- examples/ludinv/main.c | 122 ++++++++++++++++++----------------------- 2 files changed, 56 insertions(+), 70 deletions(-) diff --git a/examples/eig/main.c b/examples/eig/main.c index 7302712..ffec288 100644 --- a/examples/eig/main.c +++ b/examples/eig/main.c @@ -98,7 +98,7 @@ int main(int argc, char *argv[]) print_data = 0; } else if (argc < 6) { - printf("Usage: ludinv \n"); + printf("Usage: eig \n"); exit(0); } else { @@ -255,7 +255,7 @@ int main(int argc, char *argv[]) /* Compute error: A-P*D*inv(P) */ max_error_evd = compute_evd_error(matrix_A_cmplx, matrix_A_cpy, n, lda); - printf("\nMaximum relative error of EVD: %e\n", max_error_evd); + printf("\nMaximum error of EVD: %e\n", max_error_evd); if(max_error_evd > MAX_ALLOWED_ERR) { printf("Error is out of tolerance range.\n"); diff --git a/examples/ludinv/main.c b/examples/ludinv/main.c index 9dbbd2b..106cac1 100644 --- a/examples/ludinv/main.c +++ b/examples/ludinv/main.c @@ -34,6 +34,9 @@ extern "C" { #endif #include "cblas.h" +#include "f2c.h" +#include "blaswrap.h" +#include "clapack.h" #ifdef __cplusplus } #endif @@ -46,28 +49,14 @@ struct timespec t0,t1; #define tock() (clock_gettime(CLOCK_MONOTONIC, &t1), \ t1.tv_sec - t0.tv_sec + (t1.tv_nsec - t0.tv_nsec) / 1e9) -/* LAPACK routines */ -extern int dgetrf_(int *, int *, double *, int *, int *, int *); -extern int dgetri_(int *, double *, int *, int *, double *, int *, int *); -extern int dgeqrf_(int *, int *, double *, int *, double *, double *, int *, int *); -extern int dtrtri_(char *, char *, int *, double *, int *, int *); - -extern int dlatmr_(int *, int *, char *, int *, char *, - double *, int *, double *, double *, char *, char *, - double *, int *, double *, double *, int *, - double *, char *, int *, int *, int *, - double *, double *, char *, double *, int *, - int *, int *); -extern int dlacpy_(char *, int *, int *, double *, int *, double *, int *); - /* Auxiliary routines prototypes */ -void print_int_vector( char* desc, int n, int* a ); -void print_real_matrix(char* desc, double *mat, int n, int m, int ldv ); -double compute_inverse_error(double *matrix_A, double *matrix_A_inverse, int n, int ld); -void print_performance(int *matrix_sizes, float *secs_runs, int num_test, int num_run); +void print_int_vector( char* desc, integer n, integer* a ); +void print_real_matrix(char* desc, doublereal *mat, integer n, integer m, integer ldv ); +double compute_inverse_error(doublereal *matrix_A, doublereal *matrix_A_inverse, integer n, integer ld); +void print_performance(integer *matrix_sizes, float *secs_runs, int num_test, int num_run); /* Parameters */ -#define MAX_ALLOWED_ERR (1e-20) +#define MAX_ALLOWED_ERR (1e-10) /* Main program */ int print_data; @@ -75,18 +64,17 @@ int main(int argc, char *argv[]) { /* Locals */ float secs, secs_lud_inv, *secs_all_runs; int num_test, num_run, i, j; - int n, n_min, n_inc, info, lwork, lda; - double lwork_opt, max_abs_error; - double *work; - double *matrix_A, *matrix_LUD; - double *vec_dbr_diagr, *vec_dbr_diag, *vec_dbr_diagl; - int *vec_int_pivot, *vec_int_work; - int *matrix_sizes; + integer n, n_min, n_inc, info, lwork, lda; + double max_abs_error; + doublereal lwork_opt, *work, *matrix_A, *matrix_LUD; + doublereal *vec_dbr_diagr, *vec_dbr_diag, *vec_dbr_diagl; + integer *vec_int_pivot, *vec_int_work; + integer *matrix_sizes; - int const_int6 = 6; - double const_dbr1 = 1.; - double const_dbr0 = 0.; - int rand_seed[4] = {10,123,278,3579}; /* numbers must lie between 0 and 4095 */ + integer const_int6 = 6; + doublereal const_dbr1 = 1.; + doublereal const_dbr0 = 0.; + integer rand_seed[4] = {10,123,278,3579}; /* numbers must lie between 0 and 4095 */ fprintf(stdout, "\n\n===== LAPACK example: matrix inversion through LUD =====\n"); if(argc == 1) { /* no command line arguments, use default */ @@ -110,43 +98,43 @@ int main(int argc, char *argv[]) { rand_seed[0] = 4675; secs_all_runs = (float *)malloc(sizeof(float)*num_test*num_run); - matrix_sizes = (int*)malloc(sizeof(int)*num_test); + matrix_sizes = (integer*)malloc(sizeof(integer)*num_test); for(i=0, n=n_min; i MAX_ALLOWED_ERR) { printf("Error is out of tolerance range.\n"); @@ -233,7 +221,7 @@ START_NEW_RUN: /* Auxiliary routine: printing a vector of integers */ -void print_int_vector( char* desc, int n, int* a ) +void print_int_vector( char* desc, integer n, integer* a ) { int j; @@ -241,12 +229,12 @@ void print_int_vector( char* desc, int n, int* a ) return; printf( "\n %s\n", desc ); - for( j = 0; j < n; j++ ) printf( " %6i", a[j] ); + for( j = 0; j < n; j++ ) printf( " %6d", (int)a[j] ); printf( "\n" ); } /* Auxiliary routine: printing a real matrix */ -void print_real_matrix(char* desc, double *mat, int m, int n, int ldv ) +void print_real_matrix(char* desc, doublereal *mat, integer m, integer n, integer ldv ) { int i, j; @@ -263,32 +251,30 @@ void print_real_matrix(char* desc, double *mat, int m, int n, int ldv ) } -double compute_inverse_error(double *matrix_A, double *matrix_A_inverse, int n, int ld) +double compute_inverse_error(doublereal *matrix_A, doublereal *matrix_A_inverse, integer n, integer ld) { int i, j; double abs_err, relative_err; - double *matrix_A_mult_A_inv; + doublereal *matrix_A_mult_A_inv; double max_err = 0.; - matrix_A_mult_A_inv = (double *)malloc(n*n*sizeof(double)); + matrix_A_mult_A_inv = (doublereal *)malloc(n*n*sizeof(doublereal)); cblas_dgemm(CblasColMajor,CblasNoTrans,CblasNoTrans,n,n,n,1.0,matrix_A,ld, matrix_A_inverse,ld,0.0,matrix_A_mult_A_inv,ld); - /* sqrt(sum(err^2))/N, sum(abs(err))/N, max(abs(err)) */ + /* sqrt(sum(err^2))/N, sum(fabs(err))/N, max(fabs(err)) */ for(i=0; i max_err) { - max_err = relative_err; + abs_err = fabs(matrix_A_mult_A_inv[i+j*ld]); + } + + if(abs_err > max_err) { + max_err = abs_err; } } } @@ -298,7 +284,7 @@ double compute_inverse_error(double *matrix_A, double *matrix_A_inverse, int n, } -void print_performance(int *matrix_sizes, float *secs_runs, int num_test, int num_run) +void print_performance(integer *matrix_sizes, float *secs_runs, int num_test, int num_run) { int i, j; float inst, min, max; @@ -311,19 +297,19 @@ void print_performance(int *matrix_sizes, float *secs_runs, int num_test, int nu for(i=0; imax) max = inst; if(inst