Creates a work matrix from the data present in a finalized matrix.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_type), | intent(inout) | :: | matrix |
DBCSR matrix |
||
integer, | intent(in), | optional, | DIMENSION(4) | :: | limits |
the limits to use for copying |
SUBROUTINE dbcsr_add_wm_from_matrix(matrix, limits) !! Creates a work matrix from the data present in a finalized matrix. TYPE(dbcsr_type), INTENT(INOUT) :: matrix !! DBCSR matrix INTEGER, DIMENSION(4), INTENT(IN), OPTIONAL :: limits !! the limits to use for copying CHARACTER(len=*), PARAMETER :: routineN = 'dbcsr_add_wm_from_matrix' INTEGER :: handle, ithread, nthreads, nwms, & old_nwms, size_used LOGICAL :: preexists ! --------------------------------------------------------------------------- CALL timeset(routineN, handle) !$OMP BARRIER preexists = ASSOCIATED(matrix%wms) IF (preexists) THEN old_nwms = SIZE(matrix%wms) IF (old_nwms .EQ. 0) & DBCSR_WARN("Nonexisting work matrices?!") ELSE old_nwms = 0 END IF nthreads = 1; ithread = 0 !$ nthreads = OMP_GET_NUM_THREADS(); ithread = OMP_GET_THREAD_NUM() IF (nthreads .GT. 1) THEN IF (old_nwms /= nthreads .AND. old_nwms /= 0) & DBCSR_ABORT("Number of work matrices and threads do not match") END IF nwms = MAX(1, old_nwms) !$ nwms = MAX(nwms, nthreads) !$OMP BARRIER !$OMP MASTER IF (.NOT. ASSOCIATED(matrix%wms)) THEN CALL dbcsr_work_create(matrix, & INT(matrix%nblks*default_resize_factor/nwms), & INT(matrix%nze*default_resize_factor/nwms), & n=nwms, work_mutable=.FALSE.) END IF !$OMP END MASTER !$OMP BARRIER size_used = matrix%nze CALL dbcsr_fill_wm_from_matrix(matrix%wms, matrix, size_used, & limits=limits) !$OMP BARRIER CALL timestop(handle) END SUBROUTINE dbcsr_add_wm_from_matrix