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_zhpgvx_work( int matrix_order, lapack_int itype, char jobz,
00038 char range, char uplo, lapack_int n,
00039 lapack_complex_double* ap,
00040 lapack_complex_double* bp, double vl, double vu,
00041 lapack_int il, lapack_int iu, double abstol,
00042 lapack_int* m, double* w,
00043 lapack_complex_double* z, lapack_int ldz,
00044 lapack_complex_double* work, double* rwork,
00045 lapack_int* iwork, lapack_int* ifail )
00046 {
00047 lapack_int info = 0;
00048 if( matrix_order == LAPACK_COL_MAJOR ) {
00049
00050 LAPACK_zhpgvx( &itype, &jobz, &range, &uplo, &n, ap, bp, &vl, &vu, &il,
00051 &iu, &abstol, m, w, z, &ldz, work, rwork, iwork, ifail,
00052 &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 ldz_t = MAX(1,n);
00061 lapack_complex_double* z_t = NULL;
00062 lapack_complex_double* ap_t = NULL;
00063 lapack_complex_double* bp_t = NULL;
00064
00065 if( ldz < ncols_z ) {
00066 info = -17;
00067 LAPACKE_xerbla( "LAPACKE_zhpgvx_work", info );
00068 return info;
00069 }
00070
00071 if( LAPACKE_lsame( jobz, 'v' ) ) {
00072 z_t = (lapack_complex_double*)
00073 LAPACKE_malloc( sizeof(lapack_complex_double) *
00074 ldz_t * MAX(1,ncols_z) );
00075 if( z_t == NULL ) {
00076 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00077 goto exit_level_0;
00078 }
00079 }
00080 ap_t = (lapack_complex_double*)
00081 LAPACKE_malloc( sizeof(lapack_complex_double) *
00082 ( MAX(1,n) * MAX(2,n+1) ) / 2 );
00083 if( ap_t == NULL ) {
00084 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00085 goto exit_level_1;
00086 }
00087 bp_t = (lapack_complex_double*)
00088 LAPACKE_malloc( sizeof(lapack_complex_double) *
00089 ( MAX(1,n) * MAX(2,n+1) ) / 2 );
00090 if( bp_t == NULL ) {
00091 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00092 goto exit_level_2;
00093 }
00094
00095 LAPACKE_zhp_trans( matrix_order, uplo, n, ap, ap_t );
00096 LAPACKE_zhp_trans( matrix_order, uplo, n, bp, bp_t );
00097
00098 LAPACK_zhpgvx( &itype, &jobz, &range, &uplo, &n, ap_t, bp_t, &vl, &vu,
00099 &il, &iu, &abstol, m, w, z_t, &ldz_t, work, rwork, iwork,
00100 ifail, &info );
00101 if( info < 0 ) {
00102 info = info - 1;
00103 }
00104
00105 if( LAPACKE_lsame( jobz, 'v' ) ) {
00106 LAPACKE_zge_trans( LAPACK_COL_MAJOR, n, ncols_z, z_t, ldz_t, z,
00107 ldz );
00108 }
00109 LAPACKE_zhp_trans( LAPACK_COL_MAJOR, uplo, n, ap_t, ap );
00110 LAPACKE_zhp_trans( LAPACK_COL_MAJOR, uplo, n, bp_t, bp );
00111
00112 LAPACKE_free( bp_t );
00113 exit_level_2:
00114 LAPACKE_free( ap_t );
00115 exit_level_1:
00116 if( LAPACKE_lsame( jobz, 'v' ) ) {
00117 LAPACKE_free( z_t );
00118 }
00119 exit_level_0:
00120 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00121 LAPACKE_xerbla( "LAPACKE_zhpgvx_work", info );
00122 }
00123 } else {
00124 info = -1;
00125 LAPACKE_xerbla( "LAPACKE_zhpgvx_work", info );
00126 }
00127 return info;
00128 }