Builds and sorts a CSR index from a list index.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in) | :: | mi | |||
integer, | intent(in) | :: | mf | |||
integer, | intent(in) | :: | ai | |||
integer, | intent(in) | :: | af | |||
integer, | intent(out), | DIMENSION(mi:mf + 1) | :: | row_p | ||
integer, | intent(out), | DIMENSION(2, 1:af - ai + 1) | :: | blk_info | ||
integer, | intent(in), | DIMENSION(3, 1:af) | :: | list_index | ||
integer, | intent(in) | :: | nnorms | |||
real(kind=sp), | intent(out), | DIMENSION(1:af - ai + 1) | :: | csr_norms | ||
real(kind=sp), | intent(in), | DIMENSION(:) | :: | list_norms |
SUBROUTINE build_csr_index(mi, mf, ai, af, row_p, blk_info, list_index, & !! Builds and sorts a CSR index from a list index. nnorms, csr_norms, list_norms) INTEGER, INTENT(IN) :: mi, mf, ai, af INTEGER, DIMENSION(mi:mf + 1), INTENT(OUT) :: row_p INTEGER, DIMENSION(2, 1:af - ai + 1), INTENT(OUT) :: blk_info INTEGER, DIMENSION(3, 1:af), INTENT(IN) :: list_index INTEGER, INTENT(IN) :: nnorms REAL(KIND=sp), DIMENSION(1:af - ai + 1), INTENT(OUT) :: csr_norms REAL(KIND=sp), DIMENSION(:), INTENT(IN) :: list_norms LOGICAL, PARAMETER :: careful = .FALSE., dbg = .FALSE. INTEGER :: i, row INTEGER, DIMENSION(mi:mf) :: counts ! --------------------------------------------------------------------------- ! Counts blocks per row and calculates the offsets. IF (dbg) THEN WRITE (*, '(I7,1X,5(A,2(1X,I7)))') 0, "bci", mi, mf, ";", ai, af !write(*,'(3(I7))')list_index(:,ai:af) END IF counts(:) = 0 DO i = ai, af IF (careful) THEN IF (list_index(1, i) < mi) DBCSR_ABORT("Out of range") IF (list_index(1, i) > mf) DBCSR_ABORT("Out of range") END IF counts(list_index(1, i)) = counts(list_index(1, i)) + 1 END DO row_p(mi) = 0 DO i = mi + 1, mf + 1 row_p(i) = row_p(i - 1) + counts(i - 1) END DO ! Adds every block to its corresponding row. counts(:) = 0 DO i = ai, af row = list_index(1, i) counts(row) = counts(row) + 1 IF (careful) THEN IF (row_p(row) + counts(row) > af - ai + 1) DBCSR_ABORT("Out of range") IF (row_p(row) + counts(row) < 1) DBCSR_ABORT("Out of range") END IF blk_info(1, row_p(row) + counts(row)) = list_index(2, i) blk_info(2, row_p(row) + counts(row)) = list_index(3, i) IF (nnorms .GT. 0) THEN csr_norms(row_p(row) + counts(row)) = list_norms(i) END IF END DO IF (nnorms .EQ. 0) THEN csr_norms(:) = 0.0_sp END IF END SUBROUTINE build_csr_index