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_cgbsvxx_work( int matrix_order, char fact, char trans,
00038 lapack_int n, lapack_int kl, lapack_int ku,
00039 lapack_int nrhs, lapack_complex_float* ab,
00040 lapack_int ldab, lapack_complex_float* afb,
00041 lapack_int ldafb, lapack_int* ipiv,
00042 char* equed, float* r, float* c,
00043 lapack_complex_float* b, lapack_int ldb,
00044 lapack_complex_float* x, lapack_int ldx,
00045 float* rcond, float* rpvgrw, float* berr,
00046 lapack_int n_err_bnds, float* err_bnds_norm,
00047 float* err_bnds_comp, lapack_int nparams,
00048 float* params, lapack_complex_float* work,
00049 float* rwork )
00050 {
00051 lapack_int info = 0;
00052 if( matrix_order == LAPACK_COL_MAJOR ) {
00053
00054 LAPACK_cgbsvxx( &fact, &trans, &n, &kl, &ku, &nrhs, ab, &ldab, afb,
00055 &ldafb, ipiv, equed, r, c, b, &ldb, x, &ldx, rcond,
00056 rpvgrw, berr, &n_err_bnds, err_bnds_norm, err_bnds_comp,
00057 &nparams, params, work, rwork, &info );
00058 if( info < 0 ) {
00059 info = info - 1;
00060 }
00061 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00062 lapack_int ldab_t = MAX(1,kl+ku+1);
00063 lapack_int ldafb_t = MAX(1,2*kl+ku+1);
00064 lapack_int ldb_t = MAX(1,n);
00065 lapack_int ldx_t = MAX(1,n);
00066 lapack_complex_float* ab_t = NULL;
00067 lapack_complex_float* afb_t = NULL;
00068 lapack_complex_float* b_t = NULL;
00069 lapack_complex_float* x_t = NULL;
00070 float* err_bnds_norm_t = NULL;
00071 float* err_bnds_comp_t = NULL;
00072
00073 if( ldab < n ) {
00074 info = -9;
00075 LAPACKE_xerbla( "LAPACKE_cgbsvxx_work", info );
00076 return info;
00077 }
00078 if( ldafb < n ) {
00079 info = -11;
00080 LAPACKE_xerbla( "LAPACKE_cgbsvxx_work", info );
00081 return info;
00082 }
00083 if( ldb < nrhs ) {
00084 info = -17;
00085 LAPACKE_xerbla( "LAPACKE_cgbsvxx_work", info );
00086 return info;
00087 }
00088 if( ldx < nrhs ) {
00089 info = -19;
00090 LAPACKE_xerbla( "LAPACKE_cgbsvxx_work", info );
00091 return info;
00092 }
00093
00094 ab_t = (lapack_complex_float*)
00095 LAPACKE_malloc( sizeof(lapack_complex_float) * ldab_t * MAX(1,n) );
00096 if( ab_t == NULL ) {
00097 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00098 goto exit_level_0;
00099 }
00100 afb_t = (lapack_complex_float*)
00101 LAPACKE_malloc( sizeof(lapack_complex_float) * ldafb_t * MAX(1,n) );
00102 if( afb_t == NULL ) {
00103 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00104 goto exit_level_1;
00105 }
00106 b_t = (lapack_complex_float*)
00107 LAPACKE_malloc( sizeof(lapack_complex_float) *
00108 ldb_t * MAX(1,nrhs) );
00109 if( b_t == NULL ) {
00110 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00111 goto exit_level_2;
00112 }
00113 x_t = (lapack_complex_float*)
00114 LAPACKE_malloc( sizeof(lapack_complex_float) *
00115 ldx_t * MAX(1,nrhs) );
00116 if( x_t == NULL ) {
00117 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00118 goto exit_level_3;
00119 }
00120 err_bnds_norm_t = (float*)
00121 LAPACKE_malloc( sizeof(float) * nrhs * MAX(1,n_err_bnds) );
00122 if( err_bnds_norm_t == NULL ) {
00123 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00124 goto exit_level_4;
00125 }
00126 err_bnds_comp_t = (float*)
00127 LAPACKE_malloc( sizeof(float) * nrhs * MAX(1,n_err_bnds) );
00128 if( err_bnds_comp_t == NULL ) {
00129 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00130 goto exit_level_5;
00131 }
00132
00133 LAPACKE_cgb_trans( matrix_order, n, n, kl, ku, ab, ldab, ab_t, ldab_t );
00134 if( LAPACKE_lsame( fact, 'f' ) ) {
00135 LAPACKE_cgb_trans( matrix_order, n, n, kl, kl+ku, afb, ldafb, afb_t,
00136 ldafb_t );
00137 }
00138 LAPACKE_cge_trans( matrix_order, n, nrhs, b, ldb, b_t, ldb_t );
00139
00140 LAPACK_cgbsvxx( &fact, &trans, &n, &kl, &ku, &nrhs, ab_t, &ldab_t,
00141 afb_t, &ldafb_t, ipiv, equed, r, c, b_t, &ldb_t, x_t,
00142 &ldx_t, rcond, rpvgrw, berr, &n_err_bnds,
00143 err_bnds_norm_t, err_bnds_comp_t, &nparams, params,
00144 work, rwork, &info );
00145 if( info < 0 ) {
00146 info = info - 1;
00147 }
00148
00149 if( LAPACKE_lsame( fact, 'e' ) && ( LAPACKE_lsame( *equed, 'b' ) ||
00150 LAPACKE_lsame( *equed, 'c' ) || LAPACKE_lsame( *equed, 'r' ) ) ) {
00151 LAPACKE_cgb_trans( LAPACK_COL_MAJOR, n, n, kl, ku, ab_t, ldab_t, ab,
00152 ldab );
00153 }
00154 if( LAPACKE_lsame( fact, 'e' ) || LAPACKE_lsame( fact, 'n' ) ) {
00155 LAPACKE_cgb_trans( LAPACK_COL_MAJOR, n, n, kl, kl+ku, afb_t,
00156 ldafb_t, afb, ldafb );
00157 }
00158 if( LAPACKE_lsame( fact, 'f' ) && ( LAPACKE_lsame( *equed, 'b' ) ||
00159 LAPACKE_lsame( *equed, 'c' ) || LAPACKE_lsame( *equed, 'r' ) ) ) {
00160 LAPACKE_cge_trans( LAPACK_COL_MAJOR, n, nrhs, b_t, ldb_t, b, ldb );
00161 }
00162 LAPACKE_cge_trans( LAPACK_COL_MAJOR, n, nrhs, x_t, ldx_t, x, ldx );
00163 LAPACKE_sge_trans( LAPACK_COL_MAJOR, nrhs, n_err_bnds, err_bnds_norm_t,
00164 nrhs, err_bnds_norm, nrhs );
00165 LAPACKE_sge_trans( LAPACK_COL_MAJOR, nrhs, n_err_bnds, err_bnds_comp_t,
00166 nrhs, err_bnds_comp, nrhs );
00167
00168 LAPACKE_free( err_bnds_comp_t );
00169 exit_level_5:
00170 LAPACKE_free( err_bnds_norm_t );
00171 exit_level_4:
00172 LAPACKE_free( x_t );
00173 exit_level_3:
00174 LAPACKE_free( b_t );
00175 exit_level_2:
00176 LAPACKE_free( afb_t );
00177 exit_level_1:
00178 LAPACKE_free( ab_t );
00179 exit_level_0:
00180 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00181 LAPACKE_xerbla( "LAPACKE_cgbsvxx_work", info );
00182 }
00183 } else {
00184 info = -1;
00185 LAPACKE_xerbla( "LAPACKE_cgbsvxx_work", info );
00186 }
00187 return info;
00188 }