Removes a reference and/or clears the data area.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_data_obj), | intent(inout) | :: | area |
data area |
SUBROUTINE dbcsr_data_release(area)
!! Removes a reference and/or clears the data area.
TYPE(dbcsr_data_obj), INTENT(INOUT) :: area
!! data area
CHARACTER(len=*), PARAMETER :: routineN = 'dbcsr_data_release'
INTEGER :: handle
! ---------------------------------------------------------------------------
CALL timeset(routineN, handle)
IF (.NOT. ASSOCIATED(area%d)) &
DBCSR_WARN("Data seems to be unreferenced.")
IF (ASSOCIATED(area%d)) THEN
!
IF (careful_mod) THEN
IF (area%d%refcount .LE. 0) &
DBCSR_WARN("Data seems to be unreferenced.")
END IF
!
area%d%refcount = area%d%refcount - 1
! If we're releasing the last reference, then free the memory.
IF (area%d%refcount .EQ. 0) THEN
IF (.NOT. dbcsr_data_exists(area)) THEN
DEALLOCATE (area%d)
ELSE IF (dbcsr_data_get_size(area) > 1 .AND. ASSOCIATED(area%d%memory_type%pool)) THEN
area%d%ref_size = 0
CALL dbcsr_mempool_add(area)
ELSE
CALL internal_data_deallocate(area%d)
DEALLOCATE (area%d)
END IF
NULLIFY (area%d)
END IF
END IF
CALL timestop(handle)
END SUBROUTINE dbcsr_data_release