Deallocates and destroys a matrix.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_type), | intent(inout) | :: | matrix |
matrix |
||
logical, | intent(in), | optional | :: | force |
force deallocation |
RECURSIVE SUBROUTINE dbcsr_destroy(matrix, force)
!! Deallocates and destroys a matrix.
TYPE(dbcsr_type), INTENT(INOUT) :: matrix
!! matrix
LOGICAL, INTENT(IN), OPTIONAL :: force
!! force deallocation
CHARACTER(len=*), PARAMETER :: routineN = 'dbcsr_destroy'
INTEGER :: error_handle
LOGICAL :: force_all
! ---------------------------------------------------------------------------
CALL timeset(routineN, error_handle)
force_all = .FALSE.
IF (PRESENT(force)) force_all = force
IF (.NOT. force_all .AND. matrix%refcount .NE. 0) &
DBCSR_WARN("You should not destroy referenced matrix.")
IF (force_all .AND. matrix%refcount .GT. 1) &
DBCSR_WARN("You should not destroy referenced matrix.")
IF (force_all .OR. matrix%refcount .EQ. 0) THEN
IF (ASSOCIATED(matrix%wms)) &
DBCSR_WARN("Destroying unfinalized matrix")
IF (ASSOCIATED(matrix%index)) THEN
CALL memory_deallocate(matrix%index, matrix%index_memory_type)
END IF
CALL dbcsr_data_release(matrix%data_area)
CALL array_release(matrix%row_blk_size)
CALL array_release(matrix%col_blk_size)
CALL array_release(matrix%row_blk_offset)
CALL array_release(matrix%col_blk_offset)
CALL dbcsr_distribution_release(matrix%dist)
CALL dbcsr_release_locals(matrix)
matrix%valid = .FALSE.
matrix%refcount = 0
END IF
CALL timestop(error_handle)
END SUBROUTINE dbcsr_destroy