00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #include <stdio.h>
00050 #include "lapacke.h"
00051 #include "lapacke_utils.h"
00052 #include "test_utils.h"
00053
00054 static void init_scalars_ztbrfs( char *uplo, char *trans, char *diag,
00055 lapack_int *n, lapack_int *kd,
00056 lapack_int *nrhs, lapack_int *ldab,
00057 lapack_int *ldb, lapack_int *ldx );
00058 static void init_ab( lapack_int size, lapack_complex_double *ab );
00059 static void init_b( lapack_int size, lapack_complex_double *b );
00060 static void init_x( lapack_int size, lapack_complex_double *x );
00061 static void init_ferr( lapack_int size, double *ferr );
00062 static void init_berr( lapack_int size, double *berr );
00063 static void init_work( lapack_int size, lapack_complex_double *work );
00064 static void init_rwork( lapack_int size, double *rwork );
00065 static int compare_ztbrfs( double *ferr, double *ferr_i, double *berr,
00066 double *berr_i, lapack_int info, lapack_int info_i,
00067 lapack_int nrhs );
00068
00069 int main(void)
00070 {
00071
00072 char uplo, uplo_i;
00073 char trans, trans_i;
00074 char diag, diag_i;
00075 lapack_int n, n_i;
00076 lapack_int kd, kd_i;
00077 lapack_int nrhs, nrhs_i;
00078 lapack_int ldab, ldab_i;
00079 lapack_int ldab_r;
00080 lapack_int ldb, ldb_i;
00081 lapack_int ldb_r;
00082 lapack_int ldx, ldx_i;
00083 lapack_int ldx_r;
00084 lapack_int info, info_i;
00085 lapack_int i;
00086 int failed;
00087
00088
00089 lapack_complex_double *ab = NULL, *ab_i = NULL;
00090 lapack_complex_double *b = NULL, *b_i = NULL;
00091 lapack_complex_double *x = NULL, *x_i = NULL;
00092 double *ferr = NULL, *ferr_i = NULL;
00093 double *berr = NULL, *berr_i = NULL;
00094 lapack_complex_double *work = NULL, *work_i = NULL;
00095 double *rwork = NULL, *rwork_i = NULL;
00096 double *ferr_save = NULL;
00097 double *berr_save = NULL;
00098 lapack_complex_double *ab_r = NULL;
00099 lapack_complex_double *b_r = NULL;
00100 lapack_complex_double *x_r = NULL;
00101
00102
00103 init_scalars_ztbrfs( &uplo, &trans, &diag, &n, &kd, &nrhs, &ldab, &ldb,
00104 &ldx );
00105 ldab_r = n+2;
00106 ldb_r = nrhs+2;
00107 ldx_r = nrhs+2;
00108 uplo_i = uplo;
00109 trans_i = trans;
00110 diag_i = diag;
00111 n_i = n;
00112 kd_i = kd;
00113 nrhs_i = nrhs;
00114 ldab_i = ldab;
00115 ldb_i = ldb;
00116 ldx_i = ldx;
00117
00118
00119 ab = (lapack_complex_double *)
00120 LAPACKE_malloc( ldab*n * sizeof(lapack_complex_double) );
00121 b = (lapack_complex_double *)
00122 LAPACKE_malloc( ldb*nrhs * sizeof(lapack_complex_double) );
00123 x = (lapack_complex_double *)
00124 LAPACKE_malloc( ldx*nrhs * sizeof(lapack_complex_double) );
00125 ferr = (double *)LAPACKE_malloc( nrhs * sizeof(double) );
00126 berr = (double *)LAPACKE_malloc( nrhs * sizeof(double) );
00127 work = (lapack_complex_double *)
00128 LAPACKE_malloc( 2*n * sizeof(lapack_complex_double) );
00129 rwork = (double *)LAPACKE_malloc( n * sizeof(double) );
00130
00131
00132 ab_i = (lapack_complex_double *)
00133 LAPACKE_malloc( ldab*n * sizeof(lapack_complex_double) );
00134 b_i = (lapack_complex_double *)
00135 LAPACKE_malloc( ldb*nrhs * sizeof(lapack_complex_double) );
00136 x_i = (lapack_complex_double *)
00137 LAPACKE_malloc( ldx*nrhs * sizeof(lapack_complex_double) );
00138 ferr_i = (double *)LAPACKE_malloc( nrhs * sizeof(double) );
00139 berr_i = (double *)LAPACKE_malloc( nrhs * sizeof(double) );
00140 work_i = (lapack_complex_double *)
00141 LAPACKE_malloc( 2*n * sizeof(lapack_complex_double) );
00142 rwork_i = (double *)LAPACKE_malloc( n * sizeof(double) );
00143
00144
00145 ferr_save = (double *)LAPACKE_malloc( nrhs * sizeof(double) );
00146 berr_save = (double *)LAPACKE_malloc( nrhs * sizeof(double) );
00147
00148
00149 ab_r = (lapack_complex_double *)
00150 LAPACKE_malloc( (kd+1)*(n+2) * sizeof(lapack_complex_double) );
00151 b_r = (lapack_complex_double *)
00152 LAPACKE_malloc( n*(nrhs+2) * sizeof(lapack_complex_double) );
00153 x_r = (lapack_complex_double *)
00154 LAPACKE_malloc( n*(nrhs+2) * sizeof(lapack_complex_double) );
00155
00156
00157 init_ab( ldab*n, ab );
00158 init_b( ldb*nrhs, b );
00159 init_x( ldx*nrhs, x );
00160 init_ferr( nrhs, ferr );
00161 init_berr( nrhs, berr );
00162 init_work( 2*n, work );
00163 init_rwork( n, rwork );
00164
00165
00166 for( i = 0; i < nrhs; i++ ) {
00167 ferr_save[i] = ferr[i];
00168 }
00169 for( i = 0; i < nrhs; i++ ) {
00170 berr_save[i] = berr[i];
00171 }
00172
00173
00174 ztbrfs_( &uplo, &trans, &diag, &n, &kd, &nrhs, ab, &ldab, b, &ldb, x, &ldx,
00175 ferr, berr, work, rwork, &info );
00176
00177
00178
00179 for( i = 0; i < ldab*n; i++ ) {
00180 ab_i[i] = ab[i];
00181 }
00182 for( i = 0; i < ldb*nrhs; i++ ) {
00183 b_i[i] = b[i];
00184 }
00185 for( i = 0; i < ldx*nrhs; i++ ) {
00186 x_i[i] = x[i];
00187 }
00188 for( i = 0; i < nrhs; i++ ) {
00189 ferr_i[i] = ferr_save[i];
00190 }
00191 for( i = 0; i < nrhs; i++ ) {
00192 berr_i[i] = berr_save[i];
00193 }
00194 for( i = 0; i < 2*n; i++ ) {
00195 work_i[i] = work[i];
00196 }
00197 for( i = 0; i < n; i++ ) {
00198 rwork_i[i] = rwork[i];
00199 }
00200 info_i = LAPACKE_ztbrfs_work( LAPACK_COL_MAJOR, uplo_i, trans_i, diag_i,
00201 n_i, kd_i, nrhs_i, ab_i, ldab_i, b_i, ldb_i,
00202 x_i, ldx_i, ferr_i, berr_i, work_i, rwork_i );
00203
00204 failed = compare_ztbrfs( ferr, ferr_i, berr, berr_i, info, info_i, nrhs );
00205 if( failed == 0 ) {
00206 printf( "PASSED: column-major middle-level interface to ztbrfs\n" );
00207 } else {
00208 printf( "FAILED: column-major middle-level interface to ztbrfs\n" );
00209 }
00210
00211
00212
00213 for( i = 0; i < ldab*n; i++ ) {
00214 ab_i[i] = ab[i];
00215 }
00216 for( i = 0; i < ldb*nrhs; i++ ) {
00217 b_i[i] = b[i];
00218 }
00219 for( i = 0; i < ldx*nrhs; i++ ) {
00220 x_i[i] = x[i];
00221 }
00222 for( i = 0; i < nrhs; i++ ) {
00223 ferr_i[i] = ferr_save[i];
00224 }
00225 for( i = 0; i < nrhs; i++ ) {
00226 berr_i[i] = berr_save[i];
00227 }
00228 for( i = 0; i < 2*n; i++ ) {
00229 work_i[i] = work[i];
00230 }
00231 for( i = 0; i < n; i++ ) {
00232 rwork_i[i] = rwork[i];
00233 }
00234 info_i = LAPACKE_ztbrfs( LAPACK_COL_MAJOR, uplo_i, trans_i, diag_i, n_i,
00235 kd_i, nrhs_i, ab_i, ldab_i, b_i, ldb_i, x_i, ldx_i,
00236 ferr_i, berr_i );
00237
00238 failed = compare_ztbrfs( ferr, ferr_i, berr, berr_i, info, info_i, nrhs );
00239 if( failed == 0 ) {
00240 printf( "PASSED: column-major high-level interface to ztbrfs\n" );
00241 } else {
00242 printf( "FAILED: column-major high-level interface to ztbrfs\n" );
00243 }
00244
00245
00246
00247 for( i = 0; i < ldab*n; i++ ) {
00248 ab_i[i] = ab[i];
00249 }
00250 for( i = 0; i < ldb*nrhs; i++ ) {
00251 b_i[i] = b[i];
00252 }
00253 for( i = 0; i < ldx*nrhs; i++ ) {
00254 x_i[i] = x[i];
00255 }
00256 for( i = 0; i < nrhs; i++ ) {
00257 ferr_i[i] = ferr_save[i];
00258 }
00259 for( i = 0; i < nrhs; i++ ) {
00260 berr_i[i] = berr_save[i];
00261 }
00262 for( i = 0; i < 2*n; i++ ) {
00263 work_i[i] = work[i];
00264 }
00265 for( i = 0; i < n; i++ ) {
00266 rwork_i[i] = rwork[i];
00267 }
00268
00269 LAPACKE_zge_trans( LAPACK_COL_MAJOR, kd+1, n, ab_i, ldab, ab_r, n+2 );
00270 LAPACKE_zge_trans( LAPACK_COL_MAJOR, n, nrhs, b_i, ldb, b_r, nrhs+2 );
00271 LAPACKE_zge_trans( LAPACK_COL_MAJOR, n, nrhs, x_i, ldx, x_r, nrhs+2 );
00272 info_i = LAPACKE_ztbrfs_work( LAPACK_ROW_MAJOR, uplo_i, trans_i, diag_i,
00273 n_i, kd_i, nrhs_i, ab_r, ldab_r, b_r, ldb_r,
00274 x_r, ldx_r, ferr_i, berr_i, work_i, rwork_i );
00275
00276 failed = compare_ztbrfs( ferr, ferr_i, berr, berr_i, info, info_i, nrhs );
00277 if( failed == 0 ) {
00278 printf( "PASSED: row-major middle-level interface to ztbrfs\n" );
00279 } else {
00280 printf( "FAILED: row-major middle-level interface to ztbrfs\n" );
00281 }
00282
00283
00284
00285 for( i = 0; i < ldab*n; i++ ) {
00286 ab_i[i] = ab[i];
00287 }
00288 for( i = 0; i < ldb*nrhs; i++ ) {
00289 b_i[i] = b[i];
00290 }
00291 for( i = 0; i < ldx*nrhs; i++ ) {
00292 x_i[i] = x[i];
00293 }
00294 for( i = 0; i < nrhs; i++ ) {
00295 ferr_i[i] = ferr_save[i];
00296 }
00297 for( i = 0; i < nrhs; i++ ) {
00298 berr_i[i] = berr_save[i];
00299 }
00300 for( i = 0; i < 2*n; i++ ) {
00301 work_i[i] = work[i];
00302 }
00303 for( i = 0; i < n; i++ ) {
00304 rwork_i[i] = rwork[i];
00305 }
00306
00307
00308 LAPACKE_zge_trans( LAPACK_COL_MAJOR, kd+1, n, ab_i, ldab, ab_r, n+2 );
00309 LAPACKE_zge_trans( LAPACK_COL_MAJOR, n, nrhs, b_i, ldb, b_r, nrhs+2 );
00310 LAPACKE_zge_trans( LAPACK_COL_MAJOR, n, nrhs, x_i, ldx, x_r, nrhs+2 );
00311 info_i = LAPACKE_ztbrfs( LAPACK_ROW_MAJOR, uplo_i, trans_i, diag_i, n_i,
00312 kd_i, nrhs_i, ab_r, ldab_r, b_r, ldb_r, x_r, ldx_r,
00313 ferr_i, berr_i );
00314
00315 failed = compare_ztbrfs( ferr, ferr_i, berr, berr_i, info, info_i, nrhs );
00316 if( failed == 0 ) {
00317 printf( "PASSED: row-major high-level interface to ztbrfs\n" );
00318 } else {
00319 printf( "FAILED: row-major high-level interface to ztbrfs\n" );
00320 }
00321
00322
00323 if( ab != NULL ) {
00324 LAPACKE_free( ab );
00325 }
00326 if( ab_i != NULL ) {
00327 LAPACKE_free( ab_i );
00328 }
00329 if( ab_r != NULL ) {
00330 LAPACKE_free( ab_r );
00331 }
00332 if( b != NULL ) {
00333 LAPACKE_free( b );
00334 }
00335 if( b_i != NULL ) {
00336 LAPACKE_free( b_i );
00337 }
00338 if( b_r != NULL ) {
00339 LAPACKE_free( b_r );
00340 }
00341 if( x != NULL ) {
00342 LAPACKE_free( x );
00343 }
00344 if( x_i != NULL ) {
00345 LAPACKE_free( x_i );
00346 }
00347 if( x_r != NULL ) {
00348 LAPACKE_free( x_r );
00349 }
00350 if( ferr != NULL ) {
00351 LAPACKE_free( ferr );
00352 }
00353 if( ferr_i != NULL ) {
00354 LAPACKE_free( ferr_i );
00355 }
00356 if( ferr_save != NULL ) {
00357 LAPACKE_free( ferr_save );
00358 }
00359 if( berr != NULL ) {
00360 LAPACKE_free( berr );
00361 }
00362 if( berr_i != NULL ) {
00363 LAPACKE_free( berr_i );
00364 }
00365 if( berr_save != NULL ) {
00366 LAPACKE_free( berr_save );
00367 }
00368 if( work != NULL ) {
00369 LAPACKE_free( work );
00370 }
00371 if( work_i != NULL ) {
00372 LAPACKE_free( work_i );
00373 }
00374 if( rwork != NULL ) {
00375 LAPACKE_free( rwork );
00376 }
00377 if( rwork_i != NULL ) {
00378 LAPACKE_free( rwork_i );
00379 }
00380
00381 return 0;
00382 }
00383
00384
00385 static void init_scalars_ztbrfs( char *uplo, char *trans, char *diag,
00386 lapack_int *n, lapack_int *kd,
00387 lapack_int *nrhs, lapack_int *ldab,
00388 lapack_int *ldb, lapack_int *ldx )
00389 {
00390 *uplo = 'L';
00391 *trans = 'N';
00392 *diag = 'N';
00393 *n = 4;
00394 *kd = 2;
00395 *nrhs = 2;
00396 *ldab = 9;
00397 *ldb = 8;
00398 *ldx = 8;
00399
00400 return;
00401 }
00402
00403
00404 static void init_ab( lapack_int size, lapack_complex_double *ab ) {
00405 lapack_int i;
00406 for( i = 0; i < size; i++ ) {
00407 ab[i] = lapack_make_complex_double( 0.0, 0.0 );
00408 }
00409 ab[0] = lapack_make_complex_double( -1.93999999999999990e+000,
00410 4.42999999999999970e+000 );
00411 ab[9] = lapack_make_complex_double( 4.12000000000000010e+000,
00412 -4.26999999999999960e+000 );
00413 ab[18] = lapack_make_complex_double( 4.29999999999999990e-001,
00414 -2.66000000000000010e+000 );
00415 ab[27] = lapack_make_complex_double( 4.40000000000000000e-001,
00416 1.00000000000000010e-001 );
00417 ab[1] = lapack_make_complex_double( -3.39000000000000010e+000,
00418 3.43999999999999990e+000 );
00419 ab[10] = lapack_make_complex_double( -1.84000000000000010e+000,
00420 5.53000000000000020e+000 );
00421 ab[19] = lapack_make_complex_double( 1.74000000000000000e+000,
00422 -4.00000000000000010e-002 );
00423 ab[28] = lapack_make_complex_double( 0.00000000000000000e+000,
00424 0.00000000000000000e+000 );
00425 ab[2] = lapack_make_complex_double( 1.62000000000000010e+000,
00426 3.68000000000000020e+000 );
00427 ab[11] = lapack_make_complex_double( -2.77000000000000000e+000,
00428 -1.92999999999999990e+000 );
00429 ab[20] = lapack_make_complex_double( 0.00000000000000000e+000,
00430 0.00000000000000000e+000 );
00431 ab[29] = lapack_make_complex_double( 0.00000000000000000e+000,
00432 0.00000000000000000e+000 );
00433 }
00434 static void init_b( lapack_int size, lapack_complex_double *b ) {
00435 lapack_int i;
00436 for( i = 0; i < size; i++ ) {
00437 b[i] = lapack_make_complex_double( 0.0, 0.0 );
00438 }
00439 b[0] = lapack_make_complex_double( -8.85999999999999940e+000,
00440 -3.87999999999999990e+000 );
00441 b[8] = lapack_make_complex_double( -2.40900000000000000e+001,
00442 -5.26999999999999960e+000 );
00443 b[1] = lapack_make_complex_double( -1.55700000000000000e+001,
00444 -2.34100000000000000e+001 );
00445 b[9] = lapack_make_complex_double( -5.79699999999999990e+001,
00446 8.14000000000000060e+000 );
00447 b[2] = lapack_make_complex_double( -7.62999999999999990e+000,
00448 2.27800000000000010e+001 );
00449 b[10] = lapack_make_complex_double( 1.90900000000000000e+001,
00450 -2.95100000000000020e+001 );
00451 b[3] = lapack_make_complex_double( -1.47400000000000000e+001,
00452 -2.39999999999999990e+000 );
00453 b[11] = lapack_make_complex_double( 1.91700000000000020e+001,
00454 2.13299999999999980e+001 );
00455 }
00456 static void init_x( lapack_int size, lapack_complex_double *x ) {
00457 lapack_int i;
00458 for( i = 0; i < size; i++ ) {
00459 x[i] = lapack_make_complex_double( 0.0, 0.0 );
00460 }
00461 x[0] = lapack_make_complex_double( 0.00000000000000000e+000,
00462 2.00000000000000000e+000 );
00463 x[8] = lapack_make_complex_double( 1.00000000000000020e+000,
00464 5.00000000000000090e+000 );
00465 x[1] = lapack_make_complex_double( 9.99999999999999780e-001,
00466 -3.00000000000000000e+000 );
00467 x[9] = lapack_make_complex_double( -7.00000000000000090e+000,
00468 -1.99999999999999890e+000 );
00469 x[2] = lapack_make_complex_double( -3.99999999999999960e+000,
00470 -5.00000000000000000e+000 );
00471 x[10] = lapack_make_complex_double( 2.99999999999999960e+000,
00472 4.00000000000000270e+000 );
00473 x[3] = lapack_make_complex_double( 1.99999999999999400e+000,
00474 -1.00000000000000310e+000 );
00475 x[11] = lapack_make_complex_double( -6.00000000000000980e+000,
00476 -9.00000000000000530e+000 );
00477 }
00478 static void init_ferr( lapack_int size, double *ferr ) {
00479 lapack_int i;
00480 for( i = 0; i < size; i++ ) {
00481 ferr[i] = 0;
00482 }
00483 }
00484 static void init_berr( lapack_int size, double *berr ) {
00485 lapack_int i;
00486 for( i = 0; i < size; i++ ) {
00487 berr[i] = 0;
00488 }
00489 }
00490 static void init_work( lapack_int size, lapack_complex_double *work ) {
00491 lapack_int i;
00492 for( i = 0; i < size; i++ ) {
00493 work[i] = lapack_make_complex_double( 0.0, 0.0 );
00494 }
00495 }
00496 static void init_rwork( lapack_int size, double *rwork ) {
00497 lapack_int i;
00498 for( i = 0; i < size; i++ ) {
00499 rwork[i] = 0;
00500 }
00501 }
00502
00503
00504
00505 static int compare_ztbrfs( double *ferr, double *ferr_i, double *berr,
00506 double *berr_i, lapack_int info, lapack_int info_i,
00507 lapack_int nrhs )
00508 {
00509 lapack_int i;
00510 int failed = 0;
00511 for( i = 0; i < nrhs; i++ ) {
00512 failed += compare_doubles(ferr[i],ferr_i[i]);
00513 }
00514 for( i = 0; i < nrhs; i++ ) {
00515 failed += compare_doubles(berr[i],berr_i[i]);
00516 }
00517 failed += (info == info_i) ? 0 : 1;
00518 if( info != 0 || info_i != 0 ) {
00519 printf( "info=%d, info_i=%d\n",(int)info,(int)info_i );
00520 }
00521
00522 return failed;
00523 }