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