70 INTEGER,
DIMENSION(:, :, :),
OPTIONAL,
POINTER :: cell_to_index
72 CHARACTER(*),
PARAMETER :: routinen =
'calculate_lri_ks_matrix'
74 INTEGER :: atom_a, atom_b, col, handle, i, iac, iatom, ic, ikind, ilist, jatom, jkind, &
75 jneighbor, mepos, nba, nbb, nfa, nfb, nkind, nlist, nm, nn, nthread, row
76 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind
77 INTEGER,
DIMENSION(3) :: cell
78 LOGICAL :: found, trans, use_cell_mapping
79 REAL(kind=
dp) :: dab, fw, isn, isna, isnb, rab(3), &
81 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: vi, via, vib
82 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: hf_work, hs_work, int3, wab, wbb
83 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: h_block
87 DIMENSION(:),
POINTER :: nl_iterator
91 CALL timeset(routinen, handle)
92 NULLIFY (h_block, lrii, nl_iterator, soo_list)
94 threshold = lri_env%eps_o3_int
96 use_cell_mapping = (
SIZE(h_matrix, 1) > 1)
97 IF (use_cell_mapping)
THEN
98 cpassert(
PRESENT(cell_to_index))
101 IF (
ASSOCIATED(lri_env%soo_list))
THEN
102 soo_list => lri_env%soo_list
104 nkind = lri_env%lri_ints%nkind
121 CALL get_iterator_info(nl_iterator, mepos=mepos, ikind=ikind, jkind=jkind, iatom=iatom, &
122 jatom=jatom, nlist=nlist, ilist=ilist, inode=jneighbor, &
125 iac = ikind + nkind*(jkind - 1)
126 dab = sqrt(sum(rab*rab))
128 IF (.NOT.
ASSOCIATED(lri_env%lri_ints%lri_atom(iac)%lri_node)) cycle
129 IF (lri_env%exact_1c_terms)
THEN
130 IF (iatom == jatom .AND. dab < lri_env%delta) cycle
133 lrii => lri_env%lri_ints%lri_atom(iac)%lri_node(ilist)%lri_int(jneighbor)
141 atom_a = atom_of_kind(iatom)
142 atom_b = atom_of_kind(jatom)
144 IF (use_cell_mapping)
THEN
145 ic = cell_to_index(cell(1), cell(2), cell(3))
150 hmat => h_matrix(ic)%matrix
152 ALLOCATE (int3(nba, nbb))
154 ALLOCATE (hs_work(nba, nbb))
155 IF (iatom == jatom .AND. dab < lri_env%delta)
THEN
158 vi(1:nfa) = lri_v_int(ikind)%v_int(atom_a, 1:nfa)
162 vi(1:nfa) = lri_v_int(ikind)%v_int(atom_a, 1:nfa)
163 vi(nfa + 1:nn) = lri_v_int(jkind)%v_int(atom_b, 1:nfb)
165 isn = sum(lrii%sn(1:nm)*vi(1:nm))/lrii%nsn
166 vi(1:nm) = matmul(lrii%sinv(1:nm, 1:nm), vi(1:nm)) - isn*lrii%sn(1:nm)
167 hs_work(1:nba, 1:nbb) = isn*lrii%soo(1:nba, 1:nbb)
168 IF (iatom == jatom .AND. dab < lri_env%delta)
THEN
171 hs_work(1:nba, 1:nbb) = hs_work(1:nba, 1:nbb) + vi(i)*int3(1:nba, 1:nbb)
176 hs_work(1:nba, 1:nbb) = hs_work(1:nba, 1:nbb) + vi(i)*int3(1:nba, 1:nbb)
180 hs_work(1:nba, 1:nbb) = hs_work(1:nba, 1:nbb) + vi(nfa + i)*int3(1:nba, 1:nbb)
187 ALLOCATE (hf_work(nba, nbb), wab(nba, nbb), wbb(nba, nbb))
188 wab(1:nba, 1:nbb) = lri_env%wmat(ikind, jkind)%mat(1:nba, 1:nbb)
189 wbb(1:nba, 1:nbb) = 1.0_dp - lri_env%wmat(ikind, jkind)%mat(1:nba, 1:nbb)
191 ALLOCATE (via(nfa), vib(nfb))
192 via(1:nfa) = lri_v_int(ikind)%v_int(atom_a, 1:nfa)
193 vib(1:nfb) = lri_v_int(jkind)%v_int(atom_b, 1:nfb)
195 isna = sum(lrii%sna(1:nfa)*via(1:nfa))/lrii%nsna
196 isnb = sum(lrii%snb(1:nfb)*vib(1:nfb))/lrii%nsnb
197 via(1:nfa) = matmul(lrii%asinv(1:nfa, 1:nfa), via(1:nfa)) - isna*lrii%sna(1:nfa)
198 vib(1:nfb) = matmul(lrii%bsinv(1:nfb, 1:nfb), vib(1:nfb)) - isnb*lrii%snb(1:nfb)
200 hf_work(1:nba, 1:nbb) = (isna*wab(1:nba, 1:nbb) + isnb*wbb(1:nba, 1:nbb))*lrii%soo(1:nba, 1:nbb)
203 IF (lrii%abascr(i) > threshold)
THEN
205 hf_work(1:nba, 1:nbb) = hf_work(1:nba, 1:nbb) + &
206 via(i)*int3(1:nba, 1:nbb)*wab(1:nba, 1:nbb)
210 IF (lrii%abbscr(i) > threshold)
THEN
212 hf_work(1:nba, 1:nbb) = hf_work(1:nba, 1:nbb) + &
213 vib(i)*int3(1:nba, 1:nbb)*wbb(1:nba, 1:nbb)
217 DEALLOCATE (via, vib, wab, wbb)
222 IF (iatom <= jatom)
THEN
234 IF (.NOT.
ASSOCIATED(h_block))
THEN
241 h_block(1:nbb, 1:nba) = h_block(1:nbb, 1:nba) + fw*transpose(hs_work(1:nba, 1:nbb))
243 h_block(1:nba, 1:nbb) = h_block(1:nba, 1:nbb) + fw*hs_work(1:nba, 1:nbb)
249 h_block(1:nbb, 1:nba) = h_block(1:nbb, 1:nba) + fw*transpose(hf_work(1:nba, 1:nbb))
251 h_block(1:nba, 1:nbb) = h_block(1:nba, 1:nbb) + fw*hf_work(1:nba, 1:nbb)
256 IF (lrii%lrisr)
DEALLOCATE (hs_work)
257 IF (lrii%lriff)
DEALLOCATE (hf_work)
261 DO ic = 1,
SIZE(h_matrix, 1)
269 CALL timestop(handle)
284 atomic_kind_set, ispin)
288 TYPE(
dbcsr_type),
POINTER :: h_matrix, s_matrix
290 INTEGER,
INTENT(IN) :: ispin
292 CHARACTER(*),
PARAMETER :: routinen =
'calculate_ri_ks_matrix'
294 INTEGER :: atom_a, handle, i1, i2, iatom, ikind, n, &
296 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, kind_of, nsize
297 INTEGER,
DIMENSION(:, :),
POINTER :: bas_ptr
298 REAL(kind=
dp) :: fscal, ftrm1n
299 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: fout, fvec
300 REAL(kind=
dp),
DIMENSION(:),
POINTER :: v
303 CALL timeset(routinen, handle)
305 bas_ptr => lri_env%ri_fit%bas_ptr
306 natom =
SIZE(bas_ptr, 2)
307 nbas = bas_ptr(2, natom)
308 ALLOCATE (fvec(nbas), fout(nbas))
311 ikind = kind_of(iatom)
312 atom_a = atom_of_kind(iatom)
313 i1 = bas_ptr(1, iatom)
314 i2 = bas_ptr(2, iatom)
316 fvec(i1:i2) = lri_v_int(ikind)%v_int(atom_a, 1:n)
319 ftrm1n = sum(fvec(:)*lri_env%ri_fit%rm1n(:))
320 lri_env%ri_fit%ftrm1n(ispin) = ftrm1n
321 fscal = ftrm1n/lri_env%ri_fit%ntrm1n
323 fvec(:) = fvec(:) - fscal*lri_env%ri_fit%nvec(:)
328 matp=lri_env%ri_sinv(1)%matrix, &
329 solver=lri_env%ri_sinv_app, &
331 lri_env%ri_fit%fout(:, ispin) = fout(:)
334 CALL dbcsr_add(h_matrix, s_matrix, 1.0_dp, fscal)
337 ALLOCATE (nsize(natom), o3c_vec(natom))
339 i1 = bas_ptr(1, iatom)
340 i2 = bas_ptr(2, iatom)
347 i1 = bas_ptr(1, iatom)
348 i2 = bas_ptr(2, iatom)
357 DEALLOCATE (o3c_vec, fvec, fout)
359 CALL timestop(handle)