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_zgebal( char *job, lapack_int *n, lapack_int *lda );
00055 static void init_a( lapack_int size, lapack_complex_double *a );
00056 static void init_scale( lapack_int size, double *scale );
00057 static int compare_zgebal( lapack_complex_double *a, lapack_complex_double *a_i,
00058 lapack_int ilo, lapack_int ilo_i, lapack_int ihi,
00059 lapack_int ihi_i, double *scale, double *scale_i,
00060 lapack_int info, lapack_int info_i, char job,
00061 lapack_int lda, lapack_int n );
00062
00063 int main(void)
00064 {
00065
00066 char job, job_i;
00067 lapack_int n, n_i;
00068 lapack_int lda, lda_i;
00069 lapack_int lda_r;
00070 lapack_int ilo, ilo_i;
00071 lapack_int ihi, ihi_i;
00072 lapack_int info, info_i;
00073 lapack_int i;
00074 int failed;
00075
00076
00077 lapack_complex_double *a = NULL, *a_i = NULL;
00078 double *scale = NULL, *scale_i = NULL;
00079 lapack_complex_double *a_save = NULL;
00080 double *scale_save = NULL;
00081 lapack_complex_double *a_r = NULL;
00082
00083
00084 init_scalars_zgebal( &job, &n, &lda );
00085 lda_r = n+2;
00086 job_i = job;
00087 n_i = n;
00088 lda_i = lda;
00089
00090
00091 a = (lapack_complex_double *)
00092 LAPACKE_malloc( lda*n * sizeof(lapack_complex_double) );
00093 scale = (double *)LAPACKE_malloc( n * sizeof(double) );
00094
00095
00096 a_i = (lapack_complex_double *)
00097 LAPACKE_malloc( lda*n * sizeof(lapack_complex_double) );
00098 scale_i = (double *)LAPACKE_malloc( n * sizeof(double) );
00099
00100
00101 a_save = (lapack_complex_double *)
00102 LAPACKE_malloc( lda*n * sizeof(lapack_complex_double) );
00103 scale_save = (double *)LAPACKE_malloc( n * sizeof(double) );
00104
00105
00106 a_r = (lapack_complex_double *)
00107 LAPACKE_malloc( n*(n+2) * sizeof(lapack_complex_double) );
00108
00109
00110 init_a( lda*n, a );
00111 init_scale( n, scale );
00112
00113
00114 for( i = 0; i < lda*n; i++ ) {
00115 a_save[i] = a[i];
00116 }
00117 for( i = 0; i < n; i++ ) {
00118 scale_save[i] = scale[i];
00119 }
00120
00121
00122 zgebal_( &job, &n, a, &lda, &ilo, &ihi, scale, &info );
00123
00124
00125
00126 for( i = 0; i < lda*n; i++ ) {
00127 a_i[i] = a_save[i];
00128 }
00129 for( i = 0; i < n; i++ ) {
00130 scale_i[i] = scale_save[i];
00131 }
00132 info_i = LAPACKE_zgebal_work( LAPACK_COL_MAJOR, job_i, n_i, a_i, lda_i,
00133 &ilo_i, &ihi_i, scale_i );
00134
00135 failed = compare_zgebal( a, a_i, ilo, ilo_i, ihi, ihi_i, scale, scale_i,
00136 info, info_i, job, lda, n );
00137 if( failed == 0 ) {
00138 printf( "PASSED: column-major middle-level interface to zgebal\n" );
00139 } else {
00140 printf( "FAILED: column-major middle-level interface to zgebal\n" );
00141 }
00142
00143
00144
00145 for( i = 0; i < lda*n; i++ ) {
00146 a_i[i] = a_save[i];
00147 }
00148 for( i = 0; i < n; i++ ) {
00149 scale_i[i] = scale_save[i];
00150 }
00151 info_i = LAPACKE_zgebal( LAPACK_COL_MAJOR, job_i, n_i, a_i, lda_i, &ilo_i,
00152 &ihi_i, scale_i );
00153
00154 failed = compare_zgebal( a, a_i, ilo, ilo_i, ihi, ihi_i, scale, scale_i,
00155 info, info_i, job, lda, n );
00156 if( failed == 0 ) {
00157 printf( "PASSED: column-major high-level interface to zgebal\n" );
00158 } else {
00159 printf( "FAILED: column-major high-level interface to zgebal\n" );
00160 }
00161
00162
00163
00164 for( i = 0; i < lda*n; i++ ) {
00165 a_i[i] = a_save[i];
00166 }
00167 for( i = 0; i < n; i++ ) {
00168 scale_i[i] = scale_save[i];
00169 }
00170
00171 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'p' ) ||
00172 LAPACKE_lsame( job, 's' ) ) {
00173 LAPACKE_zge_trans( LAPACK_COL_MAJOR, n, n, a_i, lda, a_r, n+2 );
00174 }
00175 info_i = LAPACKE_zgebal_work( LAPACK_ROW_MAJOR, job_i, n_i, a_r, lda_r,
00176 &ilo_i, &ihi_i, scale_i );
00177
00178 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'p' ) ||
00179 LAPACKE_lsame( job, 's' ) ) {
00180 LAPACKE_zge_trans( LAPACK_ROW_MAJOR, n, n, a_r, n+2, a_i, lda );
00181 }
00182
00183 failed = compare_zgebal( a, a_i, ilo, ilo_i, ihi, ihi_i, scale, scale_i,
00184 info, info_i, job, lda, n );
00185 if( failed == 0 ) {
00186 printf( "PASSED: row-major middle-level interface to zgebal\n" );
00187 } else {
00188 printf( "FAILED: row-major middle-level interface to zgebal\n" );
00189 }
00190
00191
00192
00193 for( i = 0; i < lda*n; i++ ) {
00194 a_i[i] = a_save[i];
00195 }
00196 for( i = 0; i < n; i++ ) {
00197 scale_i[i] = scale_save[i];
00198 }
00199
00200
00201 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'p' ) ||
00202 LAPACKE_lsame( job, 's' ) ) {
00203 LAPACKE_zge_trans( LAPACK_COL_MAJOR, n, n, a_i, lda, a_r, n+2 );
00204 }
00205 info_i = LAPACKE_zgebal( LAPACK_ROW_MAJOR, job_i, n_i, a_r, lda_r, &ilo_i,
00206 &ihi_i, scale_i );
00207
00208 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'p' ) ||
00209 LAPACKE_lsame( job, 's' ) ) {
00210 LAPACKE_zge_trans( LAPACK_ROW_MAJOR, n, n, a_r, n+2, a_i, lda );
00211 }
00212
00213 failed = compare_zgebal( a, a_i, ilo, ilo_i, ihi, ihi_i, scale, scale_i,
00214 info, info_i, job, lda, n );
00215 if( failed == 0 ) {
00216 printf( "PASSED: row-major high-level interface to zgebal\n" );
00217 } else {
00218 printf( "FAILED: row-major high-level interface to zgebal\n" );
00219 }
00220
00221
00222 if( a != NULL ) {
00223 LAPACKE_free( a );
00224 }
00225 if( a_i != NULL ) {
00226 LAPACKE_free( a_i );
00227 }
00228 if( a_r != NULL ) {
00229 LAPACKE_free( a_r );
00230 }
00231 if( a_save != NULL ) {
00232 LAPACKE_free( a_save );
00233 }
00234 if( scale != NULL ) {
00235 LAPACKE_free( scale );
00236 }
00237 if( scale_i != NULL ) {
00238 LAPACKE_free( scale_i );
00239 }
00240 if( scale_save != NULL ) {
00241 LAPACKE_free( scale_save );
00242 }
00243
00244 return 0;
00245 }
00246
00247
00248 static void init_scalars_zgebal( char *job, lapack_int *n, lapack_int *lda )
00249 {
00250 *job = 'B';
00251 *n = 4;
00252 *lda = 8;
00253
00254 return;
00255 }
00256
00257
00258 static void init_a( lapack_int size, lapack_complex_double *a ) {
00259 lapack_int i;
00260 for( i = 0; i < size; i++ ) {
00261 a[i] = lapack_make_complex_double( 0.0, 0.0 );
00262 }
00263 a[0] = lapack_make_complex_double( 1.50000000000000000e+000,
00264 -2.75000000000000000e+000 );
00265 a[8] = lapack_make_complex_double( 0.00000000000000000e+000,
00266 0.00000000000000000e+000 );
00267 a[16] = lapack_make_complex_double( 0.00000000000000000e+000,
00268 0.00000000000000000e+000 );
00269 a[24] = lapack_make_complex_double( 0.00000000000000000e+000,
00270 0.00000000000000000e+000 );
00271 a[1] = lapack_make_complex_double( -8.06000000000000050e+000,
00272 -1.24000000000000000e+000 );
00273 a[9] = lapack_make_complex_double( -2.50000000000000000e+000,
00274 -5.00000000000000000e-001 );
00275 a[17] = lapack_make_complex_double( 0.00000000000000000e+000,
00276 0.00000000000000000e+000 );
00277 a[25] = lapack_make_complex_double( -7.50000000000000000e-001,
00278 5.00000000000000000e-001 );
00279 a[2] = lapack_make_complex_double( -2.08999999999999990e+000,
00280 7.55999999999999960e+000 );
00281 a[10] = lapack_make_complex_double( 1.38999999999999990e+000,
00282 3.97000000000000020e+000 );
00283 a[18] = lapack_make_complex_double( -1.25000000000000000e+000,
00284 7.50000000000000000e-001 );
00285 a[26] = lapack_make_complex_double( -4.82000000000000030e+000,
00286 -5.66999999999999990e+000 );
00287 a[3] = lapack_make_complex_double( 6.17999999999999970e+000,
00288 9.78999999999999910e+000 );
00289 a[11] = lapack_make_complex_double( -9.20000000000000040e-001,
00290 -6.20000000000000000e-001 );
00291 a[19] = lapack_make_complex_double( 0.00000000000000000e+000,
00292 0.00000000000000000e+000 );
00293 a[27] = lapack_make_complex_double( -2.50000000000000000e+000,
00294 -5.00000000000000000e-001 );
00295 }
00296 static void init_scale( lapack_int size, double *scale ) {
00297 lapack_int i;
00298 for( i = 0; i < size; i++ ) {
00299 scale[i] = 0;
00300 }
00301 }
00302
00303
00304
00305 static int compare_zgebal( lapack_complex_double *a, lapack_complex_double *a_i,
00306 lapack_int ilo, lapack_int ilo_i, lapack_int ihi,
00307 lapack_int ihi_i, double *scale, double *scale_i,
00308 lapack_int info, lapack_int info_i, char job,
00309 lapack_int lda, lapack_int n )
00310 {
00311 lapack_int i;
00312 int failed = 0;
00313 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'p' ) ||
00314 LAPACKE_lsame( job, 's' ) ) {
00315 for( i = 0; i < lda*n; i++ ) {
00316 failed += compare_complex_doubles(a[i],a_i[i]);
00317 }
00318 }
00319 failed += (ilo == ilo_i) ? 0 : 1;
00320 failed += (ihi == ihi_i) ? 0 : 1;
00321 for( i = 0; i < n; i++ ) {
00322 failed += compare_doubles(scale[i],scale_i[i]);
00323 }
00324 failed += (info == info_i) ? 0 : 1;
00325 if( info != 0 || info_i != 0 ) {
00326 printf( "info=%d, info_i=%d\n",(int)info,(int)info_i );
00327 }
00328
00329 return failed;
00330 }