# dcsrilu0

ILU0 preconditioner based on incomplete LU factorization of a sparse matrix.

## Syntax

Fortran:

call dcsrilu0(n, a, ia, ja, bilu0, ipar, dpar, ierr)

C:

dcsrilu0(&n, a, ia, ja, bilu0, ipar, dpar, &ierr);

## Description

The routine dcsrilu0 computes a preconditioner B [Saad03] of a given sparse matrix A stored in the format accepted in the direct sparse solvers:

`A~B=L*U` , where L is a low triangular matrix with a unit diagonal, U is an upper triangular matrix with a non-unit diagonal, and the portrait of the original matrix A is used to store the incomplete factors L and U.

## Input Parameters

n

  INTEGER. Size (number of rows or columns) of the original square n-by-n matrix A.

a

  DOUBLE PRECISION. Array containing the set of elements of the matrix A. Its length is equal to the number of non-zero elements in the matrix A. Refer to the values array description in the Sparse Matrix Storage Format section for more details.

ia

  INTEGER. Array of size `(n+1)` containing begin indices of rows of the matrix A such that `ia(I)` is the index in the array A of the first non-zero element from the row `I`. The value of the last element `ia(n+1)` is equal to the number of non-zeros in the matrix A plus one. Refer to the rowIndex array description in the Sparse Matrix Storage Format section for more details.

ja

  INTEGER. Array containing the column indices for each non-zero element of the matrix A. Its size is equal to the size of the array a. Refer to the columns array description in the Sparse Matrix Storage Format section for more details.

  ### Note

  Column indices should be put in increasing order for each row of matrix.

ipar

  INTEGER array of size 128. This parameter specifies the integer set of data for both the ILU0 and RCI FGMRES computations. Refer to the ipar array description in the FGMRES Common Parameters for more details on FGMRES parameter entries. The entries that are specific to ILU0 are listed below.

  ipar(31)

    - specifies how the routine operates when a zero diagonal element occurs during calculation. If this parameter is set to 0 (default value set by the routine dfgmres_init), then the calculations are stopped and the routine returns a non-zero error value. Otherwise, the diagonal element is set to the specified value and the calculations continues.

    ### Note

    Advanced users can define this array in the code as : `INTEGER ipar(31)`. However, to guarantee the compatibility with the future releases of Intel MKL , declare the array ipar of length 128.

dpar

  DOUBLE PRECISION array of size 128. This parameter specifies the double precision set of data for both the ILU0 and RCI FGMRES computations. Refer to the dpar array description in the FGMRES Common Parameters for more details on FGMRES parameter entries. The entries specific to ILU0 are listed below.

  dpar(31)

    - specifies the small value that is compared with the diagonal elements during the calculation; if the value of the diagonal element is smaller, then it is set to dpar(32), or the calculation is stopped in accordance with ipar(31). The default value is 1.0D-16.

    ### Note

    This parameter can be set to the negative value, because the calculation uses its absolute value.

    If this parameter is set to 0, the comparison with the diagonal element is not performed.

  dpar(32)

    - specifies the value that is assigned to the diagonal element if its value is less than dpar(31) (see above). The default value is 1.0D-10.

    ### Note

    Advanced users can define this array in the code as `DOUBLE PRECISION dpar(32)`. However, to guarantee the compatibility with the future releases of Intel MKL, declare the array dpar of length 128.

## Output Parameters

bilu0

  DOUBLE PRECISION. Array B containing non-zero elements of the resulting preconditioning matrix, stored in the format accepted in direct sparse solvers. Its size is equal to the number of non-zero elements in the matrix A. Refer to the values array description in the Sparse Matrix Storage Format section for more details.

ierr

  INTEGER. Error flag, informs about the routine completion.

### Note

To present the resulting preconditioning matrix in the CSR format the arrays ia (row indices) and ja (column indices) of the input matrix must be used.

## Return Values

`ierr=0`

  The routine completes task normally.

`ierr=-101`

  The routine is interrupted, the error occurs: at least one diagonal element is omitted from the matrix in CSR format (see Sparse Matrix Storage Format).

`ierr=-102`

  The routine is interrupted because the matrix contains zero diagonal element, the routine cannot perform operations.

`ierr=-103`

  The routine is interrupted as the matrix contains too small diagonal element, and an overflow may occur because of the division by its value required to complete the task, or a bad approximation to ILU0 with use of this element will be computed.

`ierr=-104`

  The routine is interrupted because the memory is insufficient for the internal work array.

`ierr=-105`

  The routine is interrupted because the input matrix size n is less than or equal to 0.

`ierr=-106`

  The routine is interrupted because the column indices ja are not placed in the increasing order.

## Interfaces

## FORTRAN 77 and Fortran 95:

SUBROUTINE dcsrilu0 (n, a, ia, ja, bilu0, ipar, dpar, ierr)

INTEGER n, ierr, ipar(128)

INTEGER ia(*), ja(*)

DOUBLE PRECISION a(*), bilu0(*), dpar(128)

## C:

`void dcsrilu0 (int *n, double *a, int *ia, int *ja, double *bilu0, int *ipar, double *dpar, int *ierr);`

Parent topic: Preconditioners based on Incomplete LU Factorization Technique