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_ssycon( char *uplo, lapack_int *n, lapack_int *lda,
00055 float *anorm );
00056 static void init_a( lapack_int size, float *a );
00057 static void init_ipiv( lapack_int size, lapack_int *ipiv );
00058 static void init_work( lapack_int size, float *work );
00059 static void init_iwork( lapack_int size, lapack_int *iwork );
00060 static int compare_ssycon( float rcond, float rcond_i, lapack_int info,
00061 lapack_int info_i );
00062
00063 int main(void)
00064 {
00065
00066 char uplo, uplo_i;
00067 lapack_int n, n_i;
00068 lapack_int lda, lda_i;
00069 lapack_int lda_r;
00070 float anorm, anorm_i;
00071 float rcond, rcond_i;
00072 lapack_int info, info_i;
00073 lapack_int i;
00074 int failed;
00075
00076
00077 float *a = NULL, *a_i = NULL;
00078 lapack_int *ipiv = NULL, *ipiv_i = NULL;
00079 float *work = NULL, *work_i = NULL;
00080 lapack_int *iwork = NULL, *iwork_i = NULL;
00081 float *a_r = NULL;
00082
00083
00084 init_scalars_ssycon( &uplo, &n, &lda, &anorm );
00085 lda_r = n+2;
00086 uplo_i = uplo;
00087 n_i = n;
00088 lda_i = lda;
00089 anorm_i = anorm;
00090
00091
00092 a = (float *)LAPACKE_malloc( lda*n * sizeof(float) );
00093 ipiv = (lapack_int *)LAPACKE_malloc( n * sizeof(lapack_int) );
00094 work = (float *)LAPACKE_malloc( 2*n * sizeof(float) );
00095 iwork = (lapack_int *)LAPACKE_malloc( n * sizeof(lapack_int) );
00096
00097
00098 a_i = (float *)LAPACKE_malloc( lda*n * sizeof(float) );
00099 ipiv_i = (lapack_int *)LAPACKE_malloc( n * sizeof(lapack_int) );
00100 work_i = (float *)LAPACKE_malloc( 2*n * sizeof(float) );
00101 iwork_i = (lapack_int *)LAPACKE_malloc( n * sizeof(lapack_int) );
00102
00103
00104 a_r = (float *)LAPACKE_malloc( n*(n+2) * sizeof(float) );
00105
00106
00107 init_a( lda*n, a );
00108 init_ipiv( n, ipiv );
00109 init_work( 2*n, work );
00110 init_iwork( n, iwork );
00111
00112
00113 ssycon_( &uplo, &n, a, &lda, ipiv, &anorm, &rcond, work, iwork, &info );
00114
00115
00116
00117 for( i = 0; i < lda*n; i++ ) {
00118 a_i[i] = a[i];
00119 }
00120 for( i = 0; i < n; i++ ) {
00121 ipiv_i[i] = ipiv[i];
00122 }
00123 for( i = 0; i < 2*n; i++ ) {
00124 work_i[i] = work[i];
00125 }
00126 for( i = 0; i < n; i++ ) {
00127 iwork_i[i] = iwork[i];
00128 }
00129 info_i = LAPACKE_ssycon_work( LAPACK_COL_MAJOR, uplo_i, n_i, a_i, lda_i,
00130 ipiv_i, anorm_i, &rcond_i, work_i, iwork_i );
00131
00132 failed = compare_ssycon( rcond, rcond_i, info, info_i );
00133 if( failed == 0 ) {
00134 printf( "PASSED: column-major middle-level interface to ssycon\n" );
00135 } else {
00136 printf( "FAILED: column-major middle-level interface to ssycon\n" );
00137 }
00138
00139
00140
00141 for( i = 0; i < lda*n; i++ ) {
00142 a_i[i] = a[i];
00143 }
00144 for( i = 0; i < n; i++ ) {
00145 ipiv_i[i] = ipiv[i];
00146 }
00147 for( i = 0; i < 2*n; i++ ) {
00148 work_i[i] = work[i];
00149 }
00150 for( i = 0; i < n; i++ ) {
00151 iwork_i[i] = iwork[i];
00152 }
00153 info_i = LAPACKE_ssycon( LAPACK_COL_MAJOR, uplo_i, n_i, a_i, lda_i, ipiv_i,
00154 anorm_i, &rcond_i );
00155
00156 failed = compare_ssycon( rcond, rcond_i, info, info_i );
00157 if( failed == 0 ) {
00158 printf( "PASSED: column-major high-level interface to ssycon\n" );
00159 } else {
00160 printf( "FAILED: column-major high-level interface to ssycon\n" );
00161 }
00162
00163
00164
00165 for( i = 0; i < lda*n; i++ ) {
00166 a_i[i] = a[i];
00167 }
00168 for( i = 0; i < n; i++ ) {
00169 ipiv_i[i] = ipiv[i];
00170 }
00171 for( i = 0; i < 2*n; i++ ) {
00172 work_i[i] = work[i];
00173 }
00174 for( i = 0; i < n; i++ ) {
00175 iwork_i[i] = iwork[i];
00176 }
00177
00178 LAPACKE_sge_trans( LAPACK_COL_MAJOR, n, n, a_i, lda, a_r, n+2 );
00179 info_i = LAPACKE_ssycon_work( LAPACK_ROW_MAJOR, uplo_i, n_i, a_r, lda_r,
00180 ipiv_i, anorm_i, &rcond_i, work_i, iwork_i );
00181
00182 failed = compare_ssycon( rcond, rcond_i, info, info_i );
00183 if( failed == 0 ) {
00184 printf( "PASSED: row-major middle-level interface to ssycon\n" );
00185 } else {
00186 printf( "FAILED: row-major middle-level interface to ssycon\n" );
00187 }
00188
00189
00190
00191 for( i = 0; i < lda*n; i++ ) {
00192 a_i[i] = a[i];
00193 }
00194 for( i = 0; i < n; i++ ) {
00195 ipiv_i[i] = ipiv[i];
00196 }
00197 for( i = 0; i < 2*n; i++ ) {
00198 work_i[i] = work[i];
00199 }
00200 for( i = 0; i < n; i++ ) {
00201 iwork_i[i] = iwork[i];
00202 }
00203
00204
00205 LAPACKE_sge_trans( LAPACK_COL_MAJOR, n, n, a_i, lda, a_r, n+2 );
00206 info_i = LAPACKE_ssycon( LAPACK_ROW_MAJOR, uplo_i, n_i, a_r, lda_r, ipiv_i,
00207 anorm_i, &rcond_i );
00208
00209 failed = compare_ssycon( rcond, rcond_i, info, info_i );
00210 if( failed == 0 ) {
00211 printf( "PASSED: row-major high-level interface to ssycon\n" );
00212 } else {
00213 printf( "FAILED: row-major high-level interface to ssycon\n" );
00214 }
00215
00216
00217 if( a != NULL ) {
00218 LAPACKE_free( a );
00219 }
00220 if( a_i != NULL ) {
00221 LAPACKE_free( a_i );
00222 }
00223 if( a_r != NULL ) {
00224 LAPACKE_free( a_r );
00225 }
00226 if( ipiv != NULL ) {
00227 LAPACKE_free( ipiv );
00228 }
00229 if( ipiv_i != NULL ) {
00230 LAPACKE_free( ipiv_i );
00231 }
00232 if( work != NULL ) {
00233 LAPACKE_free( work );
00234 }
00235 if( work_i != NULL ) {
00236 LAPACKE_free( work_i );
00237 }
00238 if( iwork != NULL ) {
00239 LAPACKE_free( iwork );
00240 }
00241 if( iwork_i != NULL ) {
00242 LAPACKE_free( iwork_i );
00243 }
00244
00245 return 0;
00246 }
00247
00248
00249 static void init_scalars_ssycon( char *uplo, lapack_int *n, lapack_int *lda,
00250 float *anorm )
00251 {
00252 *uplo = 'L';
00253 *n = 4;
00254 *lda = 8;
00255 *anorm = 1.128999901e+001;
00256
00257 return;
00258 }
00259
00260
00261 static void init_a( lapack_int size, float *a ) {
00262 lapack_int i;
00263 for( i = 0; i < size; i++ ) {
00264 a[i] = 0;
00265 }
00266 a[0] = 2.069999933e+000;
00267 a[8] = 0.000000000e+000;
00268 a[16] = 0.000000000e+000;
00269 a[24] = 0.000000000e+000;
00270 a[1] = 4.199999809e+000;
00271 a[9] = 1.149999976e+000;
00272 a[17] = 0.000000000e+000;
00273 a[25] = 0.000000000e+000;
00274 a[2] = 2.230414152e-001;
00275 a[10] = 8.115010858e-001;
00276 a[18] = -2.590677261e+000;
00277 a[26] = 0.000000000e+000;
00278 a[3] = 6.536583900e-001;
00279 a[11] = -5.959697366e-001;
00280 a[19] = 3.030846417e-001;
00281 a[27] = 4.073851407e-001;
00282 }
00283 static void init_ipiv( lapack_int size, lapack_int *ipiv ) {
00284 lapack_int i;
00285 for( i = 0; i < size; i++ ) {
00286 ipiv[i] = 0;
00287 }
00288 ipiv[0] = -3;
00289 ipiv[1] = -3;
00290 ipiv[2] = 3;
00291 ipiv[3] = 4;
00292 }
00293 static void init_work( lapack_int size, float *work ) {
00294 lapack_int i;
00295 for( i = 0; i < size; i++ ) {
00296 work[i] = 0;
00297 }
00298 }
00299 static void init_iwork( lapack_int size, lapack_int *iwork ) {
00300 lapack_int i;
00301 for( i = 0; i < size; i++ ) {
00302 iwork[i] = 0;
00303 }
00304 }
00305
00306
00307
00308 static int compare_ssycon( float rcond, float rcond_i, lapack_int info,
00309 lapack_int info_i )
00310 {
00311 int failed = 0;
00312 failed += compare_floats(rcond,rcond_i);
00313 failed += (info == info_i) ? 0 : 1;
00314 if( info != 0 || info_i != 0 ) {
00315 printf( "info=%d, info_i=%d\n",(int)info,(int)info_i );
00316 }
00317
00318 return failed;
00319 }