dbcsr_make_index_local_row Subroutine

public subroutine dbcsr_make_index_local_row(matrix)

Converts BCSR global row index to local row index.


Type IntentOptional Attributes Name
type(dbcsr_type), intent(inout) :: matrix

matrix for which to make canonical index

Source Code

   SUBROUTINE dbcsr_make_index_local_row(matrix)
      !! Converts BCSR global row index to local row index.

      TYPE(dbcsr_type), INTENT(INOUT)                    :: matrix
         !! matrix for which to make canonical index

      CHARACTER(len=*), PARAMETER :: routineN = 'dbcsr_make_index_local_row'

      INTEGER                                            :: error_handle, lrow, nlocal_rows, &
                                                            ntotal_rows, prow
      INTEGER, ALLOCATABLE, DIMENSION(:)                 :: local_row_p
      INTEGER, DIMENSION(:), POINTER                     :: local_rows

!   ---------------------------------------------------------------------------

      CALL timeset(routineN, error_handle)
      IF (.NOT. ASSOCIATED(matrix%row_p)) &
         DBCSR_ABORT("The row index must be initialized.")
      IF (matrix%bcsc) &
         DBCSR_ABORT("Not support for BCSC yet.")
      prow = matrix%index(dbcsr_slot_home_vprow)
      IF (prow .LT. 0) THEN
         prow = matrix%index(dbcsr_slot_home_prow)
      END IF
      nlocal_rows = matrix%nblkrows_local
      ALLOCATE (local_row_p(nlocal_rows + 1))
      ! The existing row_p is converted from an indexing array into a
      ! counting array.  Because it is later discarded, the counting is
      ! done in-place.
      ntotal_rows = matrix%nblkrows_total
      CALL dbcsr_count_row_index(matrix%row_p, ntotal_rows)
      ! We first have to find the local rows for the given prow.
      local_rows => array_data(matrix%local_rows)
      IF (SIZE(local_rows) /= nlocal_rows) &
         DBCSR_ABORT("Mismatch in the number of local rows.")
      ! The counts are mapped to local rows,
      DO lrow = 1, nlocal_rows
         local_row_p(lrow) = matrix%row_p(local_rows(lrow))
      END DO
      IF (SUM(matrix%row_p(1:ntotal_rows)) /= SUM(local_row_p(1:nlocal_rows))) &
         DBCSR_ABORT("Inconsistent row counts. Perhaps non-local rows contain data?.")
      ! then converted into an index.
      CALL dbcsr_build_row_index(local_row_p, nlocal_rows)
      ! The local row index replaces the global one.
      CALL dbcsr_clearfrom_index_array(matrix, dbcsr_slot_row_p)
      CALL dbcsr_addto_index_array(matrix, dbcsr_slot_row_p, DATA=local_row_p)
      ! Finally the matrix is designated as having a local-based index.
      matrix%local_indexing = .TRUE.
      IF (careful_mod) THEN
         IF (array_size(matrix%local_rows) /= nlocal_rows) &
            DBCSR_ABORT("Inconsistent local row counts.")
         IF (array_size(matrix%global_rows) /= ntotal_rows) &
            DBCSR_ABORT("Inconsistent global row counts.")
         IF (array_size(matrix%global_rows) .EQ. 0) THEN
            IF (nlocal_rows /= 0) &
               DBCSR_ABORT("Invalid number of local or global rows.")
         END IF
      END IF
      DEALLOCATE (local_row_p)
      CALL timestop(error_handle)
   END SUBROUTINE dbcsr_make_index_local_row