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