Init buffer
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_buffer), | intent(inout) | :: | buffer | |||
integer, | intent(in) | :: | data_type | |||
integer, | intent(in) | :: | data_size | |||
integer, | intent(in) | :: | meta_size | |||
integer, | intent(in), | optional | :: | num_data | ||
type(dbcsr_memtype_type), | intent(in) | :: | data_memory_type | |||
type(dbcsr_memtype_type), | intent(in), | optional | :: | trs_memory_type |
SUBROUTINE buffer_init(buffer, data_type, &
!! Init buffer
data_size, meta_size, &
num_data, &
data_memory_type, trs_memory_type)
TYPE(dbcsr_buffer), INTENT(INOUT) :: buffer
INTEGER, INTENT(IN) :: data_type, data_size, meta_size
INTEGER, INTENT(IN), OPTIONAL :: num_data
TYPE(dbcsr_memtype_type), INTENT(IN) :: data_memory_type
TYPE(dbcsr_memtype_type), INTENT(IN), OPTIONAL :: trs_memory_type
INTEGER :: my_num_data
LOGICAL :: new_trs_stackbuf
my_num_data = 1
IF (PRESENT(num_data)) THEN
my_num_data = num_data
ELSE
IF (dbcsr_data_valid(buffer%data_before_resize) .OR. ASSOCIATED(buffer%meta_before_resize)) &
DBCSR_ABORT("Previous data area already initialized.")
CALL dbcsr_data_init(buffer%data_before_resize)
CALL dbcsr_data_new(buffer%data_before_resize, data_type, memory_type=data_memory_type)
END IF
new_trs_stackbuf = PRESENT(trs_memory_type) .AND. has_acc
!
IF (buffer%is_valid) THEN
! Invalid buffers if data_type is different
IF (dbcsr_data_get_type(buffer%data) .NE. data_type) THEN
CALL dbcsr_data_release(buffer%data)
IF (new_trs_stackbuf) THEN
CALL dbcsr_data_release(buffer%trs_stackbuf)
END IF
buffer%is_valid = .FALSE.
END IF
END IF
!
IF (.NOT. buffer%is_valid) THEN
! First initialization
CALL dbcsr_data_init(buffer%data)
CALL dbcsr_data_new(buffer%data, data_type=data_type, &
data_size=data_size*my_num_data, memory_type=data_memory_type)
CALL dbcsr_data_set_size_referenced(buffer%data, data_size*my_num_data)
IF (new_trs_stackbuf) THEN
CALL dbcsr_data_init(buffer%trs_stackbuf)
CALL dbcsr_data_new(buffer%trs_stackbuf, &
data_type=dbcsr_type_int_4, data_size=(meta_size/3)*my_num_data, &
memory_type=trs_memory_type)
END IF
buffer%is_valid = .TRUE.
ELSE
IF (PRESENT(num_data)) THEN
CALL dbcsr_data_ensure_size(buffer%data, data_size*my_num_data, nocopy=.TRUE.)
IF (new_trs_stackbuf) THEN
CALL dbcsr_data_ensure_size(buffer%trs_stackbuf, (meta_size/3)*my_num_data, nocopy=.TRUE.)
END IF
ELSE
! Case for MPI windows
! data_before_resize keeps the pointer to previous data in the case of reallocation
CALL dbcsr_data_ensure_size(buffer%data, data_size, nocopy=.TRUE., &
area_resize=buffer%data_before_resize)
END IF
END IF
!
IF (PRESENT(num_data)) THEN
CALL ensure_array_size(buffer%meta, ub=meta_size*my_num_data, nocopy=.TRUE., &
memory_type=memtype_mpi_buffer)
ELSE
! Case for MPI windows
! meta_before_resize keeps the pointer to previous meta in the case of reallocation
CALL ensure_array_size(buffer%meta, array_resize=buffer%meta_before_resize, &
ub=meta_size, nocopy=.TRUE., &
memory_type=memtype_mpi_buffer)
END IF
!
buffer%is_comm = .FALSE.
END SUBROUTINE buffer_init