Create a new CSR matrix and allocate all internal data using an existing CSR matrix. Copies the indices but no actual matrix data.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(csr_type), | intent(out) | :: | matrix_b |
Target CSR matrix |
||
type(csr_type), | intent(in) | :: | matrix_a |
Source CSR matrix |
SUBROUTINE csr_create_template(matrix_b, matrix_a)
!! Create a new CSR matrix and allocate all internal data using
!! an existing CSR matrix. Copies the indices but no actual matrix data.
TYPE(csr_type), INTENT(OUT) :: matrix_b
!! Target CSR matrix
TYPE(csr_type), INTENT(IN) :: matrix_a
!! Source CSR matrix
CHARACTER(LEN=*), PARAMETER :: routineN = 'csr_create_template'
INTEGER :: handle
TYPE(csr_mapping_data) :: map
CALL timeset(routineN, handle)
IF (.NOT. matrix_a%valid) &
DBCSR_ABORT("Source CSR matrix must be created.")
CALL csr_create_new(matrix_b, matrix_a%nrows_total, matrix_a%ncols_total, &
matrix_a%nze_total, matrix_a%nze_local, matrix_a%nrows_local, &
matrix_a%mp_group, matrix_a%nzval_local%data_type)
matrix_b%mp_group = matrix_a%mp_group
matrix_b%has_mapping = matrix_a%has_mapping
matrix_b%has_indices = matrix_a%has_indices
IF (matrix_a%has_indices) THEN
matrix_b%rowptr_local = matrix_a%rowptr_local
matrix_b%nzerow_local = matrix_a%nzerow_local
matrix_b%colind_local = matrix_a%colind_local
END IF
IF (matrix_a%has_mapping) THEN
map = matrix_a%dbcsr_mapping
ALLOCATE (matrix_b%dbcsr_mapping%csr_to_brd_ind(SIZE(map%csr_to_brd_ind)))
ALLOCATE (matrix_b%dbcsr_mapping%brd_to_csr_ind(SIZE(map%brd_to_csr_ind)))
matrix_b%dbcsr_mapping%csr_to_brd_ind = map%csr_to_brd_ind
matrix_b%dbcsr_mapping%brd_to_csr_ind = map%brd_to_csr_ind
matrix_b%dbcsr_mapping%has_dbcsr_block_data = map%has_dbcsr_block_data
IF (matrix_b%dbcsr_mapping%has_dbcsr_block_data) THEN
matrix_b%dbcsr_mapping%dbcsr_nblkcols_total = map%dbcsr_nblkcols_total
matrix_b%dbcsr_mapping%dbcsr_nblkrows_total = map%dbcsr_nblkrows_total
ALLOCATE (matrix_b%dbcsr_mapping%dbcsr_row_blk_size(map%dbcsr_nblkrows_total))
ALLOCATE (matrix_b%dbcsr_mapping%dbcsr_col_blk_size(map%dbcsr_nblkcols_total))
ALLOCATE (matrix_b%dbcsr_mapping%dbcsr_row_p(map%dbcsr_nblkrows_total + 1))
ALLOCATE (matrix_b%dbcsr_mapping%dbcsr_col_i(map%dbcsr_nblks_local))
matrix_b%dbcsr_mapping%dbcsr_nblks_local = map%dbcsr_nblks_local
matrix_b%dbcsr_mapping%dbcsr_row_p = map%dbcsr_row_p
matrix_b%dbcsr_mapping%dbcsr_col_i = map%dbcsr_col_i
matrix_b%dbcsr_mapping%dbcsr_row_blk_size = map%dbcsr_row_blk_size
matrix_b%dbcsr_mapping%dbcsr_col_blk_size = map%dbcsr_col_blk_size
END IF
CALL dbcsr_copy(matrix_b%dbcsr_mapping%brd_mat, map%brd_mat)
matrix_b%valid = .TRUE.
END IF
CALL timestop(handle)
END SUBROUTINE csr_create_template