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