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_zhbevd_work( int matrix_order, char jobz, char uplo,
00038 lapack_int n, lapack_int kd,
00039 lapack_complex_double* ab, lapack_int ldab,
00040 double* w, lapack_complex_double* z,
00041 lapack_int ldz, lapack_complex_double* work,
00042 lapack_int lwork, double* rwork,
00043 lapack_int lrwork, lapack_int* iwork,
00044 lapack_int liwork )
00045 {
00046 lapack_int info = 0;
00047 if( matrix_order == LAPACK_COL_MAJOR ) {
00048
00049 LAPACK_zhbevd( &jobz, &uplo, &n, &kd, ab, &ldab, w, z, &ldz, work,
00050 &lwork, rwork, &lrwork, iwork, &liwork, &info );
00051 if( info < 0 ) {
00052 info = info - 1;
00053 }
00054 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00055 lapack_int ldab_t = MAX(1,kd+1);
00056 lapack_int ldz_t = MAX(1,n);
00057 lapack_complex_double* ab_t = NULL;
00058 lapack_complex_double* z_t = NULL;
00059
00060 if( ldab < n ) {
00061 info = -7;
00062 LAPACKE_xerbla( "LAPACKE_zhbevd_work", info );
00063 return info;
00064 }
00065 if( ldz < n ) {
00066 info = -10;
00067 LAPACKE_xerbla( "LAPACKE_zhbevd_work", info );
00068 return info;
00069 }
00070
00071 if( liwork == -1 || lrwork == -1 || lwork == -1 ) {
00072 LAPACK_zhbevd( &jobz, &uplo, &n, &kd, ab, &ldab_t, w, z, &ldz_t,
00073 work, &lwork, rwork, &lrwork, iwork, &liwork,
00074 &info );
00075 return (info < 0) ? (info - 1) : info;
00076 }
00077
00078 ab_t = (lapack_complex_double*)
00079 LAPACKE_malloc( sizeof(lapack_complex_double) * ldab_t * MAX(1,n) );
00080 if( ab_t == NULL ) {
00081 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00082 goto exit_level_0;
00083 }
00084 if( LAPACKE_lsame( jobz, 'v' ) ) {
00085 z_t = (lapack_complex_double*)
00086 LAPACKE_malloc( sizeof(lapack_complex_double) *
00087 ldz_t * MAX(1,n) );
00088 if( z_t == NULL ) {
00089 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00090 goto exit_level_1;
00091 }
00092 }
00093
00094 LAPACKE_zhb_trans( matrix_order, uplo, n, kd, ab, ldab, ab_t, ldab_t );
00095
00096 LAPACK_zhbevd( &jobz, &uplo, &n, &kd, ab_t, &ldab_t, w, z_t, &ldz_t,
00097 work, &lwork, rwork, &lrwork, iwork, &liwork, &info );
00098 if( info < 0 ) {
00099 info = info - 1;
00100 }
00101
00102 LAPACKE_zhb_trans( LAPACK_COL_MAJOR, uplo, n, kd, ab_t, ldab_t, ab,
00103 ldab );
00104 if( LAPACKE_lsame( jobz, 'v' ) ) {
00105 LAPACKE_zge_trans( LAPACK_COL_MAJOR, n, n, z_t, ldz_t, z, ldz );
00106 }
00107
00108 if( LAPACKE_lsame( jobz, 'v' ) ) {
00109 LAPACKE_free( z_t );
00110 }
00111 exit_level_1:
00112 LAPACKE_free( ab_t );
00113 exit_level_0:
00114 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00115 LAPACKE_xerbla( "LAPACKE_zhbevd_work", info );
00116 }
00117 } else {
00118 info = -1;
00119 LAPACKE_xerbla( "LAPACKE_zhbevd_work", info );
00120 }
00121 return info;
00122 }