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_dhsein_work( int matrix_order, char job, char eigsrc,
00038 char initv, lapack_logical* select,
00039 lapack_int n, const double* h, lapack_int ldh,
00040 double* wr, const double* wi, double* vl,
00041 lapack_int ldvl, double* vr, lapack_int ldvr,
00042 lapack_int mm, lapack_int* m, double* work,
00043 lapack_int* ifaill, lapack_int* ifailr )
00044 {
00045 lapack_int info = 0;
00046 if( matrix_order == LAPACK_COL_MAJOR ) {
00047
00048 LAPACK_dhsein( &job, &eigsrc, &initv, select, &n, h, &ldh, wr, wi, vl,
00049 &ldvl, vr, &ldvr, &mm, m, work, ifaill, ifailr, &info );
00050 if( info < 0 ) {
00051 info = info - 1;
00052 }
00053 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00054 lapack_int ldh_t = MAX(1,n);
00055 lapack_int ldvl_t = MAX(1,n);
00056 lapack_int ldvr_t = MAX(1,n);
00057 double* h_t = NULL;
00058 double* vl_t = NULL;
00059 double* vr_t = NULL;
00060
00061 if( ldh < n ) {
00062 info = -8;
00063 LAPACKE_xerbla( "LAPACKE_dhsein_work", info );
00064 return info;
00065 }
00066 if( ldvl < mm ) {
00067 info = -12;
00068 LAPACKE_xerbla( "LAPACKE_dhsein_work", info );
00069 return info;
00070 }
00071 if( ldvr < mm ) {
00072 info = -14;
00073 LAPACKE_xerbla( "LAPACKE_dhsein_work", info );
00074 return info;
00075 }
00076
00077 h_t = (double*)LAPACKE_malloc( sizeof(double) * ldh_t * MAX(1,n) );
00078 if( h_t == NULL ) {
00079 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00080 goto exit_level_0;
00081 }
00082 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'l' ) ) {
00083 vl_t = (double*)
00084 LAPACKE_malloc( sizeof(double) * ldvl_t * MAX(1,mm) );
00085 if( vl_t == NULL ) {
00086 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00087 goto exit_level_1;
00088 }
00089 }
00090 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'r' ) ) {
00091 vr_t = (double*)
00092 LAPACKE_malloc( sizeof(double) * ldvr_t * MAX(1,mm) );
00093 if( vr_t == NULL ) {
00094 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00095 goto exit_level_2;
00096 }
00097 }
00098
00099 LAPACKE_dge_trans( matrix_order, n, n, h, ldh, h_t, ldh_t );
00100 if( ( LAPACKE_lsame( job, 'l' ) || LAPACKE_lsame( job, 'b' ) ) &&
00101 LAPACKE_lsame( initv, 'v' ) ) {
00102 LAPACKE_dge_trans( matrix_order, n, mm, vl, ldvl, vl_t, ldvl_t );
00103 }
00104 if( ( LAPACKE_lsame( job, 'r' ) || LAPACKE_lsame( job, 'b' ) ) &&
00105 LAPACKE_lsame( initv, 'v' ) ) {
00106 LAPACKE_dge_trans( matrix_order, n, mm, vr, ldvr, vr_t, ldvr_t );
00107 }
00108
00109 LAPACK_dhsein( &job, &eigsrc, &initv, select, &n, h_t, &ldh_t, wr, wi,
00110 vl_t, &ldvl_t, vr_t, &ldvr_t, &mm, m, work, ifaill,
00111 ifailr, &info );
00112 if( info < 0 ) {
00113 info = info - 1;
00114 }
00115
00116 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'l' ) ) {
00117 LAPACKE_dge_trans( LAPACK_COL_MAJOR, n, mm, vl_t, ldvl_t, vl,
00118 ldvl );
00119 }
00120 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'r' ) ) {
00121 LAPACKE_dge_trans( LAPACK_COL_MAJOR, n, mm, vr_t, ldvr_t, vr,
00122 ldvr );
00123 }
00124
00125 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'r' ) ) {
00126 LAPACKE_free( vr_t );
00127 }
00128 exit_level_2:
00129 if( LAPACKE_lsame( job, 'b' ) || LAPACKE_lsame( job, 'l' ) ) {
00130 LAPACKE_free( vl_t );
00131 }
00132 exit_level_1:
00133 LAPACKE_free( h_t );
00134 exit_level_0:
00135 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00136 LAPACKE_xerbla( "LAPACKE_dhsein_work", info );
00137 }
00138 } else {
00139 info = -1;
00140 LAPACKE_xerbla( "LAPACKE_dhsein_work", info );
00141 }
00142 return info;
00143 }