Returns the occupation of the matrix
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_type), | intent(in) | :: | matrix |
matrix from which to get the occupation |
FUNCTION dbcsr_get_occupation(matrix) RESULT(occupation) !! Returns the occupation of the matrix TYPE(dbcsr_type), INTENT(IN) :: matrix !! matrix from which to get the occupation REAL(KIND=real_8) :: occupation INTEGER :: nfullcols, nfullrows INTEGER(KIND=int_8) :: nze_global INTEGER, DIMENSION(:), POINTER :: row_blk_size nze_global = matrix%nze CALL mp_sum(nze_global, dbcsr_mp_group(dbcsr_distribution_mp(matrix%dist))) nfullrows = dbcsr_nfullrows_total(matrix) nfullcols = dbcsr_nfullcols_total(matrix) row_blk_size => array_data(matrix%row_blk_size) IF (nfullrows .NE. 0 .AND. nfullcols .NE. 0) THEN IF (dbcsr_has_symmetry(matrix)) THEN IF (2*nze_global .EQ. & (INT(nfullrows, KIND=int_8)*INT(nfullrows + 1, KIND=int_8) + SUM(row_blk_size*(row_blk_size - 1)))) THEN occupation = 1.0_real_8 ELSE occupation = 2.0_real_8*REAL(nze_global, real_8)/ & (REAL(nfullrows, real_8)*REAL(nfullrows + 1, real_8) + & SUM(REAL(row_blk_size, real_8)*REAL(row_blk_size - 1, real_8))) END IF ELSE IF (nze_global .EQ. INT(nfullrows, KIND=int_8)*INT(nfullcols, KIND=int_8)) THEN occupation = 1.0_real_8 ELSE occupation = REAL(nze_global, real_8)/(REAL(nfullrows, real_8)*REAL(nfullcols, real_8)) END IF END IF ELSE occupation = 0.0_real_8 END IF END FUNCTION dbcsr_get_occupation