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