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_zunmqr( char *side, char *trans, lapack_int *m,
00055 lapack_int *n, lapack_int *k, lapack_int *lda,
00056 lapack_int *ldc, lapack_int *lwork );
00057 static void init_a( lapack_int size, lapack_complex_double *a );
00058 static void init_tau( lapack_int size, lapack_complex_double *tau );
00059 static void init_c( lapack_int size, lapack_complex_double *c );
00060 static void init_work( lapack_int size, lapack_complex_double *work );
00061 static int compare_zunmqr( lapack_complex_double *c, lapack_complex_double *c_i,
00062 lapack_int info, lapack_int info_i, lapack_int ldc,
00063 lapack_int n );
00064
00065 int main(void)
00066 {
00067
00068 char side, side_i;
00069 char trans, trans_i;
00070 lapack_int m, m_i;
00071 lapack_int n, n_i;
00072 lapack_int k, k_i;
00073 lapack_int lda, lda_i;
00074 lapack_int lda_r;
00075 lapack_int ldc, ldc_i;
00076 lapack_int ldc_r;
00077 lapack_int lwork, lwork_i;
00078 lapack_int info, info_i;
00079
00080 lapack_int r;
00081 lapack_int i;
00082 int failed;
00083
00084
00085 lapack_complex_double *a = NULL, *a_i = NULL;
00086 lapack_complex_double *tau = NULL, *tau_i = NULL;
00087 lapack_complex_double *c = NULL, *c_i = NULL;
00088 lapack_complex_double *work = NULL, *work_i = NULL;
00089 lapack_complex_double *c_save = NULL;
00090 lapack_complex_double *a_r = NULL;
00091 lapack_complex_double *c_r = NULL;
00092
00093
00094 init_scalars_zunmqr( &side, &trans, &m, &n, &k, &lda, &ldc, &lwork );
00095 r = LAPACKE_lsame( side, 'l' ) ? m : n;
00096 lda_r = k+2;
00097 ldc_r = n+2;
00098 side_i = side;
00099 trans_i = trans;
00100 m_i = m;
00101 n_i = n;
00102 k_i = k;
00103 lda_i = lda;
00104 ldc_i = ldc;
00105 lwork_i = lwork;
00106
00107
00108 a = (lapack_complex_double *)
00109 LAPACKE_malloc( lda*k * sizeof(lapack_complex_double) );
00110 tau = (lapack_complex_double *)
00111 LAPACKE_malloc( k * sizeof(lapack_complex_double) );
00112 c = (lapack_complex_double *)
00113 LAPACKE_malloc( ldc*n * sizeof(lapack_complex_double) );
00114 work = (lapack_complex_double *)
00115 LAPACKE_malloc( lwork * sizeof(lapack_complex_double) );
00116
00117
00118 a_i = (lapack_complex_double *)
00119 LAPACKE_malloc( lda*k * sizeof(lapack_complex_double) );
00120 tau_i = (lapack_complex_double *)
00121 LAPACKE_malloc( k * sizeof(lapack_complex_double) );
00122 c_i = (lapack_complex_double *)
00123 LAPACKE_malloc( ldc*n * sizeof(lapack_complex_double) );
00124 work_i = (lapack_complex_double *)
00125 LAPACKE_malloc( lwork * sizeof(lapack_complex_double) );
00126
00127
00128 c_save = (lapack_complex_double *)
00129 LAPACKE_malloc( ldc*n * sizeof(lapack_complex_double) );
00130
00131
00132 a_r = (lapack_complex_double *)
00133 LAPACKE_malloc( r*(k+2) * sizeof(lapack_complex_double) );
00134 c_r = (lapack_complex_double *)
00135 LAPACKE_malloc( m*(n+2) * sizeof(lapack_complex_double) );
00136
00137
00138 init_a( lda*k, a );
00139 init_tau( k, tau );
00140 init_c( ldc*n, c );
00141 init_work( lwork, work );
00142
00143
00144 for( i = 0; i < ldc*n; i++ ) {
00145 c_save[i] = c[i];
00146 }
00147
00148
00149 zunmqr_( &side, &trans, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork,
00150 &info );
00151
00152
00153
00154 for( i = 0; i < lda*k; i++ ) {
00155 a_i[i] = a[i];
00156 }
00157 for( i = 0; i < k; i++ ) {
00158 tau_i[i] = tau[i];
00159 }
00160 for( i = 0; i < ldc*n; i++ ) {
00161 c_i[i] = c_save[i];
00162 }
00163 for( i = 0; i < lwork; i++ ) {
00164 work_i[i] = work[i];
00165 }
00166 info_i = LAPACKE_zunmqr_work( LAPACK_COL_MAJOR, side_i, trans_i, m_i, n_i,
00167 k_i, a_i, lda_i, tau_i, c_i, ldc_i, work_i,
00168 lwork_i );
00169
00170 failed = compare_zunmqr( c, c_i, info, info_i, ldc, n );
00171 if( failed == 0 ) {
00172 printf( "PASSED: column-major middle-level interface to zunmqr\n" );
00173 } else {
00174 printf( "FAILED: column-major middle-level interface to zunmqr\n" );
00175 }
00176
00177
00178
00179 for( i = 0; i < lda*k; i++ ) {
00180 a_i[i] = a[i];
00181 }
00182 for( i = 0; i < k; i++ ) {
00183 tau_i[i] = tau[i];
00184 }
00185 for( i = 0; i < ldc*n; i++ ) {
00186 c_i[i] = c_save[i];
00187 }
00188 for( i = 0; i < lwork; i++ ) {
00189 work_i[i] = work[i];
00190 }
00191 info_i = LAPACKE_zunmqr( LAPACK_COL_MAJOR, side_i, trans_i, m_i, n_i, k_i,
00192 a_i, lda_i, tau_i, c_i, ldc_i );
00193
00194 failed = compare_zunmqr( c, c_i, info, info_i, ldc, n );
00195 if( failed == 0 ) {
00196 printf( "PASSED: column-major high-level interface to zunmqr\n" );
00197 } else {
00198 printf( "FAILED: column-major high-level interface to zunmqr\n" );
00199 }
00200
00201
00202
00203 for( i = 0; i < lda*k; i++ ) {
00204 a_i[i] = a[i];
00205 }
00206 for( i = 0; i < k; i++ ) {
00207 tau_i[i] = tau[i];
00208 }
00209 for( i = 0; i < ldc*n; i++ ) {
00210 c_i[i] = c_save[i];
00211 }
00212 for( i = 0; i < lwork; i++ ) {
00213 work_i[i] = work[i];
00214 }
00215
00216 LAPACKE_zge_trans( LAPACK_COL_MAJOR, r, k, a_i, lda, a_r, k+2 );
00217 LAPACKE_zge_trans( LAPACK_COL_MAJOR, m, n, c_i, ldc, c_r, n+2 );
00218 info_i = LAPACKE_zunmqr_work( LAPACK_ROW_MAJOR, side_i, trans_i, m_i, n_i,
00219 k_i, a_r, lda_r, tau_i, c_r, ldc_r, work_i,
00220 lwork_i );
00221
00222 LAPACKE_zge_trans( LAPACK_ROW_MAJOR, m, n, c_r, n+2, c_i, ldc );
00223
00224 failed = compare_zunmqr( c, c_i, info, info_i, ldc, n );
00225 if( failed == 0 ) {
00226 printf( "PASSED: row-major middle-level interface to zunmqr\n" );
00227 } else {
00228 printf( "FAILED: row-major middle-level interface to zunmqr\n" );
00229 }
00230
00231
00232
00233 for( i = 0; i < lda*k; i++ ) {
00234 a_i[i] = a[i];
00235 }
00236 for( i = 0; i < k; i++ ) {
00237 tau_i[i] = tau[i];
00238 }
00239 for( i = 0; i < ldc*n; i++ ) {
00240 c_i[i] = c_save[i];
00241 }
00242 for( i = 0; i < lwork; i++ ) {
00243 work_i[i] = work[i];
00244 }
00245
00246
00247 LAPACKE_zge_trans( LAPACK_COL_MAJOR, r, k, a_i, lda, a_r, k+2 );
00248 LAPACKE_zge_trans( LAPACK_COL_MAJOR, m, n, c_i, ldc, c_r, n+2 );
00249 info_i = LAPACKE_zunmqr( LAPACK_ROW_MAJOR, side_i, trans_i, m_i, n_i, k_i,
00250 a_r, lda_r, tau_i, c_r, ldc_r );
00251
00252 LAPACKE_zge_trans( LAPACK_ROW_MAJOR, m, n, c_r, n+2, c_i, ldc );
00253
00254 failed = compare_zunmqr( c, c_i, info, info_i, ldc, n );
00255 if( failed == 0 ) {
00256 printf( "PASSED: row-major high-level interface to zunmqr\n" );
00257 } else {
00258 printf( "FAILED: row-major high-level interface to zunmqr\n" );
00259 }
00260
00261
00262 if( a != NULL ) {
00263 LAPACKE_free( a );
00264 }
00265 if( a_i != NULL ) {
00266 LAPACKE_free( a_i );
00267 }
00268 if( a_r != NULL ) {
00269 LAPACKE_free( a_r );
00270 }
00271 if( tau != NULL ) {
00272 LAPACKE_free( tau );
00273 }
00274 if( tau_i != NULL ) {
00275 LAPACKE_free( tau_i );
00276 }
00277 if( c != NULL ) {
00278 LAPACKE_free( c );
00279 }
00280 if( c_i != NULL ) {
00281 LAPACKE_free( c_i );
00282 }
00283 if( c_r != NULL ) {
00284 LAPACKE_free( c_r );
00285 }
00286 if( c_save != NULL ) {
00287 LAPACKE_free( c_save );
00288 }
00289 if( work != NULL ) {
00290 LAPACKE_free( work );
00291 }
00292 if( work_i != NULL ) {
00293 LAPACKE_free( work_i );
00294 }
00295
00296 return 0;
00297 }
00298
00299
00300 static void init_scalars_zunmqr( char *side, char *trans, lapack_int *m,
00301 lapack_int *n, lapack_int *k, lapack_int *lda,
00302 lapack_int *ldc, lapack_int *lwork )
00303 {
00304 *side = 'L';
00305 *trans = 'C';
00306 *m = 5;
00307 *n = 2;
00308 *k = 3;
00309 *lda = 8;
00310 *ldc = 8;
00311 *lwork = 512;
00312
00313 return;
00314 }
00315
00316
00317 static void init_a( lapack_int size, lapack_complex_double *a ) {
00318 lapack_int i;
00319 for( i = 0; i < size; i++ ) {
00320 a[i] = lapack_make_complex_double( 0.0, 0.0 );
00321 }
00322 a[0] = lapack_make_complex_double( -2.28700677742764880e+000,
00323 0.00000000000000000e+000 );
00324 a[8] = lapack_make_complex_double( -7.23871925671358720e-001,
00325 5.60514298712240460e-001 );
00326 a[16] = lapack_make_complex_double( 7.56971958757025500e-001,
00327 4.51944441180257450e-001 );
00328 a[1] = lapack_make_complex_double( -1.41987831087444230e-001,
00329 8.15431066587506830e-003 );
00330 a[9] = lapack_make_complex_double( 1.89500215202093210e+000,
00331 0.00000000000000000e+000 );
00332 a[17] = lapack_make_complex_double( -3.62042107080837280e-001,
00333 -4.78657240305253420e-001 );
00334 a[2] = lapack_make_complex_double( -9.06131808634396410e-002,
00335 -5.90946044610632520e-002 );
00336 a[10] = lapack_make_complex_double( -4.73439672577799340e-001,
00337 1.68439572892672610e-001 );
00338 a[18] = lapack_make_complex_double( 9.39282936471031560e-001,
00339 0.00000000000000000e+000 );
00340 a[3] = lapack_make_complex_double( 4.08210340556465660e-001,
00341 -1.17792243052802140e-001 );
00342 a[11] = lapack_make_complex_double( 2.58521862467017920e-001,
00343 2.66720382327443330e-002 );
00344 a[19] = lapack_make_complex_double( 4.50972094106415690e-002,
00345 5.81513806297987880e-001 );
00346 a[4] = lapack_make_complex_double( -8.95656153586470990e-002,
00347 3.39695746702570130e-001 );
00348 a[12] = lapack_make_complex_double( -6.87183019669032950e-001,
00349 3.17086911183261100e-002 );
00350 a[20] = lapack_make_complex_double( -1.17064906202052320e-001,
00351 -1.20657309265043160e-002 );
00352 }
00353 static void init_tau( lapack_int size, lapack_complex_double *tau ) {
00354 lapack_int i;
00355 for( i = 0; i < size; i++ ) {
00356 tau[i] = lapack_make_complex_double( 0.0, 0.0 );
00357 }
00358 tau[0] = lapack_make_complex_double( 1.34980219905592680e+000,
00359 -4.45997803796306660e-001 );
00360 tau[1] = lapack_make_complex_double( 1.04037745348862610e+000,
00361 2.79135088926636740e-001 );
00362 tau[2] = lapack_make_complex_double( 1.47028895497071630e+000,
00363 9.97710593712547170e-002 );
00364 }
00365 static void init_c( lapack_int size, lapack_complex_double *c ) {
00366 lapack_int i;
00367 for( i = 0; i < size; i++ ) {
00368 c[i] = lapack_make_complex_double( 0.0, 0.0 );
00369 }
00370 c[0] = lapack_make_complex_double( -8.49999999999999980e-001,
00371 -1.62999999999999990e+000 );
00372 c[8] = lapack_make_complex_double( 2.49000000000000020e+000,
00373 4.00999999999999980e+000 );
00374 c[1] = lapack_make_complex_double( -2.16000000000000010e+000,
00375 3.52000000000000000e+000 );
00376 c[9] = lapack_make_complex_double( -1.40000000000000010e-001,
00377 7.98000000000000040e+000 );
00378 c[2] = lapack_make_complex_double( 4.57000000000000030e+000,
00379 -5.71000000000000000e+000 );
00380 c[10] = lapack_make_complex_double( 8.35999999999999940e+000,
00381 -2.80000000000000030e-001 );
00382 c[3] = lapack_make_complex_double( 6.37999999999999990e+000,
00383 -7.40000000000000040e+000 );
00384 c[11] = lapack_make_complex_double( -3.54999999999999980e+000,
00385 1.29000000000000000e+000 );
00386 c[4] = lapack_make_complex_double( 8.41000000000000010e+000,
00387 9.39000000000000060e+000 );
00388 c[12] = lapack_make_complex_double( -6.71999999999999980e+000,
00389 5.03000000000000020e+000 );
00390 }
00391 static void init_work( lapack_int size, lapack_complex_double *work ) {
00392 lapack_int i;
00393 for( i = 0; i < size; i++ ) {
00394 work[i] = lapack_make_complex_double( 0.0, 0.0 );
00395 }
00396 }
00397
00398
00399
00400 static int compare_zunmqr( lapack_complex_double *c, lapack_complex_double *c_i,
00401 lapack_int info, lapack_int info_i, lapack_int ldc,
00402 lapack_int n )
00403 {
00404 lapack_int i;
00405 int failed = 0;
00406 for( i = 0; i < ldc*n; i++ ) {
00407 failed += compare_complex_doubles(c[i],c_i[i]);
00408 }
00409 failed += (info == info_i) ? 0 : 1;
00410 if( info != 0 || info_i != 0 ) {
00411 printf( "info=%d, info_i=%d\n",(int)info,(int)info_i );
00412 }
00413
00414 return failed;
00415 }