Example #1
0
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;
}