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_cheevx_work( int matrix_order, char jobz, char range,
00038 char uplo, lapack_int n,
00039 lapack_complex_float* a, lapack_int lda,
00040 float vl, float vu, lapack_int il,
00041 lapack_int iu, float abstol, lapack_int* m,
00042 float* w, lapack_complex_float* z,
00043 lapack_int ldz, lapack_complex_float* work,
00044 lapack_int lwork, float* rwork,
00045 lapack_int* iwork, lapack_int* ifail )
00046 {
00047 lapack_int info = 0;
00048 if( matrix_order == LAPACK_COL_MAJOR ) {
00049
00050 LAPACK_cheevx( &jobz, &range, &uplo, &n, a, &lda, &vl, &vu, &il, &iu,
00051 &abstol, m, w, z, &ldz, work, &lwork, rwork, iwork,
00052 ifail, &info );
00053 if( info < 0 ) {
00054 info = info - 1;
00055 }
00056 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00057 lapack_int ncols_z = ( LAPACKE_lsame( range, 'a' ) ||
00058 LAPACKE_lsame( range, 'v' ) ) ? n :
00059 ( LAPACKE_lsame( range, 'i' ) ? (iu-il+1) : 1);
00060 lapack_int lda_t = MAX(1,n);
00061 lapack_int ldz_t = MAX(1,n);
00062 lapack_complex_float* a_t = NULL;
00063 lapack_complex_float* z_t = NULL;
00064
00065 if( lda < n ) {
00066 info = -7;
00067 LAPACKE_xerbla( "LAPACKE_cheevx_work", info );
00068 return info;
00069 }
00070 if( ldz < ncols_z ) {
00071 info = -16;
00072 LAPACKE_xerbla( "LAPACKE_cheevx_work", info );
00073 return info;
00074 }
00075
00076 if( lwork == -1 ) {
00077 LAPACK_cheevx( &jobz, &range, &uplo, &n, a, &lda_t, &vl, &vu, &il,
00078 &iu, &abstol, m, w, z, &ldz_t, work, &lwork, rwork,
00079 iwork, ifail, &info );
00080 return (info < 0) ? (info - 1) : info;
00081 }
00082
00083 a_t = (lapack_complex_float*)
00084 LAPACKE_malloc( sizeof(lapack_complex_float) * lda_t * MAX(1,n) );
00085 if( a_t == NULL ) {
00086 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00087 goto exit_level_0;
00088 }
00089 if( LAPACKE_lsame( jobz, 'v' ) ) {
00090 z_t = (lapack_complex_float*)
00091 LAPACKE_malloc( sizeof(lapack_complex_float) *
00092 ldz_t * MAX(1,ncols_z) );
00093 if( z_t == NULL ) {
00094 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00095 goto exit_level_1;
00096 }
00097 }
00098
00099 LAPACKE_che_trans( matrix_order, uplo, n, a, lda, a_t, lda_t );
00100
00101 LAPACK_cheevx( &jobz, &range, &uplo, &n, a_t, &lda_t, &vl, &vu, &il,
00102 &iu, &abstol, m, w, z_t, &ldz_t, work, &lwork, rwork,
00103 iwork, ifail, &info );
00104 if( info < 0 ) {
00105 info = info - 1;
00106 }
00107
00108 LAPACKE_che_trans( LAPACK_COL_MAJOR, uplo, n, a_t, lda_t, a, lda );
00109 if( LAPACKE_lsame( jobz, 'v' ) ) {
00110 LAPACKE_cge_trans( LAPACK_COL_MAJOR, n, ncols_z, z_t, ldz_t, z,
00111 ldz );
00112 }
00113
00114 if( LAPACKE_lsame( jobz, 'v' ) ) {
00115 LAPACKE_free( z_t );
00116 }
00117 exit_level_1:
00118 LAPACKE_free( a_t );
00119 exit_level_0:
00120 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00121 LAPACKE_xerbla( "LAPACKE_cheevx_work", info );
00122 }
00123 } else {
00124 info = -1;
00125 LAPACKE_xerbla( "LAPACKE_cheevx_work", info );
00126 }
00127 return info;
00128 }