Allocate the internals of a CSR matrix using data from a block-row distributed DBCSR matrix
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_type), | intent(in) | :: | brd_mat |
block-row-distributed DBCSR matrix |
||
type(csr_type), | intent(out) | :: | csr_mat |
CSR matrix |
||
type(dbcsr_type), | intent(in) | :: | csr_sparsity_brd |
BRD matrix representing sparsity pattern of CSR matrix |
SUBROUTINE csr_create_from_brd(brd_mat, csr_mat, csr_sparsity_brd)
!! Allocate the internals of a CSR matrix using data from a block-row
!! distributed DBCSR matrix
TYPE(dbcsr_type), INTENT(IN) :: brd_mat
!! block-row-distributed DBCSR matrix
TYPE(csr_type), INTENT(OUT) :: csr_mat
!! CSR matrix
TYPE(dbcsr_type), INTENT(IN) :: csr_sparsity_brd
!! BRD matrix representing sparsity pattern of CSR matrix
CHARACTER(LEN=*), PARAMETER :: routineN = 'csr_create_from_brd'
INTEGER :: data_type, handle, &
nfullcols_total, nfullrows, &
nfullrows_total, nze_local
INTEGER(KIND=int_8) :: nze_total
INTEGER, DIMENSION(:), POINTER :: cdist, csr_index, dbcsr_index
TYPE(dbcsr_distribution_obj) :: dist_current
TYPE(mp_comm_type) :: mp_group
CALL timeset(routineN, handle)
NULLIFY (dbcsr_index, csr_index, cdist)
dist_current = dbcsr_distribution(brd_mat)
mp_group = dbcsr_mp_group(dbcsr_distribution_mp(dist_current))
cdist => dbcsr_distribution_col_dist(dist_current)
IF (ANY(cdist .NE. 0)) &
DBCSR_ABORT("DBCSR matrix not block-row distributed.")
! Calculate mapping between BRD and CSR indices
CALL csr_get_dbcsr_mapping(brd_mat, dbcsr_index, csr_index, nze_local, &
csr_sparsity_brd)
CALL dbcsr_get_info(brd_mat, nfullrows_total=nfullrows_total, &
nfullcols_total=nfullcols_total)
! Sum up local number of non-zero elements to get total number
nze_total = nze_local
CALL mp_sum(nze_total, mp_group)
nfullrows = dbcsr_nfullrows_local(brd_mat)
data_type = dbcsr_get_data_type(brd_mat)
! Allocate CSR matrix
CALL csr_create_new(csr_mat, nfullrows_total, nfullcols_total, nze_total, &
nze_local, nfullrows, mp_group, data_type)
csr_mat%dbcsr_mapping%brd_to_csr_ind => csr_index
csr_mat%dbcsr_mapping%csr_to_brd_ind => dbcsr_index
csr_mat%has_mapping = .TRUE.
csr_mat%dbcsr_mapping%brd_mat = brd_mat
CALL timestop(handle)
END SUBROUTINE csr_create_from_brd