dbcsr_get_stored_block_info Subroutine

public 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

Arguments

Type IntentOptional 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


Source Code

   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