Copies a block subset
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_data_obj), | intent(inout) | :: | dst |
target data area |
||
integer, | intent(in) | :: | dst_rs |
target block row size (logical) target block column size (logical) |
||
integer, | intent(in) | :: | dst_cs |
target block row size (logical) target block column size (logical) |
||
logical | :: | dst_tr |
whether target block is transposed |
|||
type(dbcsr_data_obj), | intent(in) | :: | src |
source data area |
||
integer, | intent(in) | :: | src_rs |
source block row size (logical) source block column size (logical) |
||
integer, | intent(in) | :: | src_cs |
source block row size (logical) source block column size (logical) |
||
logical | :: | src_tr |
whether source block is transposed |
|||
integer, | intent(in) | :: | dst_r_lb |
first row in target first column in target first_row in source first column in target number of rows to copy number of columns to copy |
||
integer, | intent(in) | :: | dst_c_lb |
first row in target first column in target first_row in source first column in target number of rows to copy number of columns to copy |
||
integer, | intent(in) | :: | src_r_lb |
first row in target first column in target first_row in source first column in target number of rows to copy number of columns to copy |
||
integer, | intent(in) | :: | src_c_lb |
first row in target first column in target first_row in source first column in target number of rows to copy number of columns to copy |
||
integer, | intent(in) | :: | nrow |
first row in target first column in target first_row in source first column in target number of rows to copy number of columns to copy |
||
integer, | intent(in) | :: | ncol |
first row in target first column in target first_row in source first column in target number of rows to copy number of columns to copy |
||
integer, | intent(in), | optional | :: | dst_offset |
offset in target offset in source |
|
integer, | intent(in), | optional | :: | src_offset |
offset in target offset in source |
SUBROUTINE dbcsr_block_partial_copy(dst, dst_rs, dst_cs, dst_tr, & src, src_rs, src_cs, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol, & dst_offset, src_offset) !! Copies a block subset TYPE(dbcsr_data_obj), INTENT(INOUT) :: dst !! target data area INTEGER, INTENT(IN) :: dst_rs, dst_cs !! target block row size (logical) !! target block column size (logical) LOGICAL :: dst_tr !! whether target block is transposed TYPE(dbcsr_data_obj), INTENT(IN) :: src !! source data area INTEGER, INTENT(IN) :: src_rs, src_cs !! source block row size (logical) !! source block column size (logical) LOGICAL :: src_tr !! whether source block is transposed INTEGER, INTENT(IN) :: dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, & nrow, ncol !! first row in target !! first column in target !! first_row in source !! first column in target !! number of rows to copy !! number of columns to copy INTEGER, INTENT(IN), OPTIONAL :: dst_offset, src_offset !! offset in target !! offset in source LOGICAL, PARAMETER :: verification = careful_mod INTEGER :: dst_o, src_o LOGICAL :: src_is_2d ! --------------------------------------------------------------------------- IF (careful_mod) THEN IF (dbcsr_type_2d_to_1d(dbcsr_data_get_type(dst)) /= dbcsr_type_2d_to_1d(dbcsr_data_get_type(src))) & DBCSR_ABORT("Incompatible data types.") END IF dst_o = 0; src_o = 0 IF (PRESENT(dst_offset)) dst_o = dst_offset IF (PRESENT(src_offset)) src_o = src_offset IF (verification) THEN IF (dst_r_lb + nrow - 1 > dst_rs) & DBCSR_ABORT("Incompatible dst row sizes") IF (dst_c_lb + ncol - 1 > dst_cs) & DBCSR_ABORT("Incompatible dst col sizes") IF (src_r_lb + nrow - 1 > src_rs) & DBCSR_ABORT("Incompatible src row sizes") IF (src_c_lb + ncol - 1 > src_cs) & DBCSR_ABORT("Incompatible src col sizes") END IF ! src_is_2d = dbcsr_type_is_2d(dbcsr_data_get_type(src)) SELECT CASE (dbcsr_data_get_type(dst)) CASE (dbcsr_type_real_4) IF (src_is_2d) THEN CALL block_partial_copy_1d2d_s(dst%d%r_sp, dst_rs, dst_cs, dst_tr, & src%d%r2_sp, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol, & dst_offset=dst_o) ELSE CALL block_partial_copy_s(dst%d%r_sp, dst_rs, dst_cs, dst_tr, & src%d%r_sp, src_rs, src_cs, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol, & dst_offset=dst_o, src_offset=src_o) END IF CASE (dbcsr_type_real_8) IF (src_is_2d) THEN CALL block_partial_copy_1d2d_d(dst%d%r_dp, dst_rs, dst_cs, dst_tr, & src%d%r2_dp, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol, & dst_offset=dst_o) ELSE CALL block_partial_copy_d(dst%d%r_dp, dst_rs, dst_cs, dst_tr, & src%d%r_dp, src_rs, src_cs, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol, & dst_offset=dst_o, src_offset=src_o) END IF CASE (dbcsr_type_complex_4) IF (src_is_2d) THEN CALL block_partial_copy_1d2d_c(dst%d%c_sp, dst_rs, dst_cs, dst_tr, & src%d%c2_sp, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol, & dst_offset=dst_o) ELSE CALL block_partial_copy_c(dst%d%c_sp, dst_rs, dst_cs, dst_tr, & src%d%c_sp, src_rs, src_cs, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol, & dst_offset=dst_o, src_offset=src_o) END IF CASE (dbcsr_type_complex_8) IF (src_is_2d) THEN CALL block_partial_copy_1d2d_z(dst%d%c_dp, dst_rs, dst_cs, dst_tr, & src%d%c2_dp, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol, & dst_offset=dst_o) ELSE CALL block_partial_copy_z(dst%d%c_dp, dst_rs, dst_cs, dst_tr, & src%d%c_dp, src_rs, src_cs, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol, & dst_offset=dst_o, src_offset=src_o) END IF CASE (dbcsr_type_real_4_2d) IF (src_is_2d) THEN CALL block_partial_copy_2d2d_s(dst%d%r2_sp, dst_tr, & src%d%r2_sp, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol) ELSE CALL block_partial_copy_2d1d_s(dst%d%r2_sp, dst_tr, & src%d%r_sp, src_rs, src_cs, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol, & src_offset=src_o) END IF CASE (dbcsr_type_real_8_2d) IF (src_is_2d) THEN CALL block_partial_copy_2d2d_d(dst%d%r2_dp, dst_tr, & src%d%r2_dp, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol) ELSE CALL block_partial_copy_2d1d_d(dst%d%r2_dp, dst_tr, & src%d%r_dp, src_rs, src_cs, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol, & src_offset=src_o) END IF CASE (dbcsr_type_complex_4_2d) IF (src_is_2d) THEN CALL block_partial_copy_2d2d_c(dst%d%c2_sp, dst_tr, & src%d%c2_sp, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol) ELSE CALL block_partial_copy_2d1d_c(dst%d%c2_sp, dst_tr, & src%d%c_sp, src_rs, src_cs, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol, & src_offset=src_o) END IF CASE (dbcsr_type_complex_8_2d) IF (src_is_2d) THEN CALL block_partial_copy_2d2d_z(dst%d%c2_dp, dst_tr, & src%d%c2_dp, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol) ELSE CALL block_partial_copy_2d1d_z(dst%d%c2_dp, dst_tr, & src%d%c_dp, src_rs, src_cs, src_tr, & dst_r_lb, dst_c_lb, src_r_lb, src_c_lb, nrow, ncol, & src_offset=src_o) END IF CASE default DBCSR_ABORT("Invalid data type.") END SELECT END SUBROUTINE dbcsr_block_partial_copy