/* Tridiagonals solvers */ void solve_tridiag_qr(int n, double *D, double *E, char type){ if (type == 'N'){ printf("Using PWK variant\n"); int info = LAPACKE_dsterf(n, D, E); assert(!info); } else { double *Q = malloc(n*n*sizeof(double)); assert(Q); int info = LAPACKE_dsteqr(LAPACK_COL_MAJOR, type, n, D, E, Q, n); assert(!info); free(Q); } }
int main(void) { /* Local scalars */ lapack_int n, n_i; lapack_int info, info_i; lapack_int i; int failed; /* Local arrays */ double *d = NULL, *d_i = NULL; double *e = NULL, *e_i = NULL; double *d_save = NULL; double *e_save = NULL; /* Iniitialize the scalar parameters */ init_scalars_dsterf( &n ); n_i = n; /* Allocate memory for the LAPACK routine arrays */ d = (double *)LAPACKE_malloc( n * sizeof(double) ); e = (double *)LAPACKE_malloc( (n-1) * sizeof(double) ); /* Allocate memory for the C interface function arrays */ d_i = (double *)LAPACKE_malloc( n * sizeof(double) ); e_i = (double *)LAPACKE_malloc( (n-1) * sizeof(double) ); /* Allocate memory for the backup arrays */ d_save = (double *)LAPACKE_malloc( n * sizeof(double) ); e_save = (double *)LAPACKE_malloc( (n-1) * sizeof(double) ); /* Allocate memory for the row-major arrays */ /* Initialize input arrays */ init_d( n, d ); init_e( (n-1), e ); /* Backup the ouptut arrays */ for( i = 0; i < n; i++ ) { d_save[i] = d[i]; } for( i = 0; i < (n-1); i++ ) { e_save[i] = e[i]; } /* Call the LAPACK routine */ dsterf_( &n, d, e, &info ); /* Initialize input data, call the column-major middle-level * interface to LAPACK routine and check the results */ for( i = 0; i < n; i++ ) { d_i[i] = d_save[i]; } for( i = 0; i < (n-1); i++ ) { e_i[i] = e_save[i]; } info_i = LAPACKE_dsterf_work( n_i, d_i, e_i ); failed = compare_dsterf( d, d_i, e, e_i, info, info_i, n ); if( failed == 0 ) { printf( "PASSED: column-major middle-level interface to dsterf\n" ); } else { printf( "FAILED: column-major middle-level interface to dsterf\n" ); } /* Initialize input data, call the column-major high-level * interface to LAPACK routine and check the results */ for( i = 0; i < n; i++ ) { d_i[i] = d_save[i]; } for( i = 0; i < (n-1); i++ ) { e_i[i] = e_save[i]; } info_i = LAPACKE_dsterf( n_i, d_i, e_i ); failed = compare_dsterf( d, d_i, e, e_i, info, info_i, n ); if( failed == 0 ) { printf( "PASSED: column-major high-level interface to dsterf\n" ); } else { printf( "FAILED: column-major high-level interface to dsterf\n" ); } failed = compare_dsterf( d, d_i, e, e_i, info, info_i, n ); if( failed == 0 ) { printf( "PASSED: row-major middle-level interface to dsterf\n" ); } else { printf( "FAILED: row-major middle-level interface to dsterf\n" ); } failed = compare_dsterf( d, d_i, e, e_i, info, info_i, n ); if( failed == 0 ) { printf( "PASSED: row-major high-level interface to dsterf\n" ); } else { printf( "FAILED: row-major high-level interface to dsterf\n" ); } /* Release memory */ if( d != NULL ) { LAPACKE_free( d ); } if( d_i != NULL ) { LAPACKE_free( d_i ); } if( d_save != NULL ) { LAPACKE_free( d_save ); } if( e != NULL ) { LAPACKE_free( e ); } if( e_i != NULL ) { LAPACKE_free( e_i ); } if( e_save != NULL ) { LAPACKE_free( e_save ); } return 0; }