Compressed Column Storage (CCS) is also called the Harwell-Boeing sparse matrix format.
Elemental entries (example provided by MUMP): A1 = 1|-1 2 3| A2 = 3|2 -1 3| 2| 2 1 1| 4|1 2 -1| 3| 1 1 1| 5|3 2 1| => a_elt = (-1, 2, 1, 2, 1, 1, 3, 1, 1, 2, 1, 3, -1, 2, 2, 3, -1, 1)
A = 1|-1 2 3 0 0| 2| 2 1 1 0 0| 3| 1 1 3 -1 3| 4| 0 0 1 2 -1| 5| 0 0 3 2 1| => eltvar = (1, 2, 3, 3, 4, 5), it locates the elemental matrix line in the assembled matrix => eltptr = (1, 4, 7), it gives the elemental matrix first entry position in eltvar (last position being size(eltvar)+1)
Assembled matrix : A being the same, a_elt = (-1, 2, 1, 2, 1, 1, 3, 1, 3, 1, 3, -1, 2, 2, 3, -1, 1) irow = ( 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5) jptr = (1, 4, 7, 12, 15, 18)
======================================================================================================================= Triplet form
For each non zero a_elt entry, returns its row and column number A being the same, a_elt = (-1, 2, 1, 2, 1, 1, 3, 1, 3, 1, 3, -1, 2, 2, 3, -1, 1) irow = ( 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5) jcol = ( 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5)
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(MAT_SOLV), | intent(inout), | target | :: | mat |
high level system type |
subroutine convert_matrice_format(mat) !! Subroutine to transform the Rutherford Boeing format into Harwell Boeing and triplet implicit none type(MAT_SOLV), intent(inout), target :: mat !! *high level system type* integer(kind=I4) :: i !< ======================================================================================================================= !< Compressed Column Storage (CCS) is also called the Harwell-Boeing sparse matrix format. !< ************************************************ !< Elemental entries (example provided by MUMP): !< A1 = 1|-1 2 3| A2 = 3|2 -1 3| !< 2| 2 1 1| 4|1 2 -1| !< 3| 1 1 1| 5|3 2 1| => a_elt = (-1, 2, 1, 2, 1, 1, 3, 1, 1, 2, 1, 3, -1, 2, 2, 3, -1, 1) !< !< A = 1|-1 2 3 0 0| !< 2| 2 1 1 0 0| !< 3| 1 1 3 -1 3| !< 4| 0 0 1 2 -1| !< 5| 0 0 3 2 1| => eltvar = (1, 2, 3, 3, 4, 5), it locates the elemental matrix line in the assembled matrix !< => eltptr = (1, 4, 7), it gives the elemental matrix first entry position in eltvar (last !< position being size(eltvar)+1) !< !< ************************************************ !< Assembled matrix : !< A being the same, a_elt = (-1, 2, 1, 2, 1, 1, 3, 1, 3, 1, 3, -1, 2, 2, 3, -1, 1) !< irow = ( 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5) !< jptr = (1, 4, 7, 12, 15, 18) !< !< ======================================================================================================================= !< Triplet form !< ************************************************ !< For each non zero a_elt entry, returns its row and column number !< A being the same, a_elt = (-1, 2, 1, 2, 1, 1, 3, 1, 3, 1, 3, -1, 2, 2, 3, -1, 1) !< irow = ( 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5) !< jcol = ( 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5) call from_elemental_to_assembled(mat = mat) select case(mat%slv_t) case(MA48) ! Triplet form: irow, jcol, a_elt #if WITH_MA48 continue #else stop 'MA48_LIB not defined' #endif case(MUMP) ! Compressed row, elemental entries chosen: eltptr, eltvar, a_elt continue case(UMFP, SULU) ! Compressed row, assembled form: irow, jptr, a_elt deallocate( mat%jcol ) ! no more needed ! UMFP and SULU allocations begin at 0 (C convention) do i = 1, mat%nn +1 mat%jptr(i) = mat%jptr(i) -1 enddo if (mat%slv_t==SULU) mat%matsulu%jptr => mat%jptr ! otherwise, matsulu%jptr will be associated to ! a deallocated part of memory do i = 1, mat%nz mat%irow(i) = mat%irow(i) -1 enddo case default stop 'Unknown solver type, CONVERT_MATRICE_FORMAT' endselect return endsubroutine convert_matrice_format