LIS_INT lis_precon_create_ilut(LIS_SOLVER solver, LIS_PRECON precon) { LIS_INT err; LIS_MATRIX A,B; LIS_DEBUG_FUNC_IN; switch( solver->A->matrix_type ) { case LIS_MATRIX_CSR: err = lis_precon_create_ilut_csr(solver,precon); lis_psolve_xxx[LIS_PRECON_TYPE_ILUT] = lis_psolve_ilut_csr; lis_psolvet_xxx[LIS_PRECON_TYPE_ILUT] = lis_psolvet_ilut_csr; break; default: A = solver->A; err = lis_matrix_duplicate(A,&B); if( err ) return err; lis_matrix_set_type(B,LIS_MATRIX_CSR); err = lis_matrix_convert(A,B); if( err ) return err; solver->A = B; err = lis_precon_create_ilut_csr(solver,precon); lis_psolve_xxx[LIS_PRECON_TYPE_ILUT] = lis_psolve_ilut_csr; lis_psolvet_xxx[LIS_PRECON_TYPE_ILUT] = lis_psolvet_ilut_csr; lis_matrix_destroy(B); solver->A = A; break; } LIS_DEBUG_FUNC_OUT; return LIS_SUCCESS; }
LIS_INT lis_precon_create_ilut(LIS_SOLVER solver, LIS_PRECON precon) { #ifdef ENABLE_BSR LIS_INT storage,block; #endif LIS_INT err; LIS_MATRIX A,B; LIS_DEBUG_FUNC_IN; #ifdef ENABLE_BSR storage = solver->options[LIS_OPTIONS_STORAGE]; block = solver->options[LIS_OPTIONS_STORAGE_BLOCK]; if( solver->A->matrix_type!=LIS_MATRIX_BSR && storage==LIS_MATRIX_BSR ) { err = lis_matrix_convert_self(solver); if( err ) return err; } #endif switch( solver->A->matrix_type ) { case LIS_MATRIX_CSR: err = lis_precon_create_ilut_csr(solver,precon); lis_psolve_xxx[LIS_PRECON_TYPE_ILUT] = lis_psolve_ilut_csr; lis_psolvet_xxx[LIS_PRECON_TYPE_ILUT] = lis_psolvet_ilut_csr; break; #ifdef ENABLE_BSR case LIS_MATRIX_BSR: err = lis_precon_create_ilut_bsr(solver,precon); lis_psolve_xxx[LIS_PRECON_TYPE_ILUT] = lis_psolve_ilut_bsr; lis_psolvet_xxx[LIS_PRECON_TYPE_ILUT] = lis_psolvet_ilut_bsr; break; #endif default: A = solver->A; err = lis_matrix_duplicate(A,&B); if( err ) return err; lis_matrix_set_type(B,LIS_MATRIX_CSR); err = lis_matrix_convert(A,B); if( err ) return err; solver->A = B; err = lis_precon_create_ilut_csr(solver,precon); lis_psolve_xxx[LIS_PRECON_TYPE_ILUT] = lis_psolve_ilut_csr; lis_psolvet_xxx[LIS_PRECON_TYPE_ILUT] = lis_psolvet_ilut_csr; lis_matrix_destroy(B); solver->A = A; break; } LIS_DEBUG_FUNC_OUT; return LIS_SUCCESS; }