SUBROUTINE setup_buffer_matrix(matrix, source_matrix, &
index_size, data_size, data_buffer, data_memory_type)
TYPE(dbcsr_type), INTENT(INOUT) :: matrix
TYPE(dbcsr_type), INTENT(IN) :: source_matrix
INTEGER, INTENT(IN), OPTIONAL :: index_size, data_size
TYPE(dbcsr_data_obj), INTENT(IN), OPTIONAL :: data_buffer
TYPE(dbcsr_memtype_type), INTENT(IN), OPTIONAL :: data_memory_type
matrix = dbcsr_type()
CALL dbcsr_create(matrix, &
template=source_matrix, &
name=TRIM("Buffer of "//TRIM(source_matrix%name)), &
nze=data_size, &
data_buffer=data_buffer, &
data_memory_type=data_memory_type, &
index_memory_type=memtype_mpi_buffer)
IF (PRESENT(data_size)) THEN
CALL dbcsr_data_ensure_size( &
matrix%data_area, &
data_size, nocopy=.TRUE.)
END IF
IF (PRESENT(index_size)) THEN
CALL ensure_array_size( &
matrix%index, &
ub=index_size, nocopy=.TRUE., &
memory_type=dbcsr_get_index_memory_type(matrix))
END IF
matrix%negate_real = source_matrix%negate_real
matrix%negate_imaginary = source_matrix%negate_imaginary
matrix%local_indexing = source_matrix%local_indexing
matrix%list_indexing = source_matrix%list_indexing
!
IF (source_matrix%has_local_rows) THEN
matrix%local_rows = source_matrix%local_rows
CALL array_hold(matrix%local_rows)
matrix%has_local_rows = .TRUE.
END IF
IF (source_matrix%has_global_rows) THEN
matrix%global_rows = source_matrix%global_rows
CALL array_hold(matrix%global_rows)
matrix%has_global_rows = .TRUE.
END IF
IF (source_matrix%has_local_cols) THEN
matrix%local_cols = source_matrix%local_cols
CALL array_hold(matrix%local_cols)
matrix%has_local_cols = .TRUE.
END IF
IF (source_matrix%has_global_cols) THEN
matrix%global_cols = source_matrix%global_cols
CALL array_hold(matrix%global_cols)
matrix%has_global_cols = .TRUE.
END IF
END SUBROUTINE setup_buffer_matrix