Fills row hashtable from an existing matrix.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(hash_table_type), | intent(inout), | DIMENSION(:) | :: | hashes | ||
type(dbcsr_type), | intent(in) | :: | matrix | |||
integer | :: | block_estimate |
guess for the number of blocks in the product matrix, can be zero |
|||
integer, | intent(in), | DIMENSION(:) | :: | row_map | ||
integer, | intent(in), | DIMENSION(:) | :: | col_map |
SUBROUTINE fill_hash_tables(hashes, matrix, block_estimate, row_map, col_map)
!! Fills row hashtable from an existing matrix.
TYPE(hash_table_type), DIMENSION(:), INTENT(inout) :: hashes
TYPE(dbcsr_type), INTENT(IN) :: matrix
INTEGER :: block_estimate
!! guess for the number of blocks in the product matrix, can be zero
INTEGER, DIMENSION(:), INTENT(IN) :: row_map, col_map
CHARACTER(len=*), PARAMETER :: routineN = 'fill_hash_tables'
INTEGER :: col, handle, i, imat, n_rows, row
! ---------------------------------------------------------------------------
CALL timeset(routineN, handle)
imat = 1
!$ imat = OMP_GET_THREAD_NUM() + 1
n_rows = matrix%nblkrows_local
IF (SIZE(hashes) /= n_rows) &
DBCSR_ABORT("Local row count mismatch")
DO row = 1, n_rows
! create the hash table row with a reasonable initial size
CALL hash_table_create(hashes(row), &
MAX(8, (3*block_estimate)/MAX(1, n_rows)))
END DO
! We avoid using the iterator because we will use the existing
! work matrix instead of the BCSR index.
DO i = 1, matrix%wms(imat)%lastblk
row = matrix%wms(imat)%row_i(i)
col = matrix%wms(imat)%col_i(i)
row = row_map(row)
col = col_map(col)
CALL hash_table_add(hashes(row), col, i)
END DO
CALL timestop(handle)
END SUBROUTINE fill_hash_tables