Prints a BCSR matrix (block-style, not full)
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_type), | intent(in) | :: | matrix |
matrix |
||
logical, | intent(in), | optional | :: | nodata |
don't print actual data |
|
logical, | intent(in), | optional | :: | matlab_format |
don't print actual data |
|
character(len=*), | intent(in), | optional | :: | variable_name | ||
integer, | intent(in), | optional | :: | unit_nr |
SUBROUTINE dbcsr_print(matrix, nodata, matlab_format, variable_name, unit_nr)
!! Prints a BCSR matrix (block-style, not full)
TYPE(dbcsr_type), INTENT(IN) :: matrix
!! matrix
LOGICAL, INTENT(IN), OPTIONAL :: nodata, matlab_format
!! don't print actual data
CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: variable_name
INTEGER, INTENT(IN), OPTIONAL :: unit_nr
CHARACTER(len=*), PARAMETER :: routineN = 'dbcsr_print', routineP = moduleN//':'//routineN
COMPLEX(KIND=real_4), DIMENSION(:), POINTER :: c_sp
COMPLEX(KIND=real_8), DIMENSION(:), POINTER :: c_dp
INTEGER :: ablk_p, bc, blk, blk_p, br, ebr, fblk, &
handle, ibr, iunit, lblk, m, mn, n, &
sblk
INTEGER, DIMENSION(:), POINTER :: col_blk_offset, col_blk_size, &
local_cols, local_rows, &
row_blk_offset, row_blk_size
LOGICAL :: my_matlab_format, tr, yesprint
REAL(KIND=dp) :: blk_cs
REAL(KIND=real_4), DIMENSION(:), POINTER :: r_sp
REAL(KIND=real_8), DIMENSION(:), POINTER :: r_dp
! ---------------------------------------------------------------------------
CALL timeset(routineN, handle)
IF (.NOT. dbcsr_valid_index(matrix)) &
DBCSR_WARN("Can not print invalid matrix.")
iunit = default_output_unit
IF (PRESENT(unit_nr)) iunit = unit_nr
my_matlab_format = .FALSE.
IF (PRESENT(matlab_format)) my_matlab_format = matlab_format
yesprint = .TRUE.
IF (PRESENT(nodata)) yesprint = .NOT. nodata
WRITE (iunit, *) routineP//' Contents of matrix named ', matrix%name
WRITE (iunit, *) routineP//' Flags ', matrix%symmetry, &
matrix%negate_real, matrix%negate_imaginary, "type", &
dbcsr_get_data_type(matrix), "serial", matrix%serial_number
WRITE (iunit, '(1X,A,3(1X,I9,1X,A))') routineP, matrix%nblks, "blocks", &
matrix%nze, "nzes,", dbcsr_get_data_size(matrix), "data els", &
dbcsr_data_get_size_referenced(matrix%data_area), "used"
WRITE (iunit, '(1X,A,I5,A,I5)') routineP//" Full size", &
matrix%nfullrows_total, "x", matrix%nfullcols_total
WRITE (iunit, '(1X,A,I5,A,I5)') routineP//" Blocked size", &
matrix%nblkrows_total, "x", matrix%nblkcols_total
SELECT CASE (matrix%data_type)
CASE (dbcsr_type_real_8)
CALL dbcsr_get_data(matrix%data_area, r_dp)
CASE (dbcsr_type_real_4)
CALL dbcsr_get_data(matrix%data_area, r_sp)
CASE (dbcsr_type_complex_8)
CALL dbcsr_get_data(matrix%data_area, c_dp)
CASE (dbcsr_type_complex_4)
CALL dbcsr_get_data(matrix%data_area, c_sp)
END SELECT
row_blk_size => array_data(matrix%row_blk_size)
col_blk_size => array_data(matrix%col_blk_size)
row_blk_offset => array_data(matrix%row_blk_offset)
col_blk_offset => array_data(matrix%col_blk_offset)
IF (matrix%nblks .GT. 0) THEN
IF (matrix%list_indexing) THEN
IF (SIZE(matrix%coo_l) .NE. 3*matrix%nblks) &
DBCSR_ABORT("Wrong list")
ebr = 1
sblk = 3
ELSE
ebr = matrix%nblkrows_total
sblk = 1
END IF
DO ibr = 1, ebr
IF (matrix%list_indexing) THEN
fblk = 1
lblk = SIZE(matrix%coo_l)
ELSE
br = ibr
fblk = matrix%row_p(br) + 1
lblk = matrix%row_p(br + 1)
m = row_blk_size(br)
END IF
DO blk = fblk, lblk, sblk
IF (matrix%list_indexing) THEN
br = matrix%coo_l(blk)
bc = matrix%coo_l(blk + 1)
IF (matrix%local_indexing) THEN
local_rows => array_data(matrix%local_rows)
local_cols => array_data(matrix%local_cols)
br = local_rows(br)
bc = local_cols(bc)
END IF
m = row_blk_size(br)
ablk_p = matrix%coo_l(blk + 2)
ELSE
bc = matrix%col_i(blk)
ablk_p = matrix%blk_p(blk)
END IF
n = col_blk_size(bc)
mn = m*n
blk_p = ABS(ablk_p)
tr = ablk_p .LT. 0
block_exists: IF (blk_p .NE. 0) THEN
IF (mn .GT. 0) THEN
SELECT CASE (matrix%data_type)
CASE (dbcsr_type_real_8)
blk_cs = REAL(DOT_PRODUCT(r_dp(blk_p:blk_p + mn - 1), &
r_dp(blk_p:blk_p + mn - 1)), KIND=dp)
!CALL &
! dbcsr_printmat(r_dp(blk_p:blk_p+mn-1),m,n, tr=tr)
CASE (dbcsr_type_real_4)
blk_cs = REAL(DOT_PRODUCT(r_sp(blk_p:blk_p + mn - 1), &
r_sp(blk_p:blk_p + mn - 1)), KIND=dp)
!CALL &
! dbcsr_printmat(r_sp(blk_p:blk_p+mn-1),m,n, tr=tr)
CASE (dbcsr_type_complex_8)
blk_cs = REAL(DOT_PRODUCT(c_dp(blk_p:blk_p + mn - 1), &
c_dp(blk_p:blk_p + mn - 1)), KIND=dp)
!CALL &
! dbcsr_printmat(c_dp(blk_p:blk_p+mn-1),m,n, tr=tr)
CASE (dbcsr_type_complex_4)
blk_cs = REAL(DOT_PRODUCT(c_sp(blk_p:blk_p + mn - 1), &
c_sp(blk_p:blk_p + mn - 1)), KIND=dp)
!CALL &
! dbcsr_printmat(c_sp(blk_p:blk_p+mn-1),m,n, tr=tr)
END SELECT
ELSE
blk_cs = 0.0_dp
END IF
!WRITE(iunit,*)routineP//' chksum for (',br,',',bc,') at',&
! blk_p,'l',mn,'= ', blk_cs,'size',m,n
IF (.NOT. my_matlab_format) WRITE (iunit, '(A,I6,",",I6,A,I7,A,I6,I6,"=",I7,A,E12.3)') &
!" Checksum for (",br,bc,") at ",blk_p," size ",m,n,mn,&
" Checksum for (", br, bc, ") at ", ablk_p, " size ", m, n, mn, &
" checksum=", blk_cs
IF (yesprint .AND. blk_p .NE. 0) THEN
IF (mn .GT. 0) THEN
SELECT CASE (matrix%data_type)
CASE (dbcsr_type_real_8)
!WRITE(iunit,'(10(1X,F7.2))')r_dp(blk_p:blk_p+mn-1)
IF (my_matlab_format) THEN
CALL dbcsr_printmat_matlab_d(r_dp(blk_p:blk_p + mn - 1), m, n, &
row_blk_offset(br), col_blk_offset(bc), iunit, tr=tr, &
variable_name=variable_name)
ELSE
CALL dbcsr_printmat(r_dp(blk_p:blk_p + mn - 1), m, n, iunit=iunit, tr=tr)
END IF
CASE (dbcsr_type_real_4)
IF (my_matlab_format) THEN
CALL dbcsr_printmat_matlab_s(r_sp(blk_p:blk_p + mn - 1), m, n, &
row_blk_offset(br), col_blk_offset(bc), iunit, tr=tr, &
variable_name=variable_name)
ELSE
CALL dbcsr_printmat(r_sp(blk_p:blk_p + mn - 1), m, n, iunit=iunit, tr=tr)
END IF
CASE (dbcsr_type_complex_8)
IF (my_matlab_format) THEN
CALL dbcsr_printmat_matlab_z(c_dp(blk_p:blk_p + mn - 1), m, n, &
row_blk_offset(br), col_blk_offset(bc), iunit, tr=tr, &
variable_name=variable_name)
ELSE
CALL dbcsr_printmat(c_dp(blk_p:blk_p + mn - 1), m, n, iunit=iunit, tr=tr)
END IF
CASE (dbcsr_type_complex_4)
IF (my_matlab_format) THEN
CALL dbcsr_printmat_matlab_c(c_sp(blk_p:blk_p + mn - 1), m, n, &
row_blk_offset(br), col_blk_offset(bc), iunit, tr=tr, &
variable_name=variable_name)
ELSE
CALL dbcsr_printmat(c_sp(blk_p:blk_p + mn - 1), m, n, iunit=iunit, tr=tr)
END IF
END SELECT
END IF
END IF
END IF block_exists
END DO
END DO
END IF
CALL timestop(handle)
END SUBROUTINE dbcsr_print