Copies a data area, converting data type
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_data_obj), | intent(inout) | :: | target_area |
target data area |
||
type(dbcsr_data_obj), | intent(in) | :: | source_area |
source data area |
||
logical, | intent(in), | optional | :: | drop_real |
drops real part of complex numbers instead of the imaginary part; default is false converts real to complex by placing into imaginary instead of real part |
|
logical, | intent(in), | optional | :: | multiply_by_i |
drops real part of complex numbers instead of the imaginary part; default is false converts real to complex by placing into imaginary instead of real part |
SUBROUTINE dbcsr_data_convert(target_area, source_area, drop_real, & multiply_by_i) !! Copies a data area, converting data type TYPE(dbcsr_data_obj), INTENT(INOUT) :: target_area !! target data area TYPE(dbcsr_data_obj), INTENT(IN) :: source_area !! source data area LOGICAL, INTENT(IN), OPTIONAL :: drop_real, multiply_by_i !! drops real part of complex numbers instead of the imaginary part; default is false !! converts real to complex by placing into imaginary instead of real part COMPLEX(KIND=real_4), DIMENSION(:), POINTER, CONTIGUOUS :: s_data_c, t_data_c COMPLEX(KIND=real_8), DIMENSION(:), POINTER, CONTIGUOUS :: s_data_z, t_data_z INTEGER :: n, ns, nt LOGICAL :: keep_real, noimult REAL(KIND=real_4), DIMENSION(:), POINTER, CONTIGUOUS :: s_data_r, t_data_r REAL(KIND=real_8), DIMENSION(:), POINTER, CONTIGUOUS :: s_data_d, t_data_d ! --------------------------------------------------------------------------- IF (.NOT. ASSOCIATED(source_area%d)) & DBCSR_WARN("Attempt to copy unassigned data") IF (source_area%d%refcount .LE. 0) & DBCSR_WARN("Attempt to copy unheld data") IF (.NOT. ASSOCIATED(source_area%d)) THEN RETURN END IF keep_real = .TRUE. IF (PRESENT(drop_real)) keep_real = .NOT. drop_real noimult = .TRUE. IF (PRESENT(multiply_by_i)) noimult = .NOT. multiply_by_i ns = dbcsr_data_get_size_referenced(source_area) nt = dbcsr_data_get_size_referenced(target_area) n = MIN(ns, nt) IF (n .GT. 0) THEN SELECT CASE (source_area%d%data_type) CASE (dbcsr_type_real_8) CALL dbcsr_get_data(source_area, s_data_d) SELECT CASE (target_area%d%data_type) CASE (dbcsr_type_real_8) CALL dbcsr_get_data(target_area, t_data_d) t_data_d(1:n) = s_data_d(1:n) CASE (dbcsr_type_real_4) CALL dbcsr_get_data(target_area, t_data_r) t_data_r(1:n) = REAL(s_data_d(1:n), KIND=real_4) CASE (dbcsr_type_complex_8) CALL dbcsr_get_data(target_area, t_data_z) IF (noimult) THEN t_data_z(1:n) = CMPLX(s_data_d(1:n), KIND=real_8) ELSE t_data_z(1:n) = CMPLX(0.0, s_data_d(1:n), KIND=real_8) END IF CASE (dbcsr_type_complex_4) CALL dbcsr_get_data(target_area, t_data_c) IF (noimult) THEN t_data_c(1:n) = CMPLX(s_data_d(1:n), KIND=real_4) ELSE t_data_c(1:n) = CMPLX(0.0, s_data_d(1:n), KIND=real_4) END IF CASE default DBCSR_ABORT("Invalid data type") END SELECT CASE (dbcsr_type_real_4) CALL dbcsr_get_data(source_area, s_data_r) SELECT CASE (target_area%d%data_type) CASE (dbcsr_type_real_8) CALL dbcsr_get_data(target_area, t_data_d) t_data_d(1:n) = REAL(s_data_r(1:n), KIND=real_8) CASE (dbcsr_type_real_4) CALL dbcsr_get_data(target_area, t_data_r) t_data_r(1:n) = s_data_r(1:n) CASE (dbcsr_type_complex_8) CALL dbcsr_get_data(target_area, t_data_z) IF (noimult) THEN t_data_z(1:n) = CMPLX(s_data_r(1:n), KIND=real_8) ELSE t_data_z(1:n) = CMPLX(0.0, s_data_r(1:n), KIND=real_8) END IF CASE (dbcsr_type_complex_4) CALL dbcsr_get_data(target_area, t_data_c) IF (noimult) THEN t_data_c(1:n) = CMPLX(s_data_r(1:n), KIND=real_4) ELSE t_data_c(1:n) = CMPLX(0.0, s_data_r(1:n), KIND=real_4) END IF CASE default DBCSR_ABORT("Invalid data type") END SELECT CASE (dbcsr_type_complex_8) CALL dbcsr_get_data(source_area, s_data_z) SELECT CASE (target_area%d%data_type) CASE (dbcsr_type_real_8) CALL dbcsr_get_data(target_area, t_data_d) IF (keep_real) THEN t_data_d(1:n) = REAL(s_data_z(1:n), KIND=real_8) ELSE t_data_d(1:n) = AIMAG(s_data_z(1:n)) END IF CASE (dbcsr_type_real_4) CALL dbcsr_get_data(target_area, t_data_r) IF (keep_real) THEN t_data_r(1:n) = REAL(s_data_z(1:n), KIND=real_4) ELSE t_data_r(1:n) = REAL(AIMAG(s_data_z(1:n)), KIND=real_4) END IF CASE (dbcsr_type_complex_8) CALL dbcsr_get_data(target_area, t_data_z) t_data_z(1:n) = s_data_z(1:n) CASE (dbcsr_type_complex_4) CALL dbcsr_get_data(target_area, t_data_c) t_data_c(1:n) = CMPLX(s_data_z(1:n), KIND=real_4) CASE default DBCSR_ABORT("Invalid data type") END SELECT CASE (dbcsr_type_complex_4) CALL dbcsr_get_data(source_area, s_data_c) SELECT CASE (target_area%d%data_type) CASE (dbcsr_type_real_8) CALL dbcsr_get_data(target_area, t_data_d) IF (keep_real) THEN t_data_d(1:n) = REAL(s_data_c(1:n), KIND=real_8) ELSE t_data_d(1:n) = REAL(AIMAG(s_data_c(1:n)), KIND=real_8) END IF CASE (dbcsr_type_real_4) CALL dbcsr_get_data(target_area, t_data_r) IF (keep_real) THEN t_data_r(1:n) = REAL(s_data_c(1:n), KIND=real_4) ELSE t_data_r(1:n) = AIMAG(s_data_c(1:n)) END IF CASE (dbcsr_type_complex_8) CALL dbcsr_get_data(target_area, t_data_z) t_data_z(1:n) = CMPLX(s_data_c(1:n), KIND=real_8) CASE (dbcsr_type_complex_4) CALL dbcsr_get_data(target_area, t_data_c) t_data_c(1:n) = s_data_c(1:n) CASE default DBCSR_ABORT("Invalid data type") END SELECT CASE default DBCSR_ABORT("Invalid data type") END SELECT END IF END SUBROUTINE dbcsr_data_convert