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 #include "lapacke.h"
00035 #include "lapacke_utils.h"
00036
00037 lapack_int LAPACKE_zgeevx_work( int matrix_order, char balanc, char jobvl,
00038 char jobvr, char sense, lapack_int n,
00039 lapack_complex_double* a, lapack_int lda,
00040 lapack_complex_double* w,
00041 lapack_complex_double* vl, lapack_int ldvl,
00042 lapack_complex_double* vr, lapack_int ldvr,
00043 lapack_int* ilo, lapack_int* ihi, double* scale,
00044 double* abnrm, double* rconde, double* rcondv,
00045 lapack_complex_double* work, lapack_int lwork,
00046 double* rwork )
00047 {
00048 lapack_int info = 0;
00049 if( matrix_order == LAPACK_COL_MAJOR ) {
00050
00051 LAPACK_zgeevx( &balanc, &jobvl, &jobvr, &sense, &n, a, &lda, w, vl,
00052 &ldvl, vr, &ldvr, ilo, ihi, scale, abnrm, rconde, rcondv,
00053 work, &lwork, rwork, &info );
00054 if( info < 0 ) {
00055 info = info - 1;
00056 }
00057 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00058 lapack_int lda_t = MAX(1,n);
00059 lapack_int ldvl_t = MAX(1,n);
00060 lapack_int ldvr_t = MAX(1,n);
00061 lapack_complex_double* a_t = NULL;
00062 lapack_complex_double* vl_t = NULL;
00063 lapack_complex_double* vr_t = NULL;
00064
00065 if( lda < n ) {
00066 info = -8;
00067 LAPACKE_xerbla( "LAPACKE_zgeevx_work", info );
00068 return info;
00069 }
00070 if( ldvl < n ) {
00071 info = -11;
00072 LAPACKE_xerbla( "LAPACKE_zgeevx_work", info );
00073 return info;
00074 }
00075 if( ldvr < n ) {
00076 info = -13;
00077 LAPACKE_xerbla( "LAPACKE_zgeevx_work", info );
00078 return info;
00079 }
00080
00081 if( lwork == -1 ) {
00082 LAPACK_zgeevx( &balanc, &jobvl, &jobvr, &sense, &n, a, &lda_t, w,
00083 vl, &ldvl_t, vr, &ldvr_t, ilo, ihi, scale, abnrm,
00084 rconde, rcondv, work, &lwork, rwork, &info );
00085 return (info < 0) ? (info - 1) : info;
00086 }
00087
00088 a_t = (lapack_complex_double*)
00089 LAPACKE_malloc( sizeof(lapack_complex_double) * lda_t * MAX(1,n) );
00090 if( a_t == NULL ) {
00091 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00092 goto exit_level_0;
00093 }
00094 if( LAPACKE_lsame( jobvl, 'v' ) ) {
00095 vl_t = (lapack_complex_double*)
00096 LAPACKE_malloc( sizeof(lapack_complex_double) *
00097 ldvl_t * MAX(1,n) );
00098 if( vl_t == NULL ) {
00099 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00100 goto exit_level_1;
00101 }
00102 }
00103 if( LAPACKE_lsame( jobvr, 'v' ) ) {
00104 vr_t = (lapack_complex_double*)
00105 LAPACKE_malloc( sizeof(lapack_complex_double) *
00106 ldvr_t * MAX(1,n) );
00107 if( vr_t == NULL ) {
00108 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00109 goto exit_level_2;
00110 }
00111 }
00112
00113 LAPACKE_zge_trans( matrix_order, n, n, a, lda, a_t, lda_t );
00114
00115 LAPACK_zgeevx( &balanc, &jobvl, &jobvr, &sense, &n, a_t, &lda_t, w,
00116 vl_t, &ldvl_t, vr_t, &ldvr_t, ilo, ihi, scale, abnrm,
00117 rconde, rcondv, work, &lwork, rwork, &info );
00118 if( info < 0 ) {
00119 info = info - 1;
00120 }
00121
00122 LAPACKE_zge_trans( LAPACK_COL_MAJOR, n, n, a_t, lda_t, a, lda );
00123 if( LAPACKE_lsame( jobvl, 'v' ) ) {
00124 LAPACKE_zge_trans( LAPACK_COL_MAJOR, n, n, vl_t, ldvl_t, vl, ldvl );
00125 }
00126 if( LAPACKE_lsame( jobvr, 'v' ) ) {
00127 LAPACKE_zge_trans( LAPACK_COL_MAJOR, n, n, vr_t, ldvr_t, vr, ldvr );
00128 }
00129
00130 if( LAPACKE_lsame( jobvr, 'v' ) ) {
00131 LAPACKE_free( vr_t );
00132 }
00133 exit_level_2:
00134 if( LAPACKE_lsame( jobvl, 'v' ) ) {
00135 LAPACKE_free( vl_t );
00136 }
00137 exit_level_1:
00138 LAPACKE_free( a_t );
00139 exit_level_0:
00140 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00141 LAPACKE_xerbla( "LAPACKE_zgeevx_work", info );
00142 }
00143 } else {
00144 info = -1;
00145 LAPACKE_xerbla( "LAPACKE_zgeevx_work", info );
00146 }
00147 return info;
00148 }