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