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