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_cgerfsx_work( int matrix_order, char trans, char equed,
00038 lapack_int n, lapack_int nrhs,
00039 const lapack_complex_float* a, lapack_int lda,
00040 const lapack_complex_float* af,
00041 lapack_int ldaf, const lapack_int* ipiv,
00042 const float* r, const float* c,
00043 const lapack_complex_float* b, lapack_int ldb,
00044 lapack_complex_float* x, lapack_int ldx,
00045 float* rcond, 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_cgerfsx( &trans, &equed, &n, &nrhs, a, &lda, af, &ldaf, ipiv, r,
00055 c, b, &ldb, x, &ldx, rcond, berr, &n_err_bnds,
00056 err_bnds_norm, err_bnds_comp, &nparams, params, work,
00057 rwork, &info );
00058 if( info < 0 ) {
00059 info = info - 1;
00060 }
00061 } else if( matrix_order == LAPACK_ROW_MAJOR ) {
00062 lapack_int lda_t = MAX(1,n);
00063 lapack_int ldaf_t = MAX(1,n);
00064 lapack_int ldb_t = MAX(1,n);
00065 lapack_int ldx_t = MAX(1,n);
00066 lapack_complex_float* a_t = NULL;
00067 lapack_complex_float* af_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( lda < n ) {
00074 info = -7;
00075 LAPACKE_xerbla( "LAPACKE_cgerfsx_work", info );
00076 return info;
00077 }
00078 if( ldaf < n ) {
00079 info = -9;
00080 LAPACKE_xerbla( "LAPACKE_cgerfsx_work", info );
00081 return info;
00082 }
00083 if( ldb < nrhs ) {
00084 info = -14;
00085 LAPACKE_xerbla( "LAPACKE_cgerfsx_work", info );
00086 return info;
00087 }
00088 if( ldx < nrhs ) {
00089 info = -16;
00090 LAPACKE_xerbla( "LAPACKE_cgerfsx_work", info );
00091 return info;
00092 }
00093
00094 a_t = (lapack_complex_float*)
00095 LAPACKE_malloc( sizeof(lapack_complex_float) * lda_t * MAX(1,n) );
00096 if( a_t == NULL ) {
00097 info = LAPACK_TRANSPOSE_MEMORY_ERROR;
00098 goto exit_level_0;
00099 }
00100 af_t = (lapack_complex_float*)
00101 LAPACKE_malloc( sizeof(lapack_complex_float) * ldaf_t * MAX(1,n) );
00102 if( af_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_cge_trans( matrix_order, n, n, a, lda, a_t, lda_t );
00134 LAPACKE_cge_trans( matrix_order, n, n, af, ldaf, af_t, ldaf_t );
00135 LAPACKE_cge_trans( matrix_order, n, nrhs, b, ldb, b_t, ldb_t );
00136 LAPACKE_cge_trans( matrix_order, n, nrhs, x, ldx, x_t, ldx_t );
00137
00138 LAPACK_cgerfsx( &trans, &equed, &n, &nrhs, a_t, &lda_t, af_t, &ldaf_t,
00139 ipiv, r, c, b_t, &ldb_t, x_t, &ldx_t, rcond, berr,
00140 &n_err_bnds, err_bnds_norm_t, err_bnds_comp_t, &nparams,
00141 params, work, rwork, &info );
00142 if( info < 0 ) {
00143 info = info - 1;
00144 }
00145
00146 LAPACKE_cge_trans( LAPACK_COL_MAJOR, n, nrhs, x_t, ldx_t, x, ldx );
00147 LAPACKE_sge_trans( LAPACK_COL_MAJOR, nrhs, n_err_bnds, err_bnds_norm_t,
00148 nrhs, err_bnds_norm, nrhs );
00149 LAPACKE_sge_trans( LAPACK_COL_MAJOR, nrhs, n_err_bnds, err_bnds_comp_t,
00150 nrhs, err_bnds_comp, nrhs );
00151
00152 LAPACKE_free( err_bnds_comp_t );
00153 exit_level_5:
00154 LAPACKE_free( err_bnds_norm_t );
00155 exit_level_4:
00156 LAPACKE_free( x_t );
00157 exit_level_3:
00158 LAPACKE_free( b_t );
00159 exit_level_2:
00160 LAPACKE_free( af_t );
00161 exit_level_1:
00162 LAPACKE_free( a_t );
00163 exit_level_0:
00164 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00165 LAPACKE_xerbla( "LAPACKE_cgerfsx_work", info );
00166 }
00167 } else {
00168 info = -1;
00169 LAPACKE_xerbla( "LAPACKE_cgerfsx_work", info );
00170 }
00171 return info;
00172 }