# Compressed Sparse Column (CSC) Format

This standard data format consists of the following data:

```
integer :: m ! number of rows (unsymmetric only)
integer :: n ! number of columns
integer, size(n+1) :: ptr ! column pointers (may have type long)
integer, size(ptr(n+1)-1) :: row ! row indices
real, size(ptr(n+1)-1) :: val ! numerical values
```

Non-zero matrix entries are ordered by increasing column index and stored in the arrays row(:) and val(:) such that row(k) holds the row number and val(k) holds the value of the k-th entry. The ptr(:) array stores column pointers such that ptr(i) is the position in row(:) and val(:) of the first entry in the i-th column, and ptr(n+1) is one more than the total number of entries. ptr(:) may be either 32-bit (Fortran default integer) or 64-bit (Fortran integer(long)). There must be no duplicate or out of range entries. Entries that are zero, including those on the diagonal, need not be specified.

For **symmetric matrices**, only the lower triangular entries of \(A\)
should be supplied. For **unsymmetric matrices**, all entries in the matrix
should be supplied.

Note that most SPRAL routines offer **no checking** of user data, and the
behaviour of these routines with misformatted data is undefined. You may use
routines from the `spral_matrix_util`

package to convert data to and
check data stored in this format.

To illustrate the CSC format, the matrix

is described by the following data:

```
n = 5
ptr(1:6) = (/ 1, 4, 5, 7, 9, 10 /)
row(1:9) = (/ 1, 2, 4, 3, 3, 5, 4, 5, 5 /)
val(1:9) = (/ 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9 /)
```