46 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: target_array
47 INTEGER,
DIMENSION(:),
INTENT(IN) :: row_index, col_index
49 INTEGER :: i, i_sub, j, j_sub, max_col, max_row, &
53 CALL cp_fm_get_info(source_matrix, nrow_global=max_row, ncol_global=max_col)
54 nrows =
SIZE(row_index)
55 ncols =
SIZE(col_index)
57 cpassert(maxval(row_index) <= max_row)
58 cpassert(maxval(col_index) <= max_col)
59 cpassert(minval(row_index) > 0)
60 cpassert(minval(col_index) > 0)
61 cpassert(nrows <= max_row)
62 cpassert(ncols <= max_col)
64 cpassert(
SIZE(target_array) == nrows*ncols)
71 target_array(i + (j - 1)*nrows) = mval
84 SUBROUTINE eri_to_array(eri_env, array, active_orbitals, spin1, spin2)
85 TYPE(
eri_type),
INTENT(IN) :: eri_env
86 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT) :: array
87 INTEGER,
DIMENSION(:, :),
INTENT(IN) :: active_orbitals
88 INTEGER,
INTENT(IN) :: spin1, spin2
90 INTEGER :: i, i1, i12, i12l, i2, i3, i34, i34l, i4, &
91 ijkl, ijlk, irptr, j, jikl, jilk, k, &
92 klij, klji, l, lkij, lkji, nindex, &
94 REAL(kind=
dp) :: erival
95 TYPE(dbcsr_csr_type),
POINTER :: eri
98 nmo_active =
SIZE(active_orbitals, 1)
99 nmo_max = eri_env%norb
100 nindex = (nmo_max*(nmo_max + 1))/2
101 IF (spin1 == 1 .AND. spin2 == 1)
THEN
102 eri => eri_env%eri(1)%csr_mat
103 ELSE IF ((spin1 == 1 .AND. spin2 == 2) .OR. (spin1 == 2 .AND. spin2 == 1))
THEN
104 eri => eri_env%eri(2)%csr_mat
106 eri => eri_env%eri(3)%csr_mat
109 CALL mp_group%set_handle(eri%mp_group%get_handle())
114 i1 = active_orbitals(i, spin1)
116 i2 = active_orbitals(j, spin1)
118 IF (mod(i12 - 1, eri_env%comm_exchange%num_pe) == eri_env%comm_exchange%mepos)
THEN
119 i12l = (i12 - 1)/eri_env%comm_exchange%num_pe + 1
120 irptr = eri%rowptr_local(i12l) - 1
121 DO i34l = 1, eri%nzerow_local(i12l)
122 i34 = eri%colind_local(irptr + i34l)
127 k = cp_findloc(active_orbitals(:, spin2), i3)
128 l = cp_findloc(active_orbitals(:, spin2), i4)
130 k = findloc(active_orbitals(:, spin2), i3, dim=1)
131 l = findloc(active_orbitals(:, spin2), i4, dim=1)
133 erival = eri%nzval_local%r_dp(irptr + i34l)
136 ijkl = i + (j - 1)*nmo_active + (k - 1)*nmo_active**2 + (l - 1)*nmo_active**3
137 jikl = j + (i - 1)*nmo_active + (k - 1)*nmo_active**2 + (l - 1)*nmo_active**3
138 ijlk = i + (j - 1)*nmo_active + (l - 1)*nmo_active**2 + (k - 1)*nmo_active**3
139 jilk = j + (i - 1)*nmo_active + (l - 1)*nmo_active**2 + (k - 1)*nmo_active**3
144 IF (spin1 == spin2)
THEN
145 klij = k + (l - 1)*nmo_active + (i - 1)*nmo_active**2 + (j - 1)*nmo_active**3
146 lkij = l + (k - 1)*nmo_active + (i - 1)*nmo_active**2 + (j - 1)*nmo_active**3
147 klji = k + (l - 1)*nmo_active + (j - 1)*nmo_active**2 + (i - 1)*nmo_active**3
148 lkji = l + (k - 1)*nmo_active + (j - 1)*nmo_active**2 + (i - 1)*nmo_active**3
158 CALL mp_group%sum(array)
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_get_element(matrix, irow_global, icol_global, alpha, local)
returns an element of a fm this value is valid on every cpu using this call is expensive