Returns the index to a queried block, given a real (stored) row and column
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_type), | intent(in) | :: | matrix |
bcsr matrix |
||
integer, | intent(in) | :: | row |
input is logical row, output is lookup row input is logical column, output is lookup column |
||
integer, | intent(in) | :: | column |
input is logical row, output is lookup row input is logical column, output is lookup column |
||
logical, | intent(out) | :: | found |
whether the block was found |
||
integer, | intent(out) | :: | block_number |
returns the block number of the row and column |
||
integer, | intent(inout), | optional, | DIMENSION(2) | :: | lb_row_col | |
integer, | intent(out), | optional | :: | data_offset |
data offset for the block; 0 if nonexistent |
|
logical, | intent(out), | optional | :: | transposed |
whether the block is stored transposed according to its position |
PURE SUBROUTINE dbcsr_get_stored_block_info(matrix, row, column, &
found, block_number, lb_row_col, data_offset, transposed)
!! Returns the index to a queried block, given a real (stored) row and
!! column
TYPE(dbcsr_type), INTENT(IN) :: matrix
!! bcsr matrix
INTEGER, INTENT(IN) :: row, column
!! input is logical row, output is lookup row
!! input is logical column, output is lookup column
LOGICAL, INTENT(OUT) :: found
!! whether the block was found
INTEGER, INTENT(OUT) :: block_number
!! returns the block number of the row and column
INTEGER, DIMENSION(2), INTENT(INOUT), OPTIONAL :: lb_row_col
INTEGER, INTENT(OUT), OPTIONAL :: data_offset
!! data offset for the block; 0 if nonexistent
LOGICAL, INTENT(OUT), OPTIONAL :: transposed
!! whether the block is stored transposed according to its position
INTEGER :: blk_last, blk_offset, offset
! ---------------------------------------------------------------------------
IF (ASSOCIATED(matrix%row_p)) THEN
blk_last = matrix%row_p(row + 1)
blk_offset = 0
IF (blk_last .GT. 0) THEN
IF (PRESENT(lb_row_col)) THEN
IF (lb_row_col(1) .EQ. row) THEN
blk_offset = lb_row_col(2)
END IF
END IF
CALL dbcsr_find_column(column, matrix%row_p(row) + blk_offset + 1, blk_last, &
matrix%col_i, matrix%blk_p, &
block_number, found)
blk_offset = block_number - matrix%row_p(row)
ELSE
found = .FALSE.
END IF
IF (PRESENT(lb_row_col)) THEN
lb_row_col(1) = row
lb_row_col(2) = blk_offset
END IF
ELSE
found = .FALSE.
END IF
IF (found) THEN
IF (PRESENT(data_offset) .OR. PRESENT(transposed)) THEN
offset = matrix%blk_p(block_number)
END IF
IF (PRESENT(data_offset)) THEN
data_offset = ABS(offset)
END IF
IF (PRESENT(transposed)) THEN
transposed = offset .LT. 0
END IF
ELSE
IF (PRESENT(data_offset)) THEN
data_offset = 0
END IF
IF (PRESENT(transposed)) THEN
transposed = .FALSE.
END IF
END IF
END SUBROUTINE dbcsr_get_stored_block_info