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_ssbgvx_work( int matrix_order, char jobz, char range,
00038 char uplo, lapack_int n, lapack_int ka,
00039 lapack_int kb, float* ab, lapack_int ldab,
00040 float* bb, lapack_int ldbb, float* q,
00041 lapack_int ldq, float vl, float vu,
00042 lapack_int il, lapack_int iu, float abstol,
00043 lapack_int* m, float* w, float* z,
00044 lapack_int ldz, float* work, lapack_int* iwork,
00045 lapack_int* ifail )
00046 {
00047 lapack_int info = 0;
00048 if( matrix_order == LAPACK_COL_MAJOR ) {
00049
00050 LAPACK_ssbgvx( &jobz, &range, &uplo, &n, &ka, &kb, ab, &ldab, bb, &ldbb,
00051 q, &ldq, &vl, &vu, &il, &iu, &abstol, m, w, z, &ldz,
00052 work, iwork, ifail, &info );
00053 if( info < 0 ) {
00054 info = info - 1;
00055 }
00056 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00057 lapack_int ldab_t = MAX(1,ka+1);
00058 lapack_int ldbb_t = MAX(1,kb+1);
00059 lapack_int ldq_t = MAX(1,n);
00060 lapack_int ldz_t = MAX(1,n);
00061 float* ab_t = NULL;
00062 float* bb_t = NULL;
00063 float* q_t = NULL;
00064 float* z_t = NULL;
00065
00066 if( ldab < n ) {
00067 info = -9;
00068 LAPACKE_xerbla( "LAPACKE_ssbgvx_work", info );
00069 return info;
00070 }
00071 if( ldbb < n ) {
00072 info = -11;
00073 LAPACKE_xerbla( "LAPACKE_ssbgvx_work", info );
00074 return info;
00075 }
00076 if( ldq < n ) {
00077 info = -13;
00078 LAPACKE_xerbla( "LAPACKE_ssbgvx_work", info );
00079 return info;
00080 }
00081 if( ldz < n ) {
00082 info = -22;
00083 LAPACKE_xerbla( "LAPACKE_ssbgvx_work", info );
00084 return info;
00085 }
00086
00087 ab_t = (float*)LAPACKE_malloc( sizeof(float) * ldab_t * MAX(1,n) );
00088 if( ab_t == NULL ) {
00089 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00090 goto exit_level_0;
00091 }
00092 bb_t = (float*)LAPACKE_malloc( sizeof(float) * ldbb_t * MAX(1,n) );
00093 if( bb_t == NULL ) {
00094 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00095 goto exit_level_1;
00096 }
00097 if( LAPACKE_lsame( jobz, 'v' ) ) {
00098 q_t = (float*)LAPACKE_malloc( sizeof(float) * ldq_t * MAX(1,n) );
00099 if( q_t == NULL ) {
00100 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00101 goto exit_level_2;
00102 }
00103 }
00104 if( LAPACKE_lsame( jobz, 'v' ) ) {
00105 z_t = (float*)LAPACKE_malloc( sizeof(float) * ldz_t * MAX(1,n) );
00106 if( z_t == NULL ) {
00107 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00108 goto exit_level_3;
00109 }
00110 }
00111
00112 LAPACKE_ssb_trans( matrix_order, uplo, n, ka, ab, ldab, ab_t, ldab_t );
00113 LAPACKE_ssb_trans( matrix_order, uplo, n, kb, bb, ldbb, bb_t, ldbb_t );
00114
00115 LAPACK_ssbgvx( &jobz, &range, &uplo, &n, &ka, &kb, ab_t, &ldab_t, bb_t,
00116 &ldbb_t, q_t, &ldq_t, &vl, &vu, &il, &iu, &abstol, m, w,
00117 z_t, &ldz_t, work, iwork, ifail, &info );
00118 if( info < 0 ) {
00119 info = info - 1;
00120 }
00121
00122 LAPACKE_ssb_trans( LAPACK_COL_MAJOR, uplo, n, ka, ab_t, ldab_t, ab,
00123 ldab );
00124 LAPACKE_ssb_trans( LAPACK_COL_MAJOR, uplo, n, kb, bb_t, ldbb_t, bb,
00125 ldbb );
00126 if( LAPACKE_lsame( jobz, 'v' ) ) {
00127 LAPACKE_sge_trans( LAPACK_COL_MAJOR, n, n, q_t, ldq_t, q, ldq );
00128 }
00129 if( LAPACKE_lsame( jobz, 'v' ) ) {
00130 LAPACKE_sge_trans( LAPACK_COL_MAJOR, n, n, z_t, ldz_t, z, ldz );
00131 }
00132
00133 if( LAPACKE_lsame( jobz, 'v' ) ) {
00134 LAPACKE_free( z_t );
00135 }
00136 exit_level_3:
00137 if( LAPACKE_lsame( jobz, 'v' ) ) {
00138 LAPACKE_free( q_t );
00139 }
00140 exit_level_2:
00141 LAPACKE_free( bb_t );
00142 exit_level_1:
00143 LAPACKE_free( ab_t );
00144 exit_level_0:
00145 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00146 LAPACKE_xerbla( "LAPACKE_ssbgvx_work", info );
00147 }
00148 } else {
00149 info = -1;
00150 LAPACKE_xerbla( "LAPACKE_ssbgvx_work", info );
00151 }
00152 return info;
00153 }