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_chpev_work( int matrix_order, char jobz, char uplo,
00038 lapack_int n, lapack_complex_float* ap, float* w,
00039 lapack_complex_float* z, lapack_int ldz,
00040 lapack_complex_float* work, float* rwork )
00041 {
00042 lapack_int info = 0;
00043 if( matrix_order == LAPACK_COL_MAJOR ) {
00044
00045 LAPACK_chpev( &jobz, &uplo, &n, ap, w, z, &ldz, work, rwork, &info );
00046 if( info < 0 ) {
00047 info = info - 1;
00048 }
00049 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00050 lapack_int ldz_t = MAX(1,n);
00051 lapack_complex_float* z_t = NULL;
00052 lapack_complex_float* ap_t = NULL;
00053
00054 if( ldz < n ) {
00055 info = -8;
00056 LAPACKE_xerbla( "LAPACKE_chpev_work", info );
00057 return info;
00058 }
00059
00060 if( LAPACKE_lsame( jobz, 'v' ) ) {
00061 z_t = (lapack_complex_float*)
00062 LAPACKE_malloc( sizeof(lapack_complex_float) *
00063 ldz_t * MAX(1,n) );
00064 if( z_t == NULL ) {
00065 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00066 goto exit_level_0;
00067 }
00068 }
00069 ap_t = (lapack_complex_float*)
00070 LAPACKE_malloc( sizeof(lapack_complex_float) *
00071 ( MAX(1,n) * MAX(2,n+1) ) / 2 );
00072 if( ap_t == NULL ) {
00073 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00074 goto exit_level_1;
00075 }
00076
00077 LAPACKE_chp_trans( matrix_order, uplo, n, ap, ap_t );
00078
00079 LAPACK_chpev( &jobz, &uplo, &n, ap_t, w, z_t, &ldz_t, work, rwork,
00080 &info );
00081 if( info < 0 ) {
00082 info = info - 1;
00083 }
00084
00085 if( LAPACKE_lsame( jobz, 'v' ) ) {
00086 LAPACKE_cge_trans( LAPACK_COL_MAJOR, n, n, z_t, ldz_t, z, ldz );
00087 }
00088 LAPACKE_chp_trans( LAPACK_COL_MAJOR, uplo, n, ap_t, ap );
00089
00090 LAPACKE_free( ap_t );
00091 exit_level_1:
00092 if( LAPACKE_lsame( jobz, 'v' ) ) {
00093 LAPACKE_free( z_t );
00094 }
00095 exit_level_0:
00096 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00097 LAPACKE_xerbla( "LAPACKE_chpev_work", info );
00098 }
00099 } else {
00100 info = -1;
00101 LAPACKE_xerbla( "LAPACKE_chpev_work", info );
00102 }
00103 return info;
00104 }