Calculates per-block norms. Rewritten to be very low-level.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_type), | intent(in) | :: | matrix |
DBCSR matrix for which to calculate norms |
||
real(kind=sp), | intent(out), | DIMENSION(:) | :: | norms |
Block norms |
|
integer, | intent(in), | DIMENSION(:), POINTER, CONTIGUOUS | :: | row_blk_sizes | ||
integer, | intent(in), | DIMENSION(:), POINTER, CONTIGUOUS | :: | col_blk_sizes |
SUBROUTINE calculate_norms(matrix, norms, row_blk_sizes, col_blk_sizes)
!! Calculates per-block norms.
!! Rewritten to be very low-level.
TYPE(dbcsr_type), INTENT(IN) :: matrix
!! DBCSR matrix for which to calculate norms
REAL(kind=sp), DIMENSION(:), INTENT(OUT) :: norms
!! Block norms
INTEGER, DIMENSION(:), POINTER, CONTIGUOUS, INTENT(IN) :: row_blk_sizes, col_blk_sizes
CHARACTER(len=*), PARAMETER :: routineN = 'calculate_norms'
INTEGER :: data_type, handle, nblks
! ---------------------------------------------------------------------------
CALL timeset(routineN, handle)
! Checks for validity
IF (.NOT. dbcsr_valid_index(matrix)) &
DBCSR_ABORT("The matrix must be valid.")
data_type = dbcsr_get_data_type(matrix)
nblks = matrix%nblks
SELECT CASE (data_type)
CASE (dbcsr_type_real_4)
CALL calc_norms_s(norms, nblks, matrix%coo_l, &
row_blk_sizes, col_blk_sizes, &
dbcsr_get_data_p_s(matrix%data_area))
CASE (dbcsr_type_real_8)
CALL calc_norms_d(norms, nblks, matrix%coo_l, &
row_blk_sizes, col_blk_sizes, &
dbcsr_get_data_p_d(matrix%data_area))
CASE (dbcsr_type_complex_4)
CALL calc_norms_c(norms, nblks, matrix%coo_l, &
row_blk_sizes, col_blk_sizes, &
dbcsr_get_data_p_c(matrix%data_area))
CASE (dbcsr_type_complex_8)
CALL calc_norms_z(norms, nblks, matrix%coo_l, &
row_blk_sizes, col_blk_sizes, &
dbcsr_get_data_p_z(matrix%data_area))
CASE DEFAULT
DBCSR_ABORT("Invalid data type.")
END SELECT
!
CALL timestop(handle)
END SUBROUTINE calculate_norms