convert a CSR matrix to a DBCSR matrix
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_type), | intent(inout) | :: | dbcsr_mat |
correctly allocated DBCSR matrix |
||
type(csr_type), | intent(inout) | :: | csr_mat |
CSR matrix to convert |
SUBROUTINE convert_csr_to_dbcsr(dbcsr_mat, csr_mat)
!! convert a CSR matrix to a DBCSR matrix
TYPE(dbcsr_type), INTENT(INOUT) :: dbcsr_mat
!! correctly allocated DBCSR matrix
TYPE(csr_type), INTENT(INOUT) :: csr_mat
!! CSR matrix to convert
CHARACTER(LEN=*), PARAMETER :: routineN = 'convert_csr_to_dbcsr'
INTEGER :: handle
TYPE(dbcsr_type) :: dbcsr_mat_nosym
CALL timeset(routineN, handle)
IF (.NOT. dbcsr_valid_index(dbcsr_mat)) &
DBCSR_ABORT("Invalid DBCSR matrix")
IF (dbcsr_get_data_type(dbcsr_mat) /= csr_mat%nzval_local%data_type) &
DBCSR_ABORT("DBCSR and CSR matrix must have same type")
IF (.NOT. csr_mat%has_mapping) &
DBCSR_ABORT("CSR_mat must contain mapping to DBCSR format")
! Desymmetrize to assert that DBCSR matrix has sparsity pattern consistent with CSR matrix
IF (dbcsr_has_symmetry(dbcsr_mat)) THEN
CALL dbcsr_desymmetrize_deep(dbcsr_mat, dbcsr_mat_nosym, untransposed_data=.TRUE.)
ELSE
dbcsr_mat_nosym = dbcsr_mat
END IF
CALL csr_assert_consistency_with_dbcsr(csr_mat, dbcsr_mat_nosym)
IF (dbcsr_has_symmetry(dbcsr_mat)) CALL dbcsr_release(dbcsr_mat_nosym)
! 1) CSR -> BRD
CALL convert_csr_to_brd(csr_mat%dbcsr_mapping%brd_mat, csr_mat)
! 2) BRD -> DBCSR
CALL dbcsr_complete_redistribute(csr_mat%dbcsr_mapping%brd_mat, dbcsr_mat)
CALL timestop(handle)
END SUBROUTINE convert_csr_to_dbcsr