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