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_dgesvxx_work( int matrix_order, char fact, char trans,
00038 lapack_int n, lapack_int nrhs, double* a,
00039 lapack_int lda, double* af, lapack_int ldaf,
00040 lapack_int* ipiv, char* equed, double* r,
00041 double* c, double* b, lapack_int ldb,
00042 double* x, lapack_int ldx, double* rcond,
00043 double* rpvgrw, 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_dgesvxx( &fact, &trans, &n, &nrhs, a, &lda, af, &ldaf, ipiv,
00053 equed, r, c, b, &ldb, x, &ldx, rcond, rpvgrw, 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 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_dgesvxx_work", info );
00074 return info;
00075 }
00076 if( ldaf < n ) {
00077 info = -9;
00078 LAPACKE_xerbla( "LAPACKE_dgesvxx_work", info );
00079 return info;
00080 }
00081 if( ldb < nrhs ) {
00082 info = -15;
00083 LAPACKE_xerbla( "LAPACKE_dgesvxx_work", info );
00084 return info;
00085 }
00086 if( ldx < nrhs ) {
00087 info = -17;
00088 LAPACKE_xerbla( "LAPACKE_dgesvxx_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 if( LAPACKE_lsame( fact, 'f' ) ) {
00127 LAPACKE_dge_trans( matrix_order, n, n, af, ldaf, af_t, ldaf_t );
00128 }
00129 LAPACKE_dge_trans( matrix_order, n, nrhs, b, ldb, b_t, ldb_t );
00130
00131 LAPACK_dgesvxx( &fact, &trans, &n, &nrhs, a_t, &lda_t, af_t, &ldaf_t,
00132 ipiv, equed, r, c, b_t, &ldb_t, x_t, &ldx_t, rcond,
00133 rpvgrw, 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 if( LAPACKE_lsame( fact, 'e' ) && ( LAPACKE_lsame( *equed, 'b' ) ||
00140 LAPACKE_lsame( *equed, 'c' ) || LAPACKE_lsame( *equed, 'r' ) ) ) {
00141 LAPACKE_dge_trans( LAPACK_COL_MAJOR, n, n, a_t, lda_t, a, lda );
00142 }
00143 if( LAPACKE_lsame( fact, 'e' ) || LAPACKE_lsame( fact, 'n' ) ) {
00144 LAPACKE_dge_trans( LAPACK_COL_MAJOR, n, n, af_t, ldaf_t, af, ldaf );
00145 }
00146 if( LAPACKE_lsame( fact, 'f' ) && ( LAPACKE_lsame( *equed, 'b' ) ||
00147 LAPACKE_lsame( *equed, 'c' ) || LAPACKE_lsame( *equed, 'r' ) ) ) {
00148 LAPACKE_dge_trans( LAPACK_COL_MAJOR, n, nrhs, b_t, ldb_t, b, ldb );
00149 }
00150 LAPACKE_dge_trans( LAPACK_COL_MAJOR, n, nrhs, x_t, ldx_t, x, ldx );
00151 LAPACKE_dge_trans( LAPACK_COL_MAJOR, nrhs, n_err_bnds, err_bnds_norm_t,
00152 nrhs, err_bnds_norm, nrhs );
00153 LAPACKE_dge_trans( LAPACK_COL_MAJOR, nrhs, n_err_bnds, err_bnds_comp_t,
00154 nrhs, err_bnds_comp, nrhs );
00155
00156 LAPACKE_free( err_bnds_comp_t );
00157 exit_level_5:
00158 LAPACKE_free( err_bnds_norm_t );
00159 exit_level_4:
00160 LAPACKE_free( x_t );
00161 exit_level_3:
00162 LAPACKE_free( b_t );
00163 exit_level_2:
00164 LAPACKE_free( af_t );
00165 exit_level_1:
00166 LAPACKE_free( a_t );
00167 exit_level_0:
00168 if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
00169 LAPACKE_xerbla( "LAPACKE_dgesvxx_work", info );
00170 }
00171 } else {
00172 info = -1;
00173 LAPACKE_xerbla( "LAPACKE_dgesvxx_work", info );
00174 }
00175 return info;
00176 }