(git:374b731)
Loading...
Searching...
No Matches
se_fock_matrix_integrals.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Provides the low level routines to build both the exchange and the
10!> Coulomb Fock matrices.. This routines support d-orbitals and should
11!> be changed only if one knows exactly what he is doing..
12!> \author Teodoro Laino [tlaino] (05.2009) - Split and module reorganization
13!> \par History
14!> Teodoro Laino (04.2008) [tlaino] - University of Zurich : d-orbitals
15!> Teodoro Laino (09.2008) [tlaino] - University of Zurich : Speed-up
16!> Teodoro Laino (09.2008) [tlaino] - University of Zurich : Periodic SE
17! **************************************************************************************************
19
20 USE kinds, ONLY: dp
23 drotnuc, &
24 rotint, &
25 rotnuc
30#include "./base/base_uses.f90"
31
32
33 IMPLICIT NONE
34 PRIVATE
35
36 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'se_fock_matrix_integrals'
37 LOGICAL, PARAMETER, PRIVATE :: debug_this_module = .false.
38
42
43CONTAINS
44
45! **************************************************************************************************
46!> \brief Construction of 2-center 1-electron Fock Matrix
47!> \param sepi ...
48!> \param sepj ...
49!> \param rij ...
50!> \param ksi_block DIMENSION(sepi%natorb, sepi%natorb)
51!> \param ksj_block DIMENSION(sepi%natorb, sepi%natorb)
52!> \param pi_block ...
53!> \param pj_block ...
54!> \param ecore ...
55!> \param itype ...
56!> \param anag ...
57!> \param se_int_control ...
58!> \param se_taper ...
59!> \param store_int_env ...
60!> \date 04.2008 [tlaino]
61!> \author Teodoro Laino [tlaino] - University of Zurich
62! **************************************************************************************************
63 SUBROUTINE fock2_1el(sepi, sepj, rij, ksi_block, ksj_block, pi_block, pj_block, &
64 ecore, itype, anag, se_int_control, se_taper, store_int_env)
65 TYPE(semi_empirical_type), POINTER :: sepi, sepj
66 REAL(kind=dp), DIMENSION(3), INTENT(IN) :: rij
67 REAL(kind=dp), DIMENSION(:, :), POINTER :: ksi_block, ksj_block
68 REAL(kind=dp), &
69 DIMENSION(sepi%natorb, sepi%natorb), INTENT(IN) :: pi_block
70 REAL(kind=dp), &
71 DIMENSION(sepj%natorb, sepj%natorb), INTENT(IN) :: pj_block
72 REAL(kind=dp), DIMENSION(2), INTENT(INOUT) :: ecore
73 INTEGER, INTENT(IN) :: itype
74 LOGICAL, INTENT(IN) :: anag
75 TYPE(se_int_control_type), INTENT(IN) :: se_int_control
76 TYPE(se_taper_type), POINTER :: se_taper
77 TYPE(semi_empirical_si_type), POINTER :: store_int_env
78
79 INTEGER :: i1, i1l, i2, j1, j1l
80 REAL(kind=dp), DIMENSION(45) :: e1b, e2a
81
82! Compute integrals
83
84 CALL rotnuc(sepi, sepj, rij, e1b=e1b, e2a=e2a, itype=itype, anag=anag, &
85 se_int_control=se_int_control, se_taper=se_taper, store_int_env=store_int_env)
86 !
87 ! Add the electron-nuclear attraction term for atom sepi
88 !
89 i2 = 0
90 DO i1l = 1, sepi%natorb
91 i1 = se_orbital_pointer(i1l)
92 DO j1l = 1, i1l - 1
93 j1 = se_orbital_pointer(j1l)
94 i2 = i2 + 1
95 ksi_block(i1, j1) = ksi_block(i1, j1) + e1b(i2)
96 ksi_block(j1, i1) = ksi_block(i1, j1)
97 ecore(1) = ecore(1) + 2.0_dp*e1b(i2)*pi_block(i1, j1)
98 END DO
99 j1 = se_orbital_pointer(j1l)
100 i2 = i2 + 1
101 ksi_block(i1, j1) = ksi_block(i1, j1) + e1b(i2)
102 ecore(1) = ecore(1) + e1b(i2)*pi_block(i1, j1)
103 END DO
104 !
105 ! Add the electron-nuclear attraction term for atom sepj
106 !
107 i2 = 0
108 DO i1l = 1, sepj%natorb
109 i1 = se_orbital_pointer(i1l)
110 DO j1l = 1, i1l - 1
111 j1 = se_orbital_pointer(j1l)
112 i2 = i2 + 1
113 ksj_block(i1, j1) = ksj_block(i1, j1) + e2a(i2)
114 ksj_block(j1, i1) = ksj_block(i1, j1)
115 ecore(2) = ecore(2) + 2.0_dp*e2a(i2)*pj_block(i1, j1)
116 END DO
117 j1 = se_orbital_pointer(j1l)
118 i2 = i2 + 1
119 ksj_block(i1, j1) = ksj_block(i1, j1) + e2a(i2)
120 ecore(2) = ecore(2) + e2a(i2)*pj_block(i1, j1)
121 END DO
122
123 END SUBROUTINE fock2_1el
124
125! **************************************************************************************************
126!> \brief Derivatives of 2-center 1-electron Fock Matrix
127!> \param sepi ...
128!> \param sepj ...
129!> \param rij ...
130!> \param pi_block ...
131!> \param pj_block ...
132!> \param itype ...
133!> \param anag ...
134!> \param se_int_control ...
135!> \param se_taper ...
136!> \param force ...
137!> \param delta ...
138!> \date 04.2008 [tlaino]
139!> \author Teodoro Laino [tlaino] - University of Zurich
140! **************************************************************************************************
141 SUBROUTINE dfock2_1el(sepi, sepj, rij, pi_block, pj_block, itype, anag, &
142 se_int_control, se_taper, force, delta)
143 TYPE(semi_empirical_type), POINTER :: sepi, sepj
144 REAL(kind=dp), DIMENSION(3), INTENT(IN) :: rij
145 REAL(kind=dp), &
146 DIMENSION(sepi%natorb, sepi%natorb), INTENT(IN) :: pi_block
147 REAL(kind=dp), &
148 DIMENSION(sepj%natorb, sepj%natorb), INTENT(IN) :: pj_block
149 INTEGER, INTENT(IN) :: itype
150 LOGICAL, INTENT(IN) :: anag
151 TYPE(se_int_control_type), INTENT(IN) :: se_int_control
152 TYPE(se_taper_type), POINTER :: se_taper
153 REAL(kind=dp), DIMENSION(3), INTENT(INOUT) :: force
154 REAL(kind=dp), INTENT(IN) :: delta
155
156 INTEGER :: i1, i1l, i2, j1, j1l
157 REAL(kind=dp) :: tmp
158 REAL(kind=dp), DIMENSION(3, 45) :: de1b, de2a
159
160! Compute integrals
161
162 CALL drotnuc(sepi, sepj, rij, de1b=de1b, de2a=de2a, itype=itype, anag=anag, &
163 se_int_control=se_int_control, se_taper=se_taper, delta=delta)
164 !
165 ! Add the electron-nuclear attraction term for atom sepi
166 !
167 i2 = 0
168 DO i1l = 1, sepi%natorb
169 i1 = se_orbital_pointer(i1l)
170 DO j1l = 1, i1l - 1
171 j1 = se_orbital_pointer(j1l)
172 i2 = i2 + 1
173 tmp = 2.0_dp*pi_block(i1, j1)
174 force(1) = force(1) + de1b(1, i2)*tmp
175 force(2) = force(2) + de1b(2, i2)*tmp
176 force(3) = force(3) + de1b(3, i2)*tmp
177 END DO
178 j1 = se_orbital_pointer(j1l)
179 i2 = i2 + 1
180 force(1) = force(1) + de1b(1, i2)*pi_block(i1, j1)
181 force(2) = force(2) + de1b(2, i2)*pi_block(i1, j1)
182 force(3) = force(3) + de1b(3, i2)*pi_block(i1, j1)
183 END DO
184 !
185 ! Add the electron-nuclear attraction term for atom sepj
186 !
187 i2 = 0
188 DO i1l = 1, sepj%natorb
189 i1 = se_orbital_pointer(i1l)
190 DO j1l = 1, i1l - 1
191 j1 = se_orbital_pointer(j1l)
192 i2 = i2 + 1
193 tmp = 2.0_dp*pj_block(i1, j1)
194 force(1) = force(1) + de2a(1, i2)*tmp
195 force(2) = force(2) + de2a(2, i2)*tmp
196 force(3) = force(3) + de2a(3, i2)*tmp
197 END DO
198 j1 = se_orbital_pointer(j1l)
199 i2 = i2 + 1
200 force(1) = force(1) + de2a(1, i2)*pj_block(i1, j1)
201 force(2) = force(2) + de2a(2, i2)*pj_block(i1, j1)
202 force(3) = force(3) + de2a(3, i2)*pj_block(i1, j1)
203 END DO
204
205 END SUBROUTINE dfock2_1el
206
207! **************************************************************************************************
208!> \brief Construction of 1-center 2-electron Fock Matrix
209!> \param sep ...
210!> \param p_tot ...
211!> \param p_mat ...
212!> \param f_mat DIMENSION(sep%natorb, sep%natorb)
213!> \param factor ...
214!> \date 04.2008 [tlaino]
215!> \author Teodoro Laino [tlaino] - University of Zurich
216! **************************************************************************************************
217 SUBROUTINE fock1_2el(sep, p_tot, p_mat, f_mat, factor)
218 TYPE(semi_empirical_type), POINTER :: sep
219 REAL(kind=dp), DIMENSION(45, 45), INTENT(IN) :: p_tot
220 REAL(kind=dp), DIMENSION(sep%natorb, sep%natorb), &
221 INTENT(IN) :: p_mat
222 REAL(kind=dp), DIMENSION(:, :), POINTER :: f_mat
223 REAL(kind=dp), INTENT(IN) :: factor
224
225 INTEGER :: i, ijw, ikw, il, im, j, jl, jlw, jm, k, &
226 kl, klw, l, ll
227 REAL(kind=dp) :: sum
228
229! One-center coulomb and exchange terms for semiempirical_type sep
230!
231! F(i,j)=F(i,j)+sum(k,l)((PA(k,l)+PB(k,l))*<i,j|k,l>
232! -(PA(k,l) )*<i,k|j,l>), k,l on type sep.
233!
234
235 DO il = 1, sep%natorb
236 i = se_orbital_pointer(il)
237 DO jl = 1, il
238 j = se_orbital_pointer(jl)
239
240 ! `J' Address IJ in W
241 ijw = (il*(il - 1))/2 + jl
242 sum = 0.0_dp
243 DO kl = 1, sep%natorb
244 k = se_orbital_pointer(kl)
245 DO ll = 1, sep%natorb
246 l = se_orbital_pointer(ll)
247
248 ! `J' Address KL in W
249 im = max(kl, ll)
250 jm = min(kl, ll)
251 klw = (im*(im - 1))/2 + jm
252
253 ! `K' Address IK in W
254 im = max(kl, jl)
255 jm = min(kl, jl)
256 ikw = (im*(im - 1))/2 + jm
257
258 ! `K' Address JL in W
259 im = max(ll, il)
260 jm = min(ll, il)
261 jlw = (im*(im - 1))/2 + jm
262
263 sum = sum + p_tot(k, l)*sep%w(ijw, klw) - p_mat(k, l)*sep%w(ikw, jlw)
264 END DO
265 END DO
266 f_mat(i, j) = f_mat(i, j) + factor*sum
267 f_mat(j, i) = f_mat(i, j)
268 END DO
269 END DO
270 END SUBROUTINE fock1_2el
271
272! **************************************************************************************************
273!> \brief Construction of 2-center 1-electron Fock Matrix (Ewald self term)
274!> \param sep ...
275!> \param rij ...
276!> \param ks_block DIMENSION(sep%natorb, sep%natorb)
277!> \param p_block ...
278!> \param ecore ...
279!> \param itype ...
280!> \param anag ...
281!> \param se_int_control ...
282!> \param se_taper ...
283!> \param store_int_env ...
284!> \date 04.2009 [jgh]
285!> \author jgh - University of Zurich
286! **************************************************************************************************
287 SUBROUTINE fock2_1el_ew(sep, rij, ks_block, p_block, ecore, itype, anag, &
288 se_int_control, se_taper, store_int_env)
289 TYPE(semi_empirical_type), POINTER :: sep
290 REAL(kind=dp), DIMENSION(3), INTENT(IN) :: rij
291 REAL(kind=dp), DIMENSION(:, :), POINTER :: ks_block
292 REAL(kind=dp), DIMENSION(sep%natorb, sep%natorb), &
293 INTENT(IN) :: p_block
294 REAL(kind=dp), INTENT(INOUT) :: ecore
295 INTEGER, INTENT(IN) :: itype
296 LOGICAL, INTENT(IN) :: anag
297 TYPE(se_int_control_type), INTENT(IN) :: se_int_control
298 TYPE(se_taper_type), POINTER :: se_taper
299 TYPE(semi_empirical_si_type), POINTER :: store_int_env
300
301 INTEGER :: i1, i1l, i2, j1, j1l, n
302 REAL(kind=dp), DIMENSION(45) :: e1b, e2a
303
304! Compute integrals
305
306 CALL rotnuc(sep, sep, rij, e1b=e1b, e2a=e2a, itype=itype, anag=anag, &
307 se_int_control=se_int_control, se_taper=se_taper, store_int_env=store_int_env)
308 !
309 ! Add the electron-nuclear attraction term for atom sep
310 ! e1b == e2a
311 !
312 n = (sep%natorb*(sep%natorb + 1))/2
313 i2 = 0
314 DO i1l = 1, sep%natorb
315 i1 = se_orbital_pointer(i1l)
316 DO j1l = 1, i1l - 1
317 j1 = se_orbital_pointer(j1l)
318 i2 = i2 + 1
319 ks_block(i1, j1) = ks_block(i1, j1) + e1b(i2)
320 ks_block(j1, i1) = ks_block(i1, j1)
321 ecore = ecore + 2._dp*e1b(i2)*p_block(i1, j1)
322 END DO
323 ! i1L == j1L
324 i2 = i2 + 1
325 ks_block(i1, i1) = ks_block(i1, i1) + e1b(i2)
326 ecore = ecore + e1b(i2)*p_block(i1, i1)
327 END DO
328
329 END SUBROUTINE fock2_1el_ew
330
331! **************************************************************************************************
332!> \brief Construction of 2-center Fock Matrix - Coulomb Self Terms (Ewald)
333!> \param sep ...
334!> \param rij ...
335!> \param p_tot ...
336!> \param f_mat DIMENSION(sep%natorb, sep%natorb)
337!> \param factor ...
338!> \param anag ...
339!> \param se_int_control ...
340!> \param se_taper ...
341!> \param store_int_env ...
342!> \date 04.2009 [jgh]
343!> \author jgh - University of Zurich
344! **************************************************************************************************
345 SUBROUTINE fock2c_ew(sep, rij, p_tot, f_mat, factor, anag, se_int_control, &
346 se_taper, store_int_env)
347 TYPE(semi_empirical_type), POINTER :: sep
348 REAL(kind=dp), DIMENSION(3), INTENT(IN) :: rij
349 REAL(kind=dp), DIMENSION(45, 45), INTENT(IN) :: p_tot
350 REAL(kind=dp), DIMENSION(:, :), POINTER :: f_mat
351 REAL(kind=dp), INTENT(IN) :: factor
352 LOGICAL, INTENT(IN) :: anag
353 TYPE(se_int_control_type), INTENT(IN) :: se_int_control
354 TYPE(se_taper_type), POINTER :: se_taper
355 TYPE(semi_empirical_si_type), POINTER :: store_int_env
356
357 INTEGER :: i, il, j, jl, k, kl, kr, l, ll, natorb
358 REAL(kind=dp) :: a, aa, bb
359 REAL(kind=dp), DIMENSION(2025) :: w
360
361! Evaluate integrals
362
363 CALL rotint(sep, sep, rij, w, anag=anag, se_int_control=se_int_control, &
364 se_taper=se_taper, store_int_env=store_int_env)
365 kr = 0
366 natorb = sep%natorb
367 DO il = 1, natorb
368 i = se_orbital_pointer(il)
369 aa = 2.0_dp
370 DO jl = 1, il
371 j = se_orbital_pointer(jl)
372 IF (i == j) THEN
373 aa = 1.0_dp
374 END IF
375 DO kl = 1, natorb
376 k = se_orbital_pointer(kl)
377 bb = 2.0_dp
378 DO ll = 1, kl
379 l = se_orbital_pointer(ll)
380 IF (k == l) THEN
381 bb = 1.0_dp
382 END IF
383 kr = kr + 1
384 a = 0.5_dp*w(kr)*factor
385 ! Coulomb
386 f_mat(i, j) = f_mat(i, j) + bb*a*p_tot(k, l)
387 f_mat(k, l) = f_mat(k, l) + aa*a*p_tot(i, j)
388 f_mat(j, i) = f_mat(i, j)
389 f_mat(l, k) = f_mat(k, l)
390 END DO
391 END DO
392 END DO
393 END DO
394
395 END SUBROUTINE fock2c_ew
396
397! **************************************************************************************************
398!> \brief Construction of 2-center Fock Matrix - Coulomb Terms
399!> \param sepi ...
400!> \param sepj ...
401!> \param rij ...
402!> \param switch ...
403!> \param pi_tot ...
404!> \param fi_mat DIMENSION(sepi%natorb, sepi%natorb)
405!> \param pj_tot DIMENSION(sepj%natorb, sepj%natorb)
406!> \param fj_mat ...
407!> \param factor ...
408!> \param anag ...
409!> \param se_int_control ...
410!> \param se_taper ...
411!> \param store_int_env ...
412!> \date 04.2008 [tlaino]
413!> \author Teodoro Laino [tlaino] - University of Zurich
414! **************************************************************************************************
415 SUBROUTINE fock2c(sepi, sepj, rij, switch, pi_tot, fi_mat, pj_tot, fj_mat, &
416 factor, anag, se_int_control, se_taper, store_int_env)
417 TYPE(semi_empirical_type), POINTER :: sepi, sepj
418 REAL(kind=dp), DIMENSION(3), INTENT(IN) :: rij
419 LOGICAL, INTENT(IN) :: switch
420 REAL(kind=dp), DIMENSION(45, 45), INTENT(IN) :: pi_tot
421 REAL(kind=dp), DIMENSION(:, :), POINTER :: fi_mat
422 REAL(kind=dp), DIMENSION(45, 45), INTENT(IN) :: pj_tot
423 REAL(kind=dp), DIMENSION(:, :), POINTER :: fj_mat
424 REAL(kind=dp), INTENT(IN) :: factor
425 LOGICAL, INTENT(IN) :: anag
426 TYPE(se_int_control_type), INTENT(IN) :: se_int_control
427 TYPE(se_taper_type), POINTER :: se_taper
428 TYPE(semi_empirical_si_type), POINTER :: store_int_env
429
430 INTEGER :: i, il, j, jl, k, kl, kr, l, ll, natorb(2)
431 REAL(kind=dp) :: a, aa, bb, irij(3)
432 REAL(kind=dp), DIMENSION(2025) :: w
433
434! Evaluate integrals
435
436 IF (.NOT. switch) THEN
437 CALL rotint(sepi, sepj, rij, w, anag=anag, se_int_control=se_int_control, &
438 se_taper=se_taper, store_int_env=store_int_env)
439 ELSE
440 irij = -rij
441 CALL rotint(sepj, sepi, irij, w, anag=anag, se_int_control=se_int_control, &
442 se_taper=se_taper, store_int_env=store_int_env)
443 END IF
444 kr = 0
445 natorb(1) = sepi%natorb
446 natorb(2) = sepj%natorb
447 IF (switch) THEN
448 natorb(1) = sepj%natorb
449 natorb(2) = sepi%natorb
450 END IF
451 DO il = 1, natorb(1)
452 i = se_orbital_pointer(il)
453 aa = 2.0_dp
454 DO jl = 1, il
455 j = se_orbital_pointer(jl)
456 IF (i == j) THEN
457 aa = 1.0_dp
458 END IF
459 DO kl = 1, natorb(2)
460 k = se_orbital_pointer(kl)
461 bb = 2.0_dp
462 DO ll = 1, kl
463 l = se_orbital_pointer(ll)
464 IF (k == l) THEN
465 bb = 1.0_dp
466 END IF
467 kr = kr + 1
468 a = w(kr)*factor
469 ! Coulomb
470 IF (.NOT. switch) THEN
471 fi_mat(i, j) = fi_mat(i, j) + bb*a*pj_tot(k, l)
472 fj_mat(k, l) = fj_mat(k, l) + aa*a*pi_tot(i, j)
473 fi_mat(j, i) = fi_mat(i, j)
474 fj_mat(l, k) = fj_mat(k, l)
475 ELSE
476 fj_mat(i, j) = fj_mat(i, j) + bb*a*pi_tot(k, l)
477 fi_mat(k, l) = fi_mat(k, l) + aa*a*pj_tot(i, j)
478 fj_mat(j, i) = fj_mat(i, j)
479 fi_mat(l, k) = fi_mat(k, l)
480 END IF
481 END DO
482 END DO
483 END DO
484 END DO
485
486 END SUBROUTINE fock2c
487
488! **************************************************************************************************
489!> \brief Derivatives of 2-center Fock Matrix - Coulomb Terms
490!> \param sepi ...
491!> \param sepj ...
492!> \param rij ...
493!> \param switch ...
494!> \param pi_tot ...
495!> \param pj_tot ...
496!> \param factor ...
497!> \param anag ...
498!> \param se_int_control ...
499!> \param se_taper ...
500!> \param force ...
501!> \param delta ...
502!> \date 04.2008 [tlaino]
503!> \author Teodoro Laino [tlaino] - University of Zurich
504! **************************************************************************************************
505 SUBROUTINE dfock2c(sepi, sepj, rij, switch, pi_tot, pj_tot, factor, anag, &
506 se_int_control, se_taper, force, delta)
507 TYPE(semi_empirical_type), POINTER :: sepi, sepj
508 REAL(kind=dp), DIMENSION(3), INTENT(IN) :: rij
509 LOGICAL, INTENT(IN) :: switch
510 REAL(kind=dp), DIMENSION(45, 45), INTENT(IN) :: pi_tot, pj_tot
511 REAL(kind=dp), INTENT(IN) :: factor
512 LOGICAL, INTENT(IN) :: anag
513 TYPE(se_int_control_type), INTENT(IN) :: se_int_control
514 TYPE(se_taper_type), POINTER :: se_taper
515 REAL(kind=dp), DIMENSION(3), INTENT(INOUT) :: force
516 REAL(kind=dp), INTENT(IN) :: delta
517
518 INTEGER :: i, il, j, jl, k, kl, kr, l, ll, natorb(2)
519 REAL(kind=dp) :: aa, bb, tmp
520 REAL(kind=dp), DIMENSION(3) :: a, irij
521 REAL(kind=dp), DIMENSION(3, 2025) :: dw
522
523! Evaluate integrals' derivatives
524
525 IF (.NOT. switch) THEN
526 CALL drotint(sepi, sepj, rij, dw, delta, anag=anag, se_int_control=se_int_control, &
527 se_taper=se_taper)
528 ELSE
529 irij = -rij
530 CALL drotint(sepj, sepi, irij, dw, delta, anag=anag, se_int_control=se_int_control, &
531 se_taper=se_taper)
532 END IF
533
534 kr = 0
535 natorb(1) = sepi%natorb
536 natorb(2) = sepj%natorb
537 IF (switch) THEN
538 natorb(1) = sepj%natorb
539 natorb(2) = sepi%natorb
540 END IF
541 DO il = 1, natorb(1)
542 i = se_orbital_pointer(il)
543 aa = 2.0_dp
544 DO jl = 1, il
545 j = se_orbital_pointer(jl)
546 IF (i == j) THEN
547 aa = 1.0_dp
548 END IF
549 DO kl = 1, natorb(2)
550 k = se_orbital_pointer(kl)
551 bb = 2.0_dp
552 DO ll = 1, kl
553 l = se_orbital_pointer(ll)
554 IF (k == l) THEN
555 bb = 1.0_dp
556 END IF
557 kr = kr + 1
558 a(1) = dw(1, kr)*factor
559 a(2) = dw(2, kr)*factor
560 a(3) = dw(3, kr)*factor
561 ! Coulomb
562 IF (.NOT. switch) THEN
563 tmp = bb*aa*pj_tot(k, l)*pi_tot(i, j)
564 ELSE
565 tmp = bb*aa*pi_tot(k, l)*pj_tot(i, j)
566 END IF
567 force(1) = force(1) + a(1)*tmp
568 force(2) = force(2) + a(2)*tmp
569 force(3) = force(3) + a(3)*tmp
570 END DO
571 END DO
572 END DO
573 END DO
574 END SUBROUTINE dfock2c
575
576! **************************************************************************************************
577!> \brief Construction of 2-center Fock Matrix - General Driver
578!> \param sepi ...
579!> \param sepj ...
580!> \param rij ...
581!> \param switch ...
582!> \param isize ...
583!> \param pi_mat ...
584!> \param fi_mat DIMENSION(isize(1), isize(2))
585!> \param factor ...
586!> \param anag ...
587!> \param se_int_control ...
588!> \param se_taper ...
589!> \param store_int_env ...
590!> \date 04.2008 [tlaino]
591!> \author Teodoro Laino [tlaino] - University of Zurich
592! **************************************************************************************************
593 SUBROUTINE fock2e(sepi, sepj, rij, switch, isize, pi_mat, fi_mat, factor, &
594 anag, se_int_control, se_taper, store_int_env)
595 TYPE(semi_empirical_type), POINTER :: sepi, sepj
596 REAL(kind=dp), DIMENSION(3), INTENT(IN) :: rij
597 LOGICAL, INTENT(IN) :: switch
598 INTEGER, DIMENSION(2), INTENT(IN) :: isize
599 REAL(kind=dp), DIMENSION(isize(1), isize(2)), &
600 INTENT(IN) :: pi_mat
601 REAL(kind=dp), DIMENSION(:, :), POINTER :: fi_mat
602 REAL(kind=dp), INTENT(IN) :: factor
603 LOGICAL, INTENT(IN) :: anag
604 TYPE(se_int_control_type), INTENT(IN) :: se_int_control
605 TYPE(se_taper_type), POINTER :: se_taper
606 TYPE(semi_empirical_si_type), POINTER :: store_int_env
607
608 INTEGER :: i, il, j, jl, k, kl, kr, l, ll, natorb(2)
609 REAL(kind=dp) :: a, aa, bb, irij(3)
610 REAL(kind=dp), DIMENSION(2025) :: w
611
612! Evaluate integrals
613
614 IF (.NOT. switch) THEN
615 CALL rotint(sepi, sepj, rij, w, anag=anag, se_int_control=se_int_control, &
616 se_taper=se_taper, store_int_env=store_int_env)
617 ELSE
618 irij = -rij
619 CALL rotint(sepj, sepi, irij, w, anag=anag, se_int_control=se_int_control, &
620 se_taper=se_taper, store_int_env=store_int_env)
621 END IF
622 kr = 0
623 natorb(1) = sepi%natorb
624 natorb(2) = sepj%natorb
625 IF (switch) THEN
626 natorb(1) = sepj%natorb
627 natorb(2) = sepi%natorb
628 END IF
629 DO il = 1, natorb(1)
630 i = se_orbital_pointer(il)
631 aa = 2.0_dp
632 DO jl = 1, il
633 j = se_orbital_pointer(jl)
634 IF (i == j) THEN
635 aa = 1.0_dp
636 END IF
637 DO kl = 1, natorb(2)
638 k = se_orbital_pointer(kl)
639 bb = 2.0_dp
640 DO ll = 1, kl
641 l = se_orbital_pointer(ll)
642 IF (k == l) THEN
643 bb = 1.0_dp
644 END IF
645 kr = kr + 1
646 a = w(kr)*factor
647 ! Exchange
648 a = a*aa*bb*0.25_dp
649 fi_mat(i, k) = fi_mat(i, k) - a*pi_mat(j, l)
650 fi_mat(i, l) = fi_mat(i, l) - a*pi_mat(j, k)
651 fi_mat(j, k) = fi_mat(j, k) - a*pi_mat(i, l)
652 fi_mat(j, l) = fi_mat(j, l) - a*pi_mat(i, k)
653 END DO
654 END DO
655 END DO
656 END DO
657
658 END SUBROUTINE fock2e
659
660! **************************************************************************************************
661!> \brief Derivatives of 2-center Fock Matrix - General Driver
662!> \param sepi ...
663!> \param sepj ...
664!> \param rij ...
665!> \param switch ...
666!> \param isize ...
667!> \param pi_mat ...
668!> \param factor ...
669!> \param anag ...
670!> \param se_int_control ...
671!> \param se_taper ...
672!> \param force ...
673!> \param delta ...
674!> \date 04.2008 [tlaino]
675!> \author Teodoro Laino [tlaino] - University of Zurich
676! **************************************************************************************************
677 SUBROUTINE dfock2e(sepi, sepj, rij, switch, isize, pi_mat, factor, anag, &
678 se_int_control, se_taper, force, delta)
679 TYPE(semi_empirical_type), POINTER :: sepi, sepj
680 REAL(kind=dp), DIMENSION(3), INTENT(IN) :: rij
681 LOGICAL, INTENT(IN) :: switch
682 INTEGER, DIMENSION(2), INTENT(IN) :: isize
683 REAL(kind=dp), DIMENSION(isize(1), isize(2)), &
684 INTENT(IN) :: pi_mat
685 REAL(kind=dp), INTENT(IN) :: factor
686 LOGICAL, INTENT(IN) :: anag
687 TYPE(se_int_control_type), INTENT(IN) :: se_int_control
688 TYPE(se_taper_type), POINTER :: se_taper
689 REAL(kind=dp), DIMENSION(3), INTENT(INOUT) :: force
690 REAL(kind=dp), INTENT(IN) :: delta
691
692 INTEGER :: i, il, j, jl, k, kl, kr, l, ll, natorb(2)
693 REAL(kind=dp) :: aa, bb, tmp, tmp1, tmp2, tmp3, tmp4
694 REAL(kind=dp), DIMENSION(3) :: a, irij
695 REAL(kind=dp), DIMENSION(3, 2025) :: dw
696
697! Evaluate integrals' derivatives
698
699 IF (.NOT. switch) THEN
700 CALL drotint(sepi, sepj, rij, dw, delta, anag=anag, se_int_control=se_int_control, &
701 se_taper=se_taper)
702 ELSE
703 irij = -rij
704 CALL drotint(sepj, sepi, irij, dw, delta, anag=anag, se_int_control=se_int_control, &
705 se_taper=se_taper)
706 END IF
707
708 kr = 0
709 natorb(1) = sepi%natorb
710 natorb(2) = sepj%natorb
711 IF (switch) THEN
712 natorb(1) = sepj%natorb
713 natorb(2) = sepi%natorb
714 END IF
715 DO il = 1, natorb(1)
716 i = se_orbital_pointer(il)
717 aa = 2.0_dp
718 DO jl = 1, il
719 j = se_orbital_pointer(jl)
720 IF (i == j) THEN
721 aa = 1.0_dp
722 END IF
723 DO kl = 1, natorb(2)
724 k = se_orbital_pointer(kl)
725 bb = 2.0_dp
726 DO ll = 1, kl
727 l = se_orbital_pointer(ll)
728 IF (k == l) THEN
729 bb = 1.0_dp
730 END IF
731 kr = kr + 1
732 tmp = factor*aa*bb*0.25_dp
733 a(1) = dw(1, kr)*tmp
734 a(2) = dw(2, kr)*tmp
735 a(3) = dw(3, kr)*tmp
736 ! Exchange
737 tmp1 = pi_mat(j, l)*pi_mat(i, k)
738 tmp2 = pi_mat(j, k)*pi_mat(i, l)
739 tmp3 = pi_mat(i, l)*pi_mat(j, k)
740 tmp4 = pi_mat(i, k)*pi_mat(j, l)
741
742 force(1) = force(1) - a(1)*tmp1
743 force(1) = force(1) - a(1)*tmp2
744 force(1) = force(1) - a(1)*tmp3
745 force(1) = force(1) - a(1)*tmp4
746
747 force(2) = force(2) - a(2)*tmp1
748 force(2) = force(2) - a(2)*tmp2
749 force(2) = force(2) - a(2)*tmp3
750 force(2) = force(2) - a(2)*tmp4
751
752 force(3) = force(3) - a(3)*tmp1
753 force(3) = force(3) - a(3)*tmp2
754 force(3) = force(3) - a(3)*tmp3
755 force(3) = force(3) - a(3)*tmp4
756 END DO
757 END DO
758 END DO
759 END DO
760 END SUBROUTINE dfock2e
761
762! **************************************************************************************************
763!> \brief Construction of 2-center 1-electron Fock Matrix for the residual
764!> (1/R^3) integral part
765!> \param sepi ...
766!> \param sepj ...
767!> \param ksi_block DIMENSION(sepi%natorb, sepi%natorb)
768!> \param ksj_block DIMENSION(sepj%natorb, sepj%natorb)
769!> \param pi_block ...
770!> \param pj_block ...
771!> \param e1b ...
772!> \param e2a ...
773!> \param ecore ...
774!> \param rp ...
775!> \date 12.2008 [tlaino]
776!> \author Teodoro Laino [tlaino]
777! **************************************************************************************************
778 SUBROUTINE fock2_1el_r3(sepi, sepj, ksi_block, ksj_block, pi_block, pj_block, &
779 e1b, e2a, ecore, rp)
780 TYPE(semi_empirical_type), POINTER :: sepi, sepj
781 REAL(kind=dp), DIMENSION(:, :), POINTER :: ksi_block, ksj_block
782 REAL(kind=dp), &
783 DIMENSION(sepi%natorb, sepi%natorb), INTENT(IN) :: pi_block
784 REAL(kind=dp), &
785 DIMENSION(sepj%natorb, sepj%natorb), INTENT(IN) :: pj_block
786 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: e1b, e2a
787 REAL(kind=dp), DIMENSION(2), INTENT(INOUT) :: ecore
788 REAL(kind=dp), INTENT(IN) :: rp
789
790 INTEGER :: i1, i1l, i2
791
792!
793! Add the electron-nuclear residual attraction term for atom sepi
794!
795
796 i2 = 0
797 DO i1l = 1, sepi%natorb
798 i2 = i2 + 1
799 i1 = se_orbital_pointer(i1l)
800 ksi_block(i1, i1) = ksi_block(i1, i1) + e1b(i2)*rp
801 ecore(1) = ecore(1) + e1b(i2)*rp*pi_block(i1, i1)
802 END DO
803 !
804 ! Add the electron-nuclear residual attraction term for atom sepj
805 !
806 i2 = 0
807 DO i1l = 1, sepj%natorb
808 i2 = i2 + 1
809 i1 = se_orbital_pointer(i1l)
810 ksj_block(i1, i1) = ksj_block(i1, i1) + e2a(i2)*rp
811 ecore(2) = ecore(2) + e2a(i2)*rp*pj_block(i1, i1)
812 END DO
813
814 END SUBROUTINE fock2_1el_r3
815
816! **************************************************************************************************
817!> \brief Derivatives of 2-center 1-electron Fock Matrix residual (1/R^3)
818!> integral part
819!> \param sepi ...
820!> \param sepj ...
821!> \param drp ...
822!> \param pi_block ...
823!> \param pj_block ...
824!> \param force ...
825!> \param e1b ...
826!> \param e2a ...
827!> \date 12.2008 [tlaino]
828!> \author Teodoro Laino [tlaino]
829! **************************************************************************************************
830 SUBROUTINE dfock2_1el_r3(sepi, sepj, drp, pi_block, pj_block, force, e1b, e2a)
831 TYPE(semi_empirical_type), POINTER :: sepi, sepj
832 REAL(kind=dp), DIMENSION(3), INTENT(IN) :: drp
833 REAL(kind=dp), &
834 DIMENSION(sepi%natorb, sepi%natorb), INTENT(IN) :: pi_block
835 REAL(kind=dp), &
836 DIMENSION(sepj%natorb, sepj%natorb), INTENT(IN) :: pj_block
837 REAL(kind=dp), DIMENSION(3), INTENT(INOUT) :: force
838 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: e1b, e2a
839
840 INTEGER :: i1, i1l, i2
841 REAL(kind=dp) :: tmp
842
843!
844! Add the electron-nuclear residual attraction term for atom sepi
845!
846
847 i2 = 0
848 DO i1l = 1, sepi%natorb
849 i1 = se_orbital_pointer(i1l)
850 i2 = i2 + 1
851 tmp = e1b(i2)*pi_block(i1, i1)
852 force(1) = force(1) + tmp*drp(1)
853 force(2) = force(2) + tmp*drp(2)
854 force(3) = force(3) + tmp*drp(3)
855 END DO
856 !
857 ! Add the electron-nuclear attraction term for atom sepj
858 !
859 i2 = 0
860 DO i1l = 1, sepj%natorb
861 i1 = se_orbital_pointer(i1l)
862 i2 = i2 + 1
863 tmp = e2a(i2)*pj_block(i1, i1)
864 force(1) = force(1) + tmp*drp(1)
865 force(2) = force(2) + tmp*drp(2)
866 force(3) = force(3) + tmp*drp(3)
867 END DO
868
869 END SUBROUTINE dfock2_1el_r3
870
871! **************************************************************************************************
872!> \brief Construction of 2-center Fock Matrix - Coulomb Terms for the residual
873!> (1/R^3) integral part
874!> \param sepi ...
875!> \param sepj ...
876!> \param switch ...
877!> \param pi_tot ...
878!> \param fi_mat DIMENSION(sepi%natorb, sepi%natorb)
879!> \param pj_tot ...
880!> \param fj_mat DIMENSION(sepj%natorb, sepj%natorb)
881!> \param factor ...
882!> \param w ...
883!> \param rp ...
884!> \date 12.2008 [tlaino]
885!> \author Teodoro Laino [tlaino]
886! **************************************************************************************************
887 SUBROUTINE fock2c_r3(sepi, sepj, switch, pi_tot, fi_mat, pj_tot, fj_mat, &
888 factor, w, rp)
889 TYPE(semi_empirical_type), POINTER :: sepi, sepj
890 LOGICAL, INTENT(IN) :: switch
891 REAL(kind=dp), DIMENSION(45, 45), INTENT(IN) :: pi_tot
892 REAL(kind=dp), DIMENSION(:, :), POINTER :: fi_mat
893 REAL(kind=dp), DIMENSION(45, 45), INTENT(IN) :: pj_tot
894 REAL(kind=dp), DIMENSION(:, :), POINTER :: fj_mat
895 REAL(kind=dp), INTENT(IN) :: factor
896 REAL(kind=dp), DIMENSION(81), INTENT(IN) :: w
897 REAL(kind=dp), INTENT(IN) :: rp
898
899 INTEGER :: i, il, ind, j, k, kl, kr, natorb(2)
900 REAL(kind=dp) :: a, w_l(81)
901
902 natorb(1) = sepi%natorb
903 natorb(2) = sepj%natorb
904 IF (switch) THEN
905 natorb(1) = sepj%natorb
906 natorb(2) = sepi%natorb
907 ! Reshuffle the integral array (natural storage order is sepi/sepj)
908 kr = 0
909 DO i = 1, sepj%natorb
910 DO j = 1, sepi%natorb
911 kr = kr + 1
912 ind = (j - 1)*sepj%natorb + i
913 w_l(kr) = w(ind)
914 END DO
915 END DO
916 ELSE
917 w_l = w
918 END IF
919
920 ! Modify the Fock Matrix
921 kr = 0
922 DO il = 1, natorb(1)
923 i = se_orbital_pointer(il)
924 DO kl = 1, natorb(2)
925 k = se_orbital_pointer(kl)
926 kr = kr + 1
927 a = w_l(kr)*factor*rp
928 ! Coulomb
929 IF (.NOT. switch) THEN
930 fi_mat(i, i) = fi_mat(i, i) + a*pj_tot(k, k)
931 fj_mat(k, k) = fj_mat(k, k) + a*pi_tot(i, i)
932 ELSE
933 fj_mat(i, i) = fj_mat(i, i) + a*pi_tot(k, k)
934 fi_mat(k, k) = fi_mat(k, k) + a*pj_tot(i, i)
935 END IF
936 END DO
937 END DO
938
939 END SUBROUTINE fock2c_r3
940
941! **************************************************************************************************
942!> \brief Derivatives of 2-center Fock Matrix - Coulomb Terms for the residual
943!> (1/R^3) integral part
944!> \param sepi ...
945!> \param sepj ...
946!> \param switch ...
947!> \param pi_tot ...
948!> \param pj_tot ...
949!> \param factor ...
950!> \param w ...
951!> \param drp ...
952!> \param force ...
953!> \date 12.2008 [tlaino]
954!> \author Teodoro Laino [tlaino]
955! **************************************************************************************************
956 SUBROUTINE dfock2c_r3(sepi, sepj, switch, pi_tot, pj_tot, factor, w, drp, &
957 force)
958 TYPE(semi_empirical_type), POINTER :: sepi, sepj
959 LOGICAL, INTENT(IN) :: switch
960 REAL(kind=dp), DIMENSION(45, 45), INTENT(IN) :: pi_tot, pj_tot
961 REAL(kind=dp), INTENT(IN) :: factor
962 REAL(kind=dp), DIMENSION(81), INTENT(IN) :: w
963 REAL(kind=dp), DIMENSION(3), INTENT(IN) :: drp
964 REAL(kind=dp), DIMENSION(3), INTENT(INOUT) :: force
965
966 INTEGER :: i, il, ind, j, k, kl, kr, natorb(2)
967 REAL(kind=dp) :: a(3), tmp, w_l(81)
968
969 natorb(1) = sepi%natorb
970 natorb(2) = sepj%natorb
971 IF (switch) THEN
972 natorb(1) = sepj%natorb
973 natorb(2) = sepi%natorb
974 ! Reshuffle the integral array (natural storage order is sepi/sepj)
975 kr = 0
976 DO i = 1, sepj%natorb
977 DO j = 1, sepi%natorb
978 kr = kr + 1
979 ind = (j - 1)*sepj%natorb + i
980 w_l(kr) = w(ind)
981 END DO
982 END DO
983 ELSE
984 w_l = w
985 END IF
986
987 ! Modify the Fock Matrix
988 kr = 0
989 DO il = 1, natorb(1)
990 i = se_orbital_pointer(il)
991 DO kl = 1, natorb(2)
992 k = se_orbital_pointer(kl)
993 kr = kr + 1
994 tmp = w_l(kr)*factor
995 a(1) = tmp*drp(1)
996 a(2) = tmp*drp(2)
997 a(3) = tmp*drp(3)
998 ! Coulomb
999 IF (.NOT. switch) THEN
1000 tmp = pj_tot(k, k)*pi_tot(i, i)
1001 ELSE
1002 tmp = pi_tot(k, k)*pj_tot(i, i)
1003 END IF
1004 force(1) = force(1) + a(1)*tmp
1005 force(2) = force(2) + a(2)*tmp
1006 force(3) = force(3) + a(3)*tmp
1007 END DO
1008 END DO
1009
1010 END SUBROUTINE dfock2c_r3
1011
1012! **************************************************************************************************
1013!> \brief Coulomb interaction multipolar correction
1014!> \param atom_a ...
1015!> \param atom_b ...
1016!> \param my_task ...
1017!> \param do_forces ...
1018!> \param do_efield ...
1019!> \param do_stress ...
1020!> \param charges ...
1021!> \param dipoles ...
1022!> \param quadrupoles ...
1023!> \param force_ab ...
1024!> \param efield0 ...
1025!> \param efield1 ...
1026!> \param efield2 ...
1027!> \param rab2 ...
1028!> \param rab ...
1029!> \param integral_value ...
1030!> \param ptens11 ...
1031!> \param ptens12 ...
1032!> \param ptens13 ...
1033!> \param ptens21 ...
1034!> \param ptens22 ...
1035!> \param ptens23 ...
1036!> \param ptens31 ...
1037!> \param ptens32 ...
1038!> \param ptens33 ...
1039!> \date 05.2009 [tlaino]
1040!> \author Teodoro Laino [tlaino]
1041! **************************************************************************************************
1042 SUBROUTINE se_coulomb_ij_interaction(atom_a, atom_b, my_task, do_forces, do_efield, &
1043 do_stress, charges, dipoles, quadrupoles, force_ab, efield0, efield1, efield2, &
1044 rab2, rab, integral_value, ptens11, ptens12, ptens13, ptens21, ptens22, ptens23, &
1045 ptens31, ptens32, ptens33)
1046 INTEGER, INTENT(IN) :: atom_a, atom_b
1047 LOGICAL, DIMENSION(3) :: my_task
1048 LOGICAL, INTENT(IN) :: do_forces, do_efield, do_stress
1049 REAL(kind=dp), DIMENSION(:), POINTER :: charges
1050 REAL(kind=dp), DIMENSION(:, :), POINTER :: dipoles
1051 REAL(kind=dp), DIMENSION(:, :, :), POINTER :: quadrupoles
1052 REAL(kind=dp), DIMENSION(3), INTENT(OUT) :: force_ab
1053 REAL(kind=dp), DIMENSION(:), POINTER :: efield0
1054 REAL(kind=dp), DIMENSION(:, :), POINTER :: efield1, efield2
1055 REAL(kind=dp), INTENT(IN) :: rab2
1056 REAL(kind=dp), DIMENSION(3), INTENT(IN) :: rab
1057 REAL(kind=dp), INTENT(OUT), OPTIONAL :: integral_value
1058 REAL(kind=dp), INTENT(INOUT) :: ptens11, ptens12, ptens13, ptens21, &
1059 ptens22, ptens23, ptens31, ptens32, &
1060 ptens33
1061
1062 INTEGER :: a, b, c, d, e, i, j, k
1063 LOGICAL :: do_efield0, do_efield1, do_efield2, &
1064 force_eval
1065 LOGICAL, DIMENSION(3) :: do_task
1066 LOGICAL, DIMENSION(3, 3) :: task
1067 REAL(kind=dp) :: ch_i, ch_j, ef0_i, ef0_j, eloc, energy, fac, fac_ij, ir, irab2, r, tij, &
1068 tmp, tmp1, tmp11, tmp12, tmp13, tmp2, tmp21, tmp22, tmp23, tmp31, tmp32, tmp33, tmp_ij, &
1069 tmp_ji
1070 REAL(kind=dp), DIMENSION(0:5) :: f
1071 REAL(kind=dp), DIMENSION(3) :: dp_i, dp_j, ef1_i, ef1_j, fr, tij_a
1072 REAL(kind=dp), DIMENSION(3, 3) :: ef2_i, ef2_j, qp_i, qp_j, tij_ab
1073 REAL(kind=dp), DIMENSION(3, 3, 3) :: tij_abc
1074 REAL(kind=dp), DIMENSION(3, 3, 3, 3) :: tij_abcd
1075 REAL(kind=dp), DIMENSION(3, 3, 3, 3, 3) :: tij_abcde
1076
1077 do_task = my_task
1078 energy = 0.0_dp
1079 DO i = 1, 3
1080 IF (do_task(i)) THEN
1081 SELECT CASE (i)
1082 CASE (1)
1083 do_task(1) = (charges(atom_a) /= 0.0_dp) .OR. (charges(atom_b) /= 0.0_dp)
1084 CASE (2)
1085 do_task(2) = (any(dipoles(:, atom_a) /= 0.0_dp)) .OR. (any(dipoles(:, atom_b) /= 0.0_dp))
1086 CASE (3)
1087 do_task(3) = (any(quadrupoles(:, :, atom_a) /= 0.0_dp)) .OR. (any(quadrupoles(:, :, atom_b) /= 0.0_dp))
1088 END SELECT
1089 END IF
1090 END DO
1091 DO i = 1, 3
1092 DO j = i, 3
1093 task(j, i) = do_task(i) .AND. do_task(j)
1094 task(i, j) = task(j, i)
1095 END DO
1096 END DO
1097 do_efield0 = do_efield .AND. ASSOCIATED(efield0)
1098 do_efield1 = do_efield .AND. ASSOCIATED(efield1)
1099 do_efield2 = do_efield .AND. ASSOCIATED(efield2)
1100
1101 fac_ij = 1.0_dp
1102 IF (atom_a == atom_b) fac_ij = 0.5_dp
1103
1104 ! Compute the Short Range constribution according the task
1105 IF (debug_this_module) THEN
1106 f = huge(0.0_dp)
1107 tij = huge(0.0_dp)
1108 tij_a = huge(0.0_dp)
1109 tij_ab = huge(0.0_dp)
1110 tij_abc = huge(0.0_dp)
1111 tij_abcd = huge(0.0_dp)
1112 tij_abcde = huge(0.0_dp)
1113 END IF
1114 r = sqrt(rab2)
1115 irab2 = 1.0_dp/rab2
1116 ir = 1.0_dp/r
1117
1118 ! Compute the radial function
1119 ! code for point multipole without screening
1120 f(0) = ir
1121 DO i = 1, 5
1122 f(i) = irab2*f(i - 1)
1123 END DO
1124
1125
1126 ! Compute the Tensor components
1127 force_eval = do_stress
1128 IF (task(1, 1)) THEN
1129 tij = f(0)*fac_ij
1130 force_eval = do_forces .OR. do_efield1
1131 END IF
1132 IF (task(2, 2)) force_eval = force_eval .OR. do_efield0
1133 IF (task(1, 2) .OR. force_eval) THEN
1134 force_eval = do_stress
1135 tij_a = -rab*f(1)*fac_ij
1136 IF (task(1, 2)) force_eval = force_eval .OR. do_forces
1137 END IF
1138 IF (task(1, 1)) force_eval = force_eval .OR. do_efield2
1139 IF (task(3, 3)) force_eval = force_eval .OR. do_efield0
1140 IF (task(2, 2) .OR. task(3, 1) .OR. force_eval) THEN
1141 force_eval = do_stress
1142 DO b = 1, 3
1143 DO a = 1, 3
1144 tmp = rab(a)*rab(b)*fac_ij
1145 tij_ab(a, b) = 3.0_dp*tmp*f(2)
1146 IF (a == b) tij_ab(a, b) = tij_ab(a, b) - f(1)*fac_ij
1147 END DO
1148 END DO
1149 IF (task(2, 2) .OR. task(3, 1)) force_eval = force_eval .OR. do_forces
1150 END IF
1151 IF (task(2, 2)) force_eval = force_eval .OR. do_efield2
1152 IF (task(3, 3)) force_eval = force_eval .OR. do_efield1
1153 IF (task(3, 2) .OR. force_eval) THEN
1154 force_eval = do_stress
1155 DO c = 1, 3
1156 DO b = 1, 3
1157 DO a = 1, 3
1158 tmp = rab(a)*rab(b)*rab(c)*fac_ij
1159 tij_abc(a, b, c) = -15.0_dp*tmp*f(3)
1160 tmp = 3.0_dp*f(2)*fac_ij
1161 IF (a == b) tij_abc(a, b, c) = tij_abc(a, b, c) + tmp*rab(c)
1162 IF (a == c) tij_abc(a, b, c) = tij_abc(a, b, c) + tmp*rab(b)
1163 IF (b == c) tij_abc(a, b, c) = tij_abc(a, b, c) + tmp*rab(a)
1164 END DO
1165 END DO
1166 END DO
1167 IF (task(3, 2)) force_eval = force_eval .OR. do_forces
1168 END IF
1169 IF (task(3, 3) .OR. force_eval) THEN
1170 force_eval = do_stress
1171 DO d = 1, 3
1172 DO c = 1, 3
1173 DO b = 1, 3
1174 DO a = 1, 3
1175 tmp = rab(a)*rab(b)*rab(c)*rab(d)*fac_ij
1176 tij_abcd(a, b, c, d) = 105.0_dp*tmp*f(4)
1177 tmp1 = 15.0_dp*f(3)*fac_ij
1178 tmp2 = 3.0_dp*f(2)*fac_ij
1179 IF (a == b) THEN
1180 tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(c)*rab(d)
1181 IF (c == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) + tmp2
1182 END IF
1183 IF (a == c) THEN
1184 tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(b)*rab(d)
1185 IF (b == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) + tmp2
1186 END IF
1187 IF (a == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(b)*rab(c)
1188 IF (b == c) THEN
1189 tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(a)*rab(d)
1190 IF (a == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) + tmp2
1191 END IF
1192 IF (b == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(a)*rab(c)
1193 IF (c == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(a)*rab(b)
1194 END DO
1195 END DO
1196 END DO
1197 END DO
1198 IF (task(3, 3)) force_eval = force_eval .OR. do_forces
1199 END IF
1200 IF (force_eval) THEN
1201 force_eval = do_stress
1202 DO e = 1, 3
1203 DO d = 1, 3
1204 DO c = 1, 3
1205 DO b = 1, 3
1206 DO a = 1, 3
1207 tmp = rab(a)*rab(b)*rab(c)*rab(d)*rab(e)*fac_ij
1208 tij_abcde(a, b, c, d, e) = -945.0_dp*tmp*f(5)
1209 tmp1 = 105.0_dp*f(4)*fac_ij
1210 tmp2 = 15.0_dp*f(3)*fac_ij
1211 IF (a == b) THEN
1212 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(c)*rab(d)*rab(e)
1213 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(e)
1214 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(d)
1215 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(c)
1216 END IF
1217 IF (a == c) THEN
1218 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(b)*rab(d)*rab(e)
1219 IF (b == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(e)
1220 IF (b == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(d)
1221 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(b)
1222 END IF
1223 IF (a == d) THEN
1224 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(b)*rab(c)*rab(e)
1225 IF (b == c) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(e)
1226 IF (b == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(c)
1227 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(b)
1228 END IF
1229 IF (a == e) THEN
1230 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(b)*rab(c)*rab(d)
1231 IF (b == c) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(d)
1232 IF (b == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(c)
1233 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(b)
1234 END IF
1235 IF (b == c) THEN
1236 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(d)*rab(e)
1237 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(a)
1238 END IF
1239 IF (b == d) THEN
1240 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(c)*rab(e)
1241 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(a)
1242 END IF
1243 IF (b == e) THEN
1244 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(c)*rab(d)
1245 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(a)
1246 END IF
1247 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(b)*rab(e)
1248 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(b)*rab(d)
1249 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(b)*rab(c)
1250 END DO
1251 END DO
1252 END DO
1253 END DO
1254 END DO
1255 END IF
1256 eloc = 0.0_dp
1257 fr = 0.0_dp
1258 ef0_i = 0.0_dp
1259 ef0_j = 0.0_dp
1260 ef1_j = 0.0_dp
1261 ef1_i = 0.0_dp
1262 ef2_j = 0.0_dp
1263 ef2_i = 0.0_dp
1264
1265
1266 ! Initialize the charge, dipole and quadrupole for atom A and B
1267 IF (debug_this_module) THEN
1268 ch_j = huge(0.0_dp)
1269 ch_i = huge(0.0_dp)
1270 dp_j = huge(0.0_dp)
1271 dp_i = huge(0.0_dp)
1272 qp_j = huge(0.0_dp)
1273 qp_i = huge(0.0_dp)
1274 END IF
1275 IF (any(task(1, :))) THEN
1276 ch_j = charges(atom_a)
1277 ch_i = charges(atom_b)
1278 END IF
1279 IF (any(task(2, :))) THEN
1280 dp_j = dipoles(:, atom_a)
1281 dp_i = dipoles(:, atom_b)
1282 END IF
1283 IF (any(task(3, :))) THEN
1284 qp_j = quadrupoles(:, :, atom_a)
1285 qp_i = quadrupoles(:, :, atom_b)
1286 END IF
1287 IF (task(1, 1)) THEN
1288 ! Charge - Charge
1289 eloc = eloc + ch_i*tij*ch_j
1290 ! Forces on particle i (locally b)
1291 IF (do_forces .OR. do_stress) THEN
1292 fr(1) = fr(1) - ch_j*tij_a(1)*ch_i
1293 fr(2) = fr(2) - ch_j*tij_a(2)*ch_i
1294 fr(3) = fr(3) - ch_j*tij_a(3)*ch_i
1295 END IF
1296 ! Electric fields
1297 IF (do_efield) THEN
1298 ! Potential
1299 IF (do_efield0) THEN
1300 ef0_i = ef0_i + tij*ch_j
1301
1302 ef0_j = ef0_j + tij*ch_i
1303 END IF
1304 ! Electric field
1305 IF (do_efield1) THEN
1306 ef1_i(1) = ef1_i(1) - tij_a(1)*ch_j
1307 ef1_i(2) = ef1_i(2) - tij_a(2)*ch_j
1308 ef1_i(3) = ef1_i(3) - tij_a(3)*ch_j
1309
1310 ef1_j(1) = ef1_j(1) + tij_a(1)*ch_i
1311 ef1_j(2) = ef1_j(2) + tij_a(2)*ch_i
1312 ef1_j(3) = ef1_j(3) + tij_a(3)*ch_i
1313
1314
1315 END IF
1316 ! Electric field gradient
1317 IF (do_efield2) THEN
1318 ef2_i(1, 1) = ef2_i(1, 1) - tij_ab(1, 1)*ch_j
1319 ef2_i(2, 1) = ef2_i(2, 1) - tij_ab(2, 1)*ch_j
1320 ef2_i(3, 1) = ef2_i(3, 1) - tij_ab(3, 1)*ch_j
1321 ef2_i(1, 2) = ef2_i(1, 2) - tij_ab(1, 2)*ch_j
1322 ef2_i(2, 2) = ef2_i(2, 2) - tij_ab(2, 2)*ch_j
1323 ef2_i(3, 2) = ef2_i(3, 2) - tij_ab(3, 2)*ch_j
1324 ef2_i(1, 3) = ef2_i(1, 3) - tij_ab(1, 3)*ch_j
1325 ef2_i(2, 3) = ef2_i(2, 3) - tij_ab(2, 3)*ch_j
1326 ef2_i(3, 3) = ef2_i(3, 3) - tij_ab(3, 3)*ch_j
1327
1328 ef2_j(1, 1) = ef2_j(1, 1) - tij_ab(1, 1)*ch_i
1329 ef2_j(2, 1) = ef2_j(2, 1) - tij_ab(2, 1)*ch_i
1330 ef2_j(3, 1) = ef2_j(3, 1) - tij_ab(3, 1)*ch_i
1331 ef2_j(1, 2) = ef2_j(1, 2) - tij_ab(1, 2)*ch_i
1332 ef2_j(2, 2) = ef2_j(2, 2) - tij_ab(2, 2)*ch_i
1333 ef2_j(3, 2) = ef2_j(3, 2) - tij_ab(3, 2)*ch_i
1334 ef2_j(1, 3) = ef2_j(1, 3) - tij_ab(1, 3)*ch_i
1335 ef2_j(2, 3) = ef2_j(2, 3) - tij_ab(2, 3)*ch_i
1336 ef2_j(3, 3) = ef2_j(3, 3) - tij_ab(3, 3)*ch_i
1337 END IF
1338 END IF
1339 END IF
1340 IF (task(2, 2)) THEN
1341 ! Dipole - Dipole
1342 tmp = -(dp_i(1)*(tij_ab(1, 1)*dp_j(1) + &
1343 tij_ab(2, 1)*dp_j(2) + &
1344 tij_ab(3, 1)*dp_j(3)) + &
1345 dp_i(2)*(tij_ab(1, 2)*dp_j(1) + &
1346 tij_ab(2, 2)*dp_j(2) + &
1347 tij_ab(3, 2)*dp_j(3)) + &
1348 dp_i(3)*(tij_ab(1, 3)*dp_j(1) + &
1349 tij_ab(2, 3)*dp_j(2) + &
1350 tij_ab(3, 3)*dp_j(3)))
1351 eloc = eloc + tmp
1352 ! Forces on particle i (locally b)
1353 IF (do_forces .OR. do_stress) THEN
1354 DO k = 1, 3
1355 fr(k) = fr(k) + dp_i(1)*(tij_abc(1, 1, k)*dp_j(1) + &
1356 tij_abc(2, 1, k)*dp_j(2) + &
1357 tij_abc(3, 1, k)*dp_j(3)) &
1358 + dp_i(2)*(tij_abc(1, 2, k)*dp_j(1) + &
1359 tij_abc(2, 2, k)*dp_j(2) + &
1360 tij_abc(3, 2, k)*dp_j(3)) &
1361 + dp_i(3)*(tij_abc(1, 3, k)*dp_j(1) + &
1362 tij_abc(2, 3, k)*dp_j(2) + &
1363 tij_abc(3, 3, k)*dp_j(3))
1364 END DO
1365 END IF
1366 ! Electric fields
1367 IF (do_efield) THEN
1368 ! Potential
1369 IF (do_efield0) THEN
1370 ef0_i = ef0_i - (tij_a(1)*dp_j(1) + &
1371 tij_a(2)*dp_j(2) + &
1372 tij_a(3)*dp_j(3))
1373
1374 ef0_j = ef0_j + (tij_a(1)*dp_i(1) + &
1375 tij_a(2)*dp_i(2) + &
1376 tij_a(3)*dp_i(3))
1377 END IF
1378 ! Electric field
1379 IF (do_efield1) THEN
1380 ef1_i(1) = ef1_i(1) + (tij_ab(1, 1)*dp_j(1) + &
1381 tij_ab(2, 1)*dp_j(2) + &
1382 tij_ab(3, 1)*dp_j(3))
1383 ef1_i(2) = ef1_i(2) + (tij_ab(1, 2)*dp_j(1) + &
1384 tij_ab(2, 2)*dp_j(2) + &
1385 tij_ab(3, 2)*dp_j(3))
1386 ef1_i(3) = ef1_i(3) + (tij_ab(1, 3)*dp_j(1) + &
1387 tij_ab(2, 3)*dp_j(2) + &
1388 tij_ab(3, 3)*dp_j(3))
1389
1390 ef1_j(1) = ef1_j(1) + (tij_ab(1, 1)*dp_i(1) + &
1391 tij_ab(2, 1)*dp_i(2) + &
1392 tij_ab(3, 1)*dp_i(3))
1393 ef1_j(2) = ef1_j(2) + (tij_ab(1, 2)*dp_i(1) + &
1394 tij_ab(2, 2)*dp_i(2) + &
1395 tij_ab(3, 2)*dp_i(3))
1396 ef1_j(3) = ef1_j(3) + (tij_ab(1, 3)*dp_i(1) + &
1397 tij_ab(2, 3)*dp_i(2) + &
1398 tij_ab(3, 3)*dp_i(3))
1399 END IF
1400 ! Electric field gradient
1401 IF (do_efield2) THEN
1402 ef2_i(1, 1) = ef2_i(1, 1) + (tij_abc(1, 1, 1)*dp_j(1) + &
1403 tij_abc(2, 1, 1)*dp_j(2) + &
1404 tij_abc(3, 1, 1)*dp_j(3))
1405 ef2_i(1, 2) = ef2_i(1, 2) + (tij_abc(1, 1, 2)*dp_j(1) + &
1406 tij_abc(2, 1, 2)*dp_j(2) + &
1407 tij_abc(3, 1, 2)*dp_j(3))
1408 ef2_i(1, 3) = ef2_i(1, 3) + (tij_abc(1, 1, 3)*dp_j(1) + &
1409 tij_abc(2, 1, 3)*dp_j(2) + &
1410 tij_abc(3, 1, 3)*dp_j(3))
1411 ef2_i(2, 1) = ef2_i(2, 1) + (tij_abc(1, 2, 1)*dp_j(1) + &
1412 tij_abc(2, 2, 1)*dp_j(2) + &
1413 tij_abc(3, 2, 1)*dp_j(3))
1414 ef2_i(2, 2) = ef2_i(2, 2) + (tij_abc(1, 2, 2)*dp_j(1) + &
1415 tij_abc(2, 2, 2)*dp_j(2) + &
1416 tij_abc(3, 2, 2)*dp_j(3))
1417 ef2_i(2, 3) = ef2_i(2, 3) + (tij_abc(1, 2, 3)*dp_j(1) + &
1418 tij_abc(2, 2, 3)*dp_j(2) + &
1419 tij_abc(3, 2, 3)*dp_j(3))
1420 ef2_i(3, 1) = ef2_i(3, 1) + (tij_abc(1, 3, 1)*dp_j(1) + &
1421 tij_abc(2, 3, 1)*dp_j(2) + &
1422 tij_abc(3, 3, 1)*dp_j(3))
1423 ef2_i(3, 2) = ef2_i(3, 2) + (tij_abc(1, 3, 2)*dp_j(1) + &
1424 tij_abc(2, 3, 2)*dp_j(2) + &
1425 tij_abc(3, 3, 2)*dp_j(3))
1426 ef2_i(3, 3) = ef2_i(3, 3) + (tij_abc(1, 3, 3)*dp_j(1) + &
1427 tij_abc(2, 3, 3)*dp_j(2) + &
1428 tij_abc(3, 3, 3)*dp_j(3))
1429
1430 ef2_j(1, 1) = ef2_j(1, 1) - (tij_abc(1, 1, 1)*dp_i(1) + &
1431 tij_abc(2, 1, 1)*dp_i(2) + &
1432 tij_abc(3, 1, 1)*dp_i(3))
1433 ef2_j(1, 2) = ef2_j(1, 2) - (tij_abc(1, 1, 2)*dp_i(1) + &
1434 tij_abc(2, 1, 2)*dp_i(2) + &
1435 tij_abc(3, 1, 2)*dp_i(3))
1436 ef2_j(1, 3) = ef2_j(1, 3) - (tij_abc(1, 1, 3)*dp_i(1) + &
1437 tij_abc(2, 1, 3)*dp_i(2) + &
1438 tij_abc(3, 1, 3)*dp_i(3))
1439 ef2_j(2, 1) = ef2_j(2, 1) - (tij_abc(1, 2, 1)*dp_i(1) + &
1440 tij_abc(2, 2, 1)*dp_i(2) + &
1441 tij_abc(3, 2, 1)*dp_i(3))
1442 ef2_j(2, 2) = ef2_j(2, 2) - (tij_abc(1, 2, 2)*dp_i(1) + &
1443 tij_abc(2, 2, 2)*dp_i(2) + &
1444 tij_abc(3, 2, 2)*dp_i(3))
1445 ef2_j(2, 3) = ef2_j(2, 3) - (tij_abc(1, 2, 3)*dp_i(1) + &
1446 tij_abc(2, 2, 3)*dp_i(2) + &
1447 tij_abc(3, 2, 3)*dp_i(3))
1448 ef2_j(3, 1) = ef2_j(3, 1) - (tij_abc(1, 3, 1)*dp_i(1) + &
1449 tij_abc(2, 3, 1)*dp_i(2) + &
1450 tij_abc(3, 3, 1)*dp_i(3))
1451 ef2_j(3, 2) = ef2_j(3, 2) - (tij_abc(1, 3, 2)*dp_i(1) + &
1452 tij_abc(2, 3, 2)*dp_i(2) + &
1453 tij_abc(3, 3, 2)*dp_i(3))
1454 ef2_j(3, 3) = ef2_j(3, 3) - (tij_abc(1, 3, 3)*dp_i(1) + &
1455 tij_abc(2, 3, 3)*dp_i(2) + &
1456 tij_abc(3, 3, 3)*dp_i(3))
1457 END IF
1458 END IF
1459 END IF
1460 IF (task(2, 1)) THEN
1461 ! Dipole - Charge
1462 tmp = ch_j*(tij_a(1)*dp_i(1) + &
1463 tij_a(2)*dp_i(2) + &
1464 tij_a(3)*dp_i(3)) &
1465 - ch_i*(tij_a(1)*dp_j(1) + &
1466 tij_a(2)*dp_j(2) + &
1467 tij_a(3)*dp_j(3))
1468 eloc = eloc + tmp
1469 ! Forces on particle i (locally b)
1470 IF (do_forces .OR. do_stress) THEN
1471 DO k = 1, 3
1472 fr(k) = fr(k) - ch_j*(tij_ab(1, k)*dp_i(1) + &
1473 tij_ab(2, k)*dp_i(2) + &
1474 tij_ab(3, k)*dp_i(3)) &
1475 + ch_i*(tij_ab(1, k)*dp_j(1) + &
1476 tij_ab(2, k)*dp_j(2) + &
1477 tij_ab(3, k)*dp_j(3))
1478 END DO
1479 END IF
1480 END IF
1481 IF (task(3, 3)) THEN
1482 ! Quadrupole - Quadrupole
1483 fac = 1.0_dp/9.0_dp
1484 tmp11 = qp_i(1, 1)*(tij_abcd(1, 1, 1, 1)*qp_j(1, 1) + &
1485 tij_abcd(2, 1, 1, 1)*qp_j(2, 1) + &
1486 tij_abcd(3, 1, 1, 1)*qp_j(3, 1) + &
1487 tij_abcd(1, 2, 1, 1)*qp_j(1, 2) + &
1488 tij_abcd(2, 2, 1, 1)*qp_j(2, 2) + &
1489 tij_abcd(3, 2, 1, 1)*qp_j(3, 2) + &
1490 tij_abcd(1, 3, 1, 1)*qp_j(1, 3) + &
1491 tij_abcd(2, 3, 1, 1)*qp_j(2, 3) + &
1492 tij_abcd(3, 3, 1, 1)*qp_j(3, 3))
1493 tmp21 = qp_i(2, 1)*(tij_abcd(1, 1, 1, 2)*qp_j(1, 1) + &
1494 tij_abcd(2, 1, 1, 2)*qp_j(2, 1) + &
1495 tij_abcd(3, 1, 1, 2)*qp_j(3, 1) + &
1496 tij_abcd(1, 2, 1, 2)*qp_j(1, 2) + &
1497 tij_abcd(2, 2, 1, 2)*qp_j(2, 2) + &
1498 tij_abcd(3, 2, 1, 2)*qp_j(3, 2) + &
1499 tij_abcd(1, 3, 1, 2)*qp_j(1, 3) + &
1500 tij_abcd(2, 3, 1, 2)*qp_j(2, 3) + &
1501 tij_abcd(3, 3, 1, 2)*qp_j(3, 3))
1502 tmp31 = qp_i(3, 1)*(tij_abcd(1, 1, 1, 3)*qp_j(1, 1) + &
1503 tij_abcd(2, 1, 1, 3)*qp_j(2, 1) + &
1504 tij_abcd(3, 1, 1, 3)*qp_j(3, 1) + &
1505 tij_abcd(1, 2, 1, 3)*qp_j(1, 2) + &
1506 tij_abcd(2, 2, 1, 3)*qp_j(2, 2) + &
1507 tij_abcd(3, 2, 1, 3)*qp_j(3, 2) + &
1508 tij_abcd(1, 3, 1, 3)*qp_j(1, 3) + &
1509 tij_abcd(2, 3, 1, 3)*qp_j(2, 3) + &
1510 tij_abcd(3, 3, 1, 3)*qp_j(3, 3))
1511 tmp22 = qp_i(2, 2)*(tij_abcd(1, 1, 2, 2)*qp_j(1, 1) + &
1512 tij_abcd(2, 1, 2, 2)*qp_j(2, 1) + &
1513 tij_abcd(3, 1, 2, 2)*qp_j(3, 1) + &
1514 tij_abcd(1, 2, 2, 2)*qp_j(1, 2) + &
1515 tij_abcd(2, 2, 2, 2)*qp_j(2, 2) + &
1516 tij_abcd(3, 2, 2, 2)*qp_j(3, 2) + &
1517 tij_abcd(1, 3, 2, 2)*qp_j(1, 3) + &
1518 tij_abcd(2, 3, 2, 2)*qp_j(2, 3) + &
1519 tij_abcd(3, 3, 2, 2)*qp_j(3, 3))
1520 tmp32 = qp_i(3, 2)*(tij_abcd(1, 1, 2, 3)*qp_j(1, 1) + &
1521 tij_abcd(2, 1, 2, 3)*qp_j(2, 1) + &
1522 tij_abcd(3, 1, 2, 3)*qp_j(3, 1) + &
1523 tij_abcd(1, 2, 2, 3)*qp_j(1, 2) + &
1524 tij_abcd(2, 2, 2, 3)*qp_j(2, 2) + &
1525 tij_abcd(3, 2, 2, 3)*qp_j(3, 2) + &
1526 tij_abcd(1, 3, 2, 3)*qp_j(1, 3) + &
1527 tij_abcd(2, 3, 2, 3)*qp_j(2, 3) + &
1528 tij_abcd(3, 3, 2, 3)*qp_j(3, 3))
1529 tmp33 = qp_i(3, 3)*(tij_abcd(1, 1, 3, 3)*qp_j(1, 1) + &
1530 tij_abcd(2, 1, 3, 3)*qp_j(2, 1) + &
1531 tij_abcd(3, 1, 3, 3)*qp_j(3, 1) + &
1532 tij_abcd(1, 2, 3, 3)*qp_j(1, 2) + &
1533 tij_abcd(2, 2, 3, 3)*qp_j(2, 2) + &
1534 tij_abcd(3, 2, 3, 3)*qp_j(3, 2) + &
1535 tij_abcd(1, 3, 3, 3)*qp_j(1, 3) + &
1536 tij_abcd(2, 3, 3, 3)*qp_j(2, 3) + &
1537 tij_abcd(3, 3, 3, 3)*qp_j(3, 3))
1538 tmp12 = tmp21
1539 tmp13 = tmp31
1540 tmp23 = tmp32
1541 tmp = tmp11 + tmp12 + tmp13 + &
1542 tmp21 + tmp22 + tmp23 + &
1543 tmp31 + tmp32 + tmp33
1544
1545 eloc = eloc + fac*tmp
1546 ! Forces on particle i (locally b)
1547 IF (do_forces .OR. do_stress) THEN
1548 DO k = 1, 3
1549 tmp11 = qp_i(1, 1)*(tij_abcde(1, 1, 1, 1, k)*qp_j(1, 1) + &
1550 tij_abcde(2, 1, 1, 1, k)*qp_j(2, 1) + &
1551 tij_abcde(3, 1, 1, 1, k)*qp_j(3, 1) + &
1552 tij_abcde(1, 2, 1, 1, k)*qp_j(1, 2) + &
1553 tij_abcde(2, 2, 1, 1, k)*qp_j(2, 2) + &
1554 tij_abcde(3, 2, 1, 1, k)*qp_j(3, 2) + &
1555 tij_abcde(1, 3, 1, 1, k)*qp_j(1, 3) + &
1556 tij_abcde(2, 3, 1, 1, k)*qp_j(2, 3) + &
1557 tij_abcde(3, 3, 1, 1, k)*qp_j(3, 3))
1558 tmp21 = qp_i(2, 1)*(tij_abcde(1, 1, 2, 1, k)*qp_j(1, 1) + &
1559 tij_abcde(2, 1, 2, 1, k)*qp_j(2, 1) + &
1560 tij_abcde(3, 1, 2, 1, k)*qp_j(3, 1) + &
1561 tij_abcde(1, 2, 2, 1, k)*qp_j(1, 2) + &
1562 tij_abcde(2, 2, 2, 1, k)*qp_j(2, 2) + &
1563 tij_abcde(3, 2, 2, 1, k)*qp_j(3, 2) + &
1564 tij_abcde(1, 3, 2, 1, k)*qp_j(1, 3) + &
1565 tij_abcde(2, 3, 2, 1, k)*qp_j(2, 3) + &
1566 tij_abcde(3, 3, 2, 1, k)*qp_j(3, 3))
1567 tmp31 = qp_i(3, 1)*(tij_abcde(1, 1, 3, 1, k)*qp_j(1, 1) + &
1568 tij_abcde(2, 1, 3, 1, k)*qp_j(2, 1) + &
1569 tij_abcde(3, 1, 3, 1, k)*qp_j(3, 1) + &
1570 tij_abcde(1, 2, 3, 1, k)*qp_j(1, 2) + &
1571 tij_abcde(2, 2, 3, 1, k)*qp_j(2, 2) + &
1572 tij_abcde(3, 2, 3, 1, k)*qp_j(3, 2) + &
1573 tij_abcde(1, 3, 3, 1, k)*qp_j(1, 3) + &
1574 tij_abcde(2, 3, 3, 1, k)*qp_j(2, 3) + &
1575 tij_abcde(3, 3, 3, 1, k)*qp_j(3, 3))
1576 tmp22 = qp_i(2, 2)*(tij_abcde(1, 1, 2, 2, k)*qp_j(1, 1) + &
1577 tij_abcde(2, 1, 2, 2, k)*qp_j(2, 1) + &
1578 tij_abcde(3, 1, 2, 2, k)*qp_j(3, 1) + &
1579 tij_abcde(1, 2, 2, 2, k)*qp_j(1, 2) + &
1580 tij_abcde(2, 2, 2, 2, k)*qp_j(2, 2) + &
1581 tij_abcde(3, 2, 2, 2, k)*qp_j(3, 2) + &
1582 tij_abcde(1, 3, 2, 2, k)*qp_j(1, 3) + &
1583 tij_abcde(2, 3, 2, 2, k)*qp_j(2, 3) + &
1584 tij_abcde(3, 3, 2, 2, k)*qp_j(3, 3))
1585 tmp32 = qp_i(3, 2)*(tij_abcde(1, 1, 3, 2, k)*qp_j(1, 1) + &
1586 tij_abcde(2, 1, 3, 2, k)*qp_j(2, 1) + &
1587 tij_abcde(3, 1, 3, 2, k)*qp_j(3, 1) + &
1588 tij_abcde(1, 2, 3, 2, k)*qp_j(1, 2) + &
1589 tij_abcde(2, 2, 3, 2, k)*qp_j(2, 2) + &
1590 tij_abcde(3, 2, 3, 2, k)*qp_j(3, 2) + &
1591 tij_abcde(1, 3, 3, 2, k)*qp_j(1, 3) + &
1592 tij_abcde(2, 3, 3, 2, k)*qp_j(2, 3) + &
1593 tij_abcde(3, 3, 3, 2, k)*qp_j(3, 3))
1594 tmp33 = qp_i(3, 3)*(tij_abcde(1, 1, 3, 3, k)*qp_j(1, 1) + &
1595 tij_abcde(2, 1, 3, 3, k)*qp_j(2, 1) + &
1596 tij_abcde(3, 1, 3, 3, k)*qp_j(3, 1) + &
1597 tij_abcde(1, 2, 3, 3, k)*qp_j(1, 2) + &
1598 tij_abcde(2, 2, 3, 3, k)*qp_j(2, 2) + &
1599 tij_abcde(3, 2, 3, 3, k)*qp_j(3, 2) + &
1600 tij_abcde(1, 3, 3, 3, k)*qp_j(1, 3) + &
1601 tij_abcde(2, 3, 3, 3, k)*qp_j(2, 3) + &
1602 tij_abcde(3, 3, 3, 3, k)*qp_j(3, 3))
1603 tmp12 = tmp21
1604 tmp13 = tmp31
1605 tmp23 = tmp32
1606 fr(k) = fr(k) - fac*(tmp11 + tmp12 + tmp13 + &
1607 tmp21 + tmp22 + tmp23 + &
1608 tmp31 + tmp32 + tmp33)
1609 END DO
1610 END IF
1611 ! Electric field
1612 IF (do_efield) THEN
1613 fac = 1.0_dp/3.0_dp
1614 ! Potential
1615 IF (do_efield0) THEN
1616 ef0_i = ef0_i + fac*(tij_ab(1, 1)*qp_j(1, 1) + &
1617 tij_ab(2, 1)*qp_j(2, 1) + &
1618 tij_ab(3, 1)*qp_j(3, 1) + &
1619 tij_ab(1, 2)*qp_j(1, 2) + &
1620 tij_ab(2, 2)*qp_j(2, 2) + &
1621 tij_ab(3, 2)*qp_j(3, 2) + &
1622 tij_ab(1, 3)*qp_j(1, 3) + &
1623 tij_ab(2, 3)*qp_j(2, 3) + &
1624 tij_ab(3, 3)*qp_j(3, 3))
1625
1626 ef0_j = ef0_j + fac*(tij_ab(1, 1)*qp_i(1, 1) + &
1627 tij_ab(2, 1)*qp_i(2, 1) + &
1628 tij_ab(3, 1)*qp_i(3, 1) + &
1629 tij_ab(1, 2)*qp_i(1, 2) + &
1630 tij_ab(2, 2)*qp_i(2, 2) + &
1631 tij_ab(3, 2)*qp_i(3, 2) + &
1632 tij_ab(1, 3)*qp_i(1, 3) + &
1633 tij_ab(2, 3)*qp_i(2, 3) + &
1634 tij_ab(3, 3)*qp_i(3, 3))
1635 END IF
1636 ! Electric field
1637 IF (do_efield1) THEN
1638 ef1_i(1) = ef1_i(1) - fac*(tij_abc(1, 1, 1)*qp_j(1, 1) + &
1639 tij_abc(2, 1, 1)*qp_j(2, 1) + &
1640 tij_abc(3, 1, 1)*qp_j(3, 1) + &
1641 tij_abc(1, 2, 1)*qp_j(1, 2) + &
1642 tij_abc(2, 2, 1)*qp_j(2, 2) + &
1643 tij_abc(3, 2, 1)*qp_j(3, 2) + &
1644 tij_abc(1, 3, 1)*qp_j(1, 3) + &
1645 tij_abc(2, 3, 1)*qp_j(2, 3) + &
1646 tij_abc(3, 3, 1)*qp_j(3, 3))
1647 ef1_i(2) = ef1_i(2) - fac*(tij_abc(1, 1, 2)*qp_j(1, 1) + &
1648 tij_abc(2, 1, 2)*qp_j(2, 1) + &
1649 tij_abc(3, 1, 2)*qp_j(3, 1) + &
1650 tij_abc(1, 2, 2)*qp_j(1, 2) + &
1651 tij_abc(2, 2, 2)*qp_j(2, 2) + &
1652 tij_abc(3, 2, 2)*qp_j(3, 2) + &
1653 tij_abc(1, 3, 2)*qp_j(1, 3) + &
1654 tij_abc(2, 3, 2)*qp_j(2, 3) + &
1655 tij_abc(3, 3, 2)*qp_j(3, 3))
1656 ef1_i(3) = ef1_i(3) - fac*(tij_abc(1, 1, 3)*qp_j(1, 1) + &
1657 tij_abc(2, 1, 3)*qp_j(2, 1) + &
1658 tij_abc(3, 1, 3)*qp_j(3, 1) + &
1659 tij_abc(1, 2, 3)*qp_j(1, 2) + &
1660 tij_abc(2, 2, 3)*qp_j(2, 2) + &
1661 tij_abc(3, 2, 3)*qp_j(3, 2) + &
1662 tij_abc(1, 3, 3)*qp_j(1, 3) + &
1663 tij_abc(2, 3, 3)*qp_j(2, 3) + &
1664 tij_abc(3, 3, 3)*qp_j(3, 3))
1665
1666 ef1_j(1) = ef1_j(1) + fac*(tij_abc(1, 1, 1)*qp_i(1, 1) + &
1667 tij_abc(2, 1, 1)*qp_i(2, 1) + &
1668 tij_abc(3, 1, 1)*qp_i(3, 1) + &
1669 tij_abc(1, 2, 1)*qp_i(1, 2) + &
1670 tij_abc(2, 2, 1)*qp_i(2, 2) + &
1671 tij_abc(3, 2, 1)*qp_i(3, 2) + &
1672 tij_abc(1, 3, 1)*qp_i(1, 3) + &
1673 tij_abc(2, 3, 1)*qp_i(2, 3) + &
1674 tij_abc(3, 3, 1)*qp_i(3, 3))
1675 ef1_j(2) = ef1_j(2) + fac*(tij_abc(1, 1, 2)*qp_i(1, 1) + &
1676 tij_abc(2, 1, 2)*qp_i(2, 1) + &
1677 tij_abc(3, 1, 2)*qp_i(3, 1) + &
1678 tij_abc(1, 2, 2)*qp_i(1, 2) + &
1679 tij_abc(2, 2, 2)*qp_i(2, 2) + &
1680 tij_abc(3, 2, 2)*qp_i(3, 2) + &
1681 tij_abc(1, 3, 2)*qp_i(1, 3) + &
1682 tij_abc(2, 3, 2)*qp_i(2, 3) + &
1683 tij_abc(3, 3, 2)*qp_i(3, 3))
1684 ef1_j(3) = ef1_j(3) + fac*(tij_abc(1, 1, 3)*qp_i(1, 1) + &
1685 tij_abc(2, 1, 3)*qp_i(2, 1) + &
1686 tij_abc(3, 1, 3)*qp_i(3, 1) + &
1687 tij_abc(1, 2, 3)*qp_i(1, 2) + &
1688 tij_abc(2, 2, 3)*qp_i(2, 2) + &
1689 tij_abc(3, 2, 3)*qp_i(3, 2) + &
1690 tij_abc(1, 3, 3)*qp_i(1, 3) + &
1691 tij_abc(2, 3, 3)*qp_i(2, 3) + &
1692 tij_abc(3, 3, 3)*qp_i(3, 3))
1693 END IF
1694 ! Electric field gradient
1695 IF (do_efield2) THEN
1696 tmp11 = fac*(tij_abcd(1, 1, 1, 1)*qp_j(1, 1) + &
1697 tij_abcd(2, 1, 1, 1)*qp_j(2, 1) + &
1698 tij_abcd(3, 1, 1, 1)*qp_j(3, 1) + &
1699 tij_abcd(1, 2, 1, 1)*qp_j(1, 2) + &
1700 tij_abcd(2, 2, 1, 1)*qp_j(2, 2) + &
1701 tij_abcd(3, 2, 1, 1)*qp_j(3, 2) + &
1702 tij_abcd(1, 3, 1, 1)*qp_j(1, 3) + &
1703 tij_abcd(2, 3, 1, 1)*qp_j(2, 3) + &
1704 tij_abcd(3, 3, 1, 1)*qp_j(3, 3))
1705 tmp12 = fac*(tij_abcd(1, 1, 1, 2)*qp_j(1, 1) + &
1706 tij_abcd(2, 1, 1, 2)*qp_j(2, 1) + &
1707 tij_abcd(3, 1, 1, 2)*qp_j(3, 1) + &
1708 tij_abcd(1, 2, 1, 2)*qp_j(1, 2) + &
1709 tij_abcd(2, 2, 1, 2)*qp_j(2, 2) + &
1710 tij_abcd(3, 2, 1, 2)*qp_j(3, 2) + &
1711 tij_abcd(1, 3, 1, 2)*qp_j(1, 3) + &
1712 tij_abcd(2, 3, 1, 2)*qp_j(2, 3) + &
1713 tij_abcd(3, 3, 1, 2)*qp_j(3, 3))
1714 tmp13 = fac*(tij_abcd(1, 1, 1, 3)*qp_j(1, 1) + &
1715 tij_abcd(2, 1, 1, 3)*qp_j(2, 1) + &
1716 tij_abcd(3, 1, 1, 3)*qp_j(3, 1) + &
1717 tij_abcd(1, 2, 1, 3)*qp_j(1, 2) + &
1718 tij_abcd(2, 2, 1, 3)*qp_j(2, 2) + &
1719 tij_abcd(3, 2, 1, 3)*qp_j(3, 2) + &
1720 tij_abcd(1, 3, 1, 3)*qp_j(1, 3) + &
1721 tij_abcd(2, 3, 1, 3)*qp_j(2, 3) + &
1722 tij_abcd(3, 3, 1, 3)*qp_j(3, 3))
1723 tmp22 = fac*(tij_abcd(1, 1, 2, 2)*qp_j(1, 1) + &
1724 tij_abcd(2, 1, 2, 2)*qp_j(2, 1) + &
1725 tij_abcd(3, 1, 2, 2)*qp_j(3, 1) + &
1726 tij_abcd(1, 2, 2, 2)*qp_j(1, 2) + &
1727 tij_abcd(2, 2, 2, 2)*qp_j(2, 2) + &
1728 tij_abcd(3, 2, 2, 2)*qp_j(3, 2) + &
1729 tij_abcd(1, 3, 2, 2)*qp_j(1, 3) + &
1730 tij_abcd(2, 3, 2, 2)*qp_j(2, 3) + &
1731 tij_abcd(3, 3, 2, 2)*qp_j(3, 3))
1732 tmp23 = fac*(tij_abcd(1, 1, 2, 3)*qp_j(1, 1) + &
1733 tij_abcd(2, 1, 2, 3)*qp_j(2, 1) + &
1734 tij_abcd(3, 1, 2, 3)*qp_j(3, 1) + &
1735 tij_abcd(1, 2, 2, 3)*qp_j(1, 2) + &
1736 tij_abcd(2, 2, 2, 3)*qp_j(2, 2) + &
1737 tij_abcd(3, 2, 2, 3)*qp_j(3, 2) + &
1738 tij_abcd(1, 3, 2, 3)*qp_j(1, 3) + &
1739 tij_abcd(2, 3, 2, 3)*qp_j(2, 3) + &
1740 tij_abcd(3, 3, 2, 3)*qp_j(3, 3))
1741 tmp33 = fac*(tij_abcd(1, 1, 3, 3)*qp_j(1, 1) + &
1742 tij_abcd(2, 1, 3, 3)*qp_j(2, 1) + &
1743 tij_abcd(3, 1, 3, 3)*qp_j(3, 1) + &
1744 tij_abcd(1, 2, 3, 3)*qp_j(1, 2) + &
1745 tij_abcd(2, 2, 3, 3)*qp_j(2, 2) + &
1746 tij_abcd(3, 2, 3, 3)*qp_j(3, 2) + &
1747 tij_abcd(1, 3, 3, 3)*qp_j(1, 3) + &
1748 tij_abcd(2, 3, 3, 3)*qp_j(2, 3) + &
1749 tij_abcd(3, 3, 3, 3)*qp_j(3, 3))
1750
1751 ef2_i(1, 1) = ef2_i(1, 1) - tmp11
1752 ef2_i(1, 2) = ef2_i(1, 2) - tmp12
1753 ef2_i(1, 3) = ef2_i(1, 3) - tmp13
1754 ef2_i(2, 1) = ef2_i(2, 1) - tmp12
1755 ef2_i(2, 2) = ef2_i(2, 2) - tmp22
1756 ef2_i(2, 3) = ef2_i(2, 3) - tmp23
1757 ef2_i(3, 1) = ef2_i(3, 1) - tmp13
1758 ef2_i(3, 2) = ef2_i(3, 2) - tmp23
1759 ef2_i(3, 3) = ef2_i(3, 3) - tmp33
1760
1761 tmp11 = fac*(tij_abcd(1, 1, 1, 1)*qp_i(1, 1) + &
1762 tij_abcd(2, 1, 1, 1)*qp_i(2, 1) + &
1763 tij_abcd(3, 1, 1, 1)*qp_i(3, 1) + &
1764 tij_abcd(1, 2, 1, 1)*qp_i(1, 2) + &
1765 tij_abcd(2, 2, 1, 1)*qp_i(2, 2) + &
1766 tij_abcd(3, 2, 1, 1)*qp_i(3, 2) + &
1767 tij_abcd(1, 3, 1, 1)*qp_i(1, 3) + &
1768 tij_abcd(2, 3, 1, 1)*qp_i(2, 3) + &
1769 tij_abcd(3, 3, 1, 1)*qp_i(3, 3))
1770 tmp12 = fac*(tij_abcd(1, 1, 1, 2)*qp_i(1, 1) + &
1771 tij_abcd(2, 1, 1, 2)*qp_i(2, 1) + &
1772 tij_abcd(3, 1, 1, 2)*qp_i(3, 1) + &
1773 tij_abcd(1, 2, 1, 2)*qp_i(1, 2) + &
1774 tij_abcd(2, 2, 1, 2)*qp_i(2, 2) + &
1775 tij_abcd(3, 2, 1, 2)*qp_i(3, 2) + &
1776 tij_abcd(1, 3, 1, 2)*qp_i(1, 3) + &
1777 tij_abcd(2, 3, 1, 2)*qp_i(2, 3) + &
1778 tij_abcd(3, 3, 1, 2)*qp_i(3, 3))
1779 tmp13 = fac*(tij_abcd(1, 1, 1, 3)*qp_i(1, 1) + &
1780 tij_abcd(2, 1, 1, 3)*qp_i(2, 1) + &
1781 tij_abcd(3, 1, 1, 3)*qp_i(3, 1) + &
1782 tij_abcd(1, 2, 1, 3)*qp_i(1, 2) + &
1783 tij_abcd(2, 2, 1, 3)*qp_i(2, 2) + &
1784 tij_abcd(3, 2, 1, 3)*qp_i(3, 2) + &
1785 tij_abcd(1, 3, 1, 3)*qp_i(1, 3) + &
1786 tij_abcd(2, 3, 1, 3)*qp_i(2, 3) + &
1787 tij_abcd(3, 3, 1, 3)*qp_i(3, 3))
1788 tmp22 = fac*(tij_abcd(1, 1, 2, 2)*qp_i(1, 1) + &
1789 tij_abcd(2, 1, 2, 2)*qp_i(2, 1) + &
1790 tij_abcd(3, 1, 2, 2)*qp_i(3, 1) + &
1791 tij_abcd(1, 2, 2, 2)*qp_i(1, 2) + &
1792 tij_abcd(2, 2, 2, 2)*qp_i(2, 2) + &
1793 tij_abcd(3, 2, 2, 2)*qp_i(3, 2) + &
1794 tij_abcd(1, 3, 2, 2)*qp_i(1, 3) + &
1795 tij_abcd(2, 3, 2, 2)*qp_i(2, 3) + &
1796 tij_abcd(3, 3, 2, 2)*qp_i(3, 3))
1797 tmp23 = fac*(tij_abcd(1, 1, 2, 3)*qp_i(1, 1) + &
1798 tij_abcd(2, 1, 2, 3)*qp_i(2, 1) + &
1799 tij_abcd(3, 1, 2, 3)*qp_i(3, 1) + &
1800 tij_abcd(1, 2, 2, 3)*qp_i(1, 2) + &
1801 tij_abcd(2, 2, 2, 3)*qp_i(2, 2) + &
1802 tij_abcd(3, 2, 2, 3)*qp_i(3, 2) + &
1803 tij_abcd(1, 3, 2, 3)*qp_i(1, 3) + &
1804 tij_abcd(2, 3, 2, 3)*qp_i(2, 3) + &
1805 tij_abcd(3, 3, 2, 3)*qp_i(3, 3))
1806 tmp33 = fac*(tij_abcd(1, 1, 3, 3)*qp_i(1, 1) + &
1807 tij_abcd(2, 1, 3, 3)*qp_i(2, 1) + &
1808 tij_abcd(3, 1, 3, 3)*qp_i(3, 1) + &
1809 tij_abcd(1, 2, 3, 3)*qp_i(1, 2) + &
1810 tij_abcd(2, 2, 3, 3)*qp_i(2, 2) + &
1811 tij_abcd(3, 2, 3, 3)*qp_i(3, 2) + &
1812 tij_abcd(1, 3, 3, 3)*qp_i(1, 3) + &
1813 tij_abcd(2, 3, 3, 3)*qp_i(2, 3) + &
1814 tij_abcd(3, 3, 3, 3)*qp_i(3, 3))
1815
1816 ef2_j(1, 1) = ef2_j(1, 1) - tmp11
1817 ef2_j(1, 2) = ef2_j(1, 2) - tmp12
1818 ef2_j(1, 3) = ef2_j(1, 3) - tmp13
1819 ef2_j(2, 1) = ef2_j(2, 1) - tmp12
1820 ef2_j(2, 2) = ef2_j(2, 2) - tmp22
1821 ef2_j(2, 3) = ef2_j(2, 3) - tmp23
1822 ef2_j(3, 1) = ef2_j(3, 1) - tmp13
1823 ef2_j(3, 2) = ef2_j(3, 2) - tmp23
1824 ef2_j(3, 3) = ef2_j(3, 3) - tmp33
1825 END IF
1826 END IF
1827 END IF
1828 IF (task(3, 2)) THEN
1829 ! Quadrupole - Dipole
1830 fac = 1.0_dp/3.0_dp
1831 ! Dipole i (locally B) - Quadrupole j (locally A)
1832 tmp_ij = dp_i(1)*(tij_abc(1, 1, 1)*qp_j(1, 1) + &
1833 tij_abc(2, 1, 1)*qp_j(2, 1) + &
1834 tij_abc(3, 1, 1)*qp_j(3, 1) + &
1835 tij_abc(1, 2, 1)*qp_j(1, 2) + &
1836 tij_abc(2, 2, 1)*qp_j(2, 2) + &
1837 tij_abc(3, 2, 1)*qp_j(3, 2) + &
1838 tij_abc(1, 3, 1)*qp_j(1, 3) + &
1839 tij_abc(2, 3, 1)*qp_j(2, 3) + &
1840 tij_abc(3, 3, 1)*qp_j(3, 3)) + &
1841 dp_i(2)*(tij_abc(1, 1, 2)*qp_j(1, 1) + &
1842 tij_abc(2, 1, 2)*qp_j(2, 1) + &
1843 tij_abc(3, 1, 2)*qp_j(3, 1) + &
1844 tij_abc(1, 2, 2)*qp_j(1, 2) + &
1845 tij_abc(2, 2, 2)*qp_j(2, 2) + &
1846 tij_abc(3, 2, 2)*qp_j(3, 2) + &
1847 tij_abc(1, 3, 2)*qp_j(1, 3) + &
1848 tij_abc(2, 3, 2)*qp_j(2, 3) + &
1849 tij_abc(3, 3, 2)*qp_j(3, 3)) + &
1850 dp_i(3)*(tij_abc(1, 1, 3)*qp_j(1, 1) + &
1851 tij_abc(2, 1, 3)*qp_j(2, 1) + &
1852 tij_abc(3, 1, 3)*qp_j(3, 1) + &
1853 tij_abc(1, 2, 3)*qp_j(1, 2) + &
1854 tij_abc(2, 2, 3)*qp_j(2, 2) + &
1855 tij_abc(3, 2, 3)*qp_j(3, 2) + &
1856 tij_abc(1, 3, 3)*qp_j(1, 3) + &
1857 tij_abc(2, 3, 3)*qp_j(2, 3) + &
1858 tij_abc(3, 3, 3)*qp_j(3, 3))
1859
1860 ! Dipole j (locally A) - Quadrupole i (locally B)
1861 tmp_ji = dp_j(1)*(tij_abc(1, 1, 1)*qp_i(1, 1) + &
1862 tij_abc(2, 1, 1)*qp_i(2, 1) + &
1863 tij_abc(3, 1, 1)*qp_i(3, 1) + &
1864 tij_abc(1, 2, 1)*qp_i(1, 2) + &
1865 tij_abc(2, 2, 1)*qp_i(2, 2) + &
1866 tij_abc(3, 2, 1)*qp_i(3, 2) + &
1867 tij_abc(1, 3, 1)*qp_i(1, 3) + &
1868 tij_abc(2, 3, 1)*qp_i(2, 3) + &
1869 tij_abc(3, 3, 1)*qp_i(3, 3)) + &
1870 dp_j(2)*(tij_abc(1, 1, 2)*qp_i(1, 1) + &
1871 tij_abc(2, 1, 2)*qp_i(2, 1) + &
1872 tij_abc(3, 1, 2)*qp_i(3, 1) + &
1873 tij_abc(1, 2, 2)*qp_i(1, 2) + &
1874 tij_abc(2, 2, 2)*qp_i(2, 2) + &
1875 tij_abc(3, 2, 2)*qp_i(3, 2) + &
1876 tij_abc(1, 3, 2)*qp_i(1, 3) + &
1877 tij_abc(2, 3, 2)*qp_i(2, 3) + &
1878 tij_abc(3, 3, 2)*qp_i(3, 3)) + &
1879 dp_j(3)*(tij_abc(1, 1, 3)*qp_i(1, 1) + &
1880 tij_abc(2, 1, 3)*qp_i(2, 1) + &
1881 tij_abc(3, 1, 3)*qp_i(3, 1) + &
1882 tij_abc(1, 2, 3)*qp_i(1, 2) + &
1883 tij_abc(2, 2, 3)*qp_i(2, 2) + &
1884 tij_abc(3, 2, 3)*qp_i(3, 2) + &
1885 tij_abc(1, 3, 3)*qp_i(1, 3) + &
1886 tij_abc(2, 3, 3)*qp_i(2, 3) + &
1887 tij_abc(3, 3, 3)*qp_i(3, 3))
1888
1889 tmp = fac*(tmp_ij - tmp_ji)
1890 eloc = eloc + tmp
1891 IF (do_forces .OR. do_stress) THEN
1892 DO k = 1, 3
1893 ! Dipole i (locally B) - Quadrupole j (locally A)
1894 tmp_ij = dp_i(1)*(tij_abcd(1, 1, 1, k)*qp_j(1, 1) + &
1895 tij_abcd(2, 1, 1, k)*qp_j(2, 1) + &
1896 tij_abcd(3, 1, 1, k)*qp_j(3, 1) + &
1897 tij_abcd(1, 2, 1, k)*qp_j(1, 2) + &
1898 tij_abcd(2, 2, 1, k)*qp_j(2, 2) + &
1899 tij_abcd(3, 2, 1, k)*qp_j(3, 2) + &
1900 tij_abcd(1, 3, 1, k)*qp_j(1, 3) + &
1901 tij_abcd(2, 3, 1, k)*qp_j(2, 3) + &
1902 tij_abcd(3, 3, 1, k)*qp_j(3, 3)) + &
1903 dp_i(2)*(tij_abcd(1, 1, 2, k)*qp_j(1, 1) + &
1904 tij_abcd(2, 1, 2, k)*qp_j(2, 1) + &
1905 tij_abcd(3, 1, 2, k)*qp_j(3, 1) + &
1906 tij_abcd(1, 2, 2, k)*qp_j(1, 2) + &
1907 tij_abcd(2, 2, 2, k)*qp_j(2, 2) + &
1908 tij_abcd(3, 2, 2, k)*qp_j(3, 2) + &
1909 tij_abcd(1, 3, 2, k)*qp_j(1, 3) + &
1910 tij_abcd(2, 3, 2, k)*qp_j(2, 3) + &
1911 tij_abcd(3, 3, 2, k)*qp_j(3, 3)) + &
1912 dp_i(3)*(tij_abcd(1, 1, 3, k)*qp_j(1, 1) + &
1913 tij_abcd(2, 1, 3, k)*qp_j(2, 1) + &
1914 tij_abcd(3, 1, 3, k)*qp_j(3, 1) + &
1915 tij_abcd(1, 2, 3, k)*qp_j(1, 2) + &
1916 tij_abcd(2, 2, 3, k)*qp_j(2, 2) + &
1917 tij_abcd(3, 2, 3, k)*qp_j(3, 2) + &
1918 tij_abcd(1, 3, 3, k)*qp_j(1, 3) + &
1919 tij_abcd(2, 3, 3, k)*qp_j(2, 3) + &
1920 tij_abcd(3, 3, 3, k)*qp_j(3, 3))
1921
1922 ! Dipole j (locally A) - Quadrupole i (locally B)
1923 tmp_ji = dp_j(1)*(tij_abcd(1, 1, 1, k)*qp_i(1, 1) + &
1924 tij_abcd(2, 1, 1, k)*qp_i(2, 1) + &
1925 tij_abcd(3, 1, 1, k)*qp_i(3, 1) + &
1926 tij_abcd(1, 2, 1, k)*qp_i(1, 2) + &
1927 tij_abcd(2, 2, 1, k)*qp_i(2, 2) + &
1928 tij_abcd(3, 2, 1, k)*qp_i(3, 2) + &
1929 tij_abcd(1, 3, 1, k)*qp_i(1, 3) + &
1930 tij_abcd(2, 3, 1, k)*qp_i(2, 3) + &
1931 tij_abcd(3, 3, 1, k)*qp_i(3, 3)) + &
1932 dp_j(2)*(tij_abcd(1, 1, 2, k)*qp_i(1, 1) + &
1933 tij_abcd(2, 1, 2, k)*qp_i(2, 1) + &
1934 tij_abcd(3, 1, 2, k)*qp_i(3, 1) + &
1935 tij_abcd(1, 2, 2, k)*qp_i(1, 2) + &
1936 tij_abcd(2, 2, 2, k)*qp_i(2, 2) + &
1937 tij_abcd(3, 2, 2, k)*qp_i(3, 2) + &
1938 tij_abcd(1, 3, 2, k)*qp_i(1, 3) + &
1939 tij_abcd(2, 3, 2, k)*qp_i(2, 3) + &
1940 tij_abcd(3, 3, 2, k)*qp_i(3, 3)) + &
1941 dp_j(3)*(tij_abcd(1, 1, 3, k)*qp_i(1, 1) + &
1942 tij_abcd(2, 1, 3, k)*qp_i(2, 1) + &
1943 tij_abcd(3, 1, 3, k)*qp_i(3, 1) + &
1944 tij_abcd(1, 2, 3, k)*qp_i(1, 2) + &
1945 tij_abcd(2, 2, 3, k)*qp_i(2, 2) + &
1946 tij_abcd(3, 2, 3, k)*qp_i(3, 2) + &
1947 tij_abcd(1, 3, 3, k)*qp_i(1, 3) + &
1948 tij_abcd(2, 3, 3, k)*qp_i(2, 3) + &
1949 tij_abcd(3, 3, 3, k)*qp_i(3, 3))
1950
1951 fr(k) = fr(k) - fac*(tmp_ij - tmp_ji)
1952 END DO
1953 END IF
1954 END IF
1955 IF (task(3, 1)) THEN
1956 ! Quadrupole - Charge
1957 fac = 1.0_dp/3.0_dp
1958
1959 ! Quadrupole j (locally A) - Charge j (locally B)
1960 tmp_ij = ch_i*(tij_ab(1, 1)*qp_j(1, 1) + &
1961 tij_ab(2, 1)*qp_j(2, 1) + &
1962 tij_ab(3, 1)*qp_j(3, 1) + &
1963 tij_ab(1, 2)*qp_j(1, 2) + &
1964 tij_ab(2, 2)*qp_j(2, 2) + &
1965 tij_ab(3, 2)*qp_j(3, 2) + &
1966 tij_ab(1, 3)*qp_j(1, 3) + &
1967 tij_ab(2, 3)*qp_j(2, 3) + &
1968 tij_ab(3, 3)*qp_j(3, 3))
1969
1970 ! Quadrupole i (locally B) - Charge j (locally A)
1971 tmp_ji = ch_j*(tij_ab(1, 1)*qp_i(1, 1) + &
1972 tij_ab(2, 1)*qp_i(2, 1) + &
1973 tij_ab(3, 1)*qp_i(3, 1) + &
1974 tij_ab(1, 2)*qp_i(1, 2) + &
1975 tij_ab(2, 2)*qp_i(2, 2) + &
1976 tij_ab(3, 2)*qp_i(3, 2) + &
1977 tij_ab(1, 3)*qp_i(1, 3) + &
1978 tij_ab(2, 3)*qp_i(2, 3) + &
1979 tij_ab(3, 3)*qp_i(3, 3))
1980
1981 eloc = eloc + fac*(tmp_ij + tmp_ji)
1982 IF (do_forces .OR. do_stress) THEN
1983 DO k = 1, 3
1984 ! Quadrupole j (locally A) - Charge i (locally B)
1985 tmp_ij = ch_i*(tij_abc(1, 1, k)*qp_j(1, 1) + &
1986 tij_abc(2, 1, k)*qp_j(2, 1) + &
1987 tij_abc(3, 1, k)*qp_j(3, 1) + &
1988 tij_abc(1, 2, k)*qp_j(1, 2) + &
1989 tij_abc(2, 2, k)*qp_j(2, 2) + &
1990 tij_abc(3, 2, k)*qp_j(3, 2) + &
1991 tij_abc(1, 3, k)*qp_j(1, 3) + &
1992 tij_abc(2, 3, k)*qp_j(2, 3) + &
1993 tij_abc(3, 3, k)*qp_j(3, 3))
1994
1995 ! Quadrupole i (locally B) - Charge j (locally A)
1996 tmp_ji = ch_j*(tij_abc(1, 1, k)*qp_i(1, 1) + &
1997 tij_abc(2, 1, k)*qp_i(2, 1) + &
1998 tij_abc(3, 1, k)*qp_i(3, 1) + &
1999 tij_abc(1, 2, k)*qp_i(1, 2) + &
2000 tij_abc(2, 2, k)*qp_i(2, 2) + &
2001 tij_abc(3, 2, k)*qp_i(3, 2) + &
2002 tij_abc(1, 3, k)*qp_i(1, 3) + &
2003 tij_abc(2, 3, k)*qp_i(2, 3) + &
2004 tij_abc(3, 3, k)*qp_i(3, 3))
2005
2006 fr(k) = fr(k) - fac*(tmp_ij + tmp_ji)
2007 END DO
2008 END IF
2009 END IF
2010 ! Electric fields
2011 IF (do_efield) THEN
2012 ! Potential
2013 IF (do_efield0) THEN
2014 efield0(atom_a) = efield0(atom_a) + ef0_j
2015
2016 efield0(atom_b) = efield0(atom_b) + ef0_i
2017 END IF
2018 ! Electric field
2019 IF (do_efield1) THEN
2020 efield1(1, atom_a) = efield1(1, atom_a) + ef1_j(1)
2021 efield1(2, atom_a) = efield1(2, atom_a) + ef1_j(2)
2022 efield1(3, atom_a) = efield1(3, atom_a) + ef1_j(3)
2023
2024 efield1(1, atom_b) = efield1(1, atom_b) + ef1_i(1)
2025 efield1(2, atom_b) = efield1(2, atom_b) + ef1_i(2)
2026 efield1(3, atom_b) = efield1(3, atom_b) + ef1_i(3)
2027 END IF
2028 ! Electric field gradient
2029 IF (do_efield2) THEN
2030 efield2(1, atom_a) = efield2(1, atom_a) + ef2_j(1, 1)
2031 efield2(2, atom_a) = efield2(2, atom_a) + ef2_j(1, 2)
2032 efield2(3, atom_a) = efield2(3, atom_a) + ef2_j(1, 3)
2033 efield2(4, atom_a) = efield2(4, atom_a) + ef2_j(2, 1)
2034 efield2(5, atom_a) = efield2(5, atom_a) + ef2_j(2, 2)
2035 efield2(6, atom_a) = efield2(6, atom_a) + ef2_j(2, 3)
2036 efield2(7, atom_a) = efield2(7, atom_a) + ef2_j(3, 1)
2037 efield2(8, atom_a) = efield2(8, atom_a) + ef2_j(3, 2)
2038 efield2(9, atom_a) = efield2(9, atom_a) + ef2_j(3, 3)
2039
2040 efield2(1, atom_b) = efield2(1, atom_b) + ef2_i(1, 1)
2041 efield2(2, atom_b) = efield2(2, atom_b) + ef2_i(1, 2)
2042 efield2(3, atom_b) = efield2(3, atom_b) + ef2_i(1, 3)
2043 efield2(4, atom_b) = efield2(4, atom_b) + ef2_i(2, 1)
2044 efield2(5, atom_b) = efield2(5, atom_b) + ef2_i(2, 2)
2045 efield2(6, atom_b) = efield2(6, atom_b) + ef2_i(2, 3)
2046 efield2(7, atom_b) = efield2(7, atom_b) + ef2_i(3, 1)
2047 efield2(8, atom_b) = efield2(8, atom_b) + ef2_i(3, 2)
2048 efield2(9, atom_b) = efield2(9, atom_b) + ef2_i(3, 3)
2049 END IF
2050 END IF
2051 IF (do_stress) THEN
2052 ptens11 = ptens11 + rab(1)*fr(1)
2053 ptens21 = ptens21 + rab(2)*fr(1)
2054 ptens31 = ptens31 + rab(3)*fr(1)
2055 ptens12 = ptens12 + rab(1)*fr(2)
2056 ptens22 = ptens22 + rab(2)*fr(2)
2057 ptens32 = ptens32 + rab(3)*fr(2)
2058 ptens13 = ptens13 + rab(1)*fr(3)
2059 ptens23 = ptens23 + rab(2)*fr(3)
2060 ptens33 = ptens33 + rab(3)*fr(3)
2061 END IF
2062
2063
2064 IF (PRESENT(integral_value)) THEN
2065 integral_value = eloc
2066 END IF
2067 IF (do_forces) THEN
2068 force_ab = fr
2069 END IF
2070 END SUBROUTINE se_coulomb_ij_interaction
2071
2072END MODULE se_fock_matrix_integrals
2073
static GRID_HOST_DEVICE double fac(const int i)
Factorial function, e.g. fac(5) = 5! = 120.
Definition grid_common.h:48
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Provides the low level routines to build both the exchange and the Coulomb Fock matrices....
subroutine, public fock2c_r3(sepi, sepj, switch, pi_tot, fi_mat, pj_tot, fj_mat, factor, w, rp)
Construction of 2-center Fock Matrix - Coulomb Terms for the residual (1/R^3) integral part.
subroutine, public fock2_1el_ew(sep, rij, ks_block, p_block, ecore, itype, anag, se_int_control, se_taper, store_int_env)
Construction of 2-center 1-electron Fock Matrix (Ewald self term)
subroutine, public dfock2c(sepi, sepj, rij, switch, pi_tot, pj_tot, factor, anag, se_int_control, se_taper, force, delta)
Derivatives of 2-center Fock Matrix - Coulomb Terms.
subroutine, public fock2_1el_r3(sepi, sepj, ksi_block, ksj_block, pi_block, pj_block, e1b, e2a, ecore, rp)
Construction of 2-center 1-electron Fock Matrix for the residual (1/R^3) integral part.
subroutine, public dfock2c_r3(sepi, sepj, switch, pi_tot, pj_tot, factor, w, drp, force)
Derivatives of 2-center Fock Matrix - Coulomb Terms for the residual (1/R^3) integral part.
subroutine, public dfock2e(sepi, sepj, rij, switch, isize, pi_mat, factor, anag, se_int_control, se_taper, force, delta)
Derivatives of 2-center Fock Matrix - General Driver.
subroutine, public fock2c(sepi, sepj, rij, switch, pi_tot, fi_mat, pj_tot, fj_mat, factor, anag, se_int_control, se_taper, store_int_env)
Construction of 2-center Fock Matrix - Coulomb Terms.
subroutine, public fock1_2el(sep, p_tot, p_mat, f_mat, factor)
Construction of 1-center 2-electron Fock Matrix.
subroutine, public se_coulomb_ij_interaction(atom_a, atom_b, my_task, do_forces, do_efield, do_stress, charges, dipoles, quadrupoles, force_ab, efield0, efield1, efield2, rab2, rab, integral_value, ptens11, ptens12, ptens13, ptens21, ptens22, ptens23, ptens31, ptens32, ptens33)
Coulomb interaction multipolar correction.
subroutine, public dfock2_1el_r3(sepi, sepj, drp, pi_block, pj_block, force, e1b, e2a)
Derivatives of 2-center 1-electron Fock Matrix residual (1/R^3) integral part.
subroutine, public fock2_1el(sepi, sepj, rij, ksi_block, ksj_block, pi_block, pj_block, ecore, itype, anag, se_int_control, se_taper, store_int_env)
Construction of 2-center 1-electron Fock Matrix.
subroutine, public fock2e(sepi, sepj, rij, switch, isize, pi_mat, fi_mat, factor, anag, se_int_control, se_taper, store_int_env)
Construction of 2-center Fock Matrix - General Driver.
subroutine, public dfock2_1el(sepi, sepj, rij, pi_block, pj_block, itype, anag, se_int_control, se_taper, force, delta)
Derivatives of 2-center 1-electron Fock Matrix.
subroutine, public fock2c_ew(sep, rij, p_tot, f_mat, factor, anag, se_int_control, se_taper, store_int_env)
Construction of 2-center Fock Matrix - Coulomb Self Terms (Ewald)
Arrays of parameters used in the semi-empirical calculations \References Everywhere in this module TC...
integer, dimension(9), public se_orbital_pointer
Set of wrappers for semi-empirical analytical/numerical Integrals routines.
subroutine, public rotnuc(sepi, sepj, rij, e1b, e2a, itype, anag, se_int_control, se_taper, store_int_env)
wrapper for numerical/analytical 1 center 1 electron integrals
subroutine, public drotint(sepi, sepj, rij, dw, delta, anag, se_int_control, se_taper)
wrapper for numerical/analytical routines
subroutine, public rotint(sepi, sepj, rij, w, anag, se_int_control, se_taper, store_int_env)
wrapper for numerical/analytical 2 center 2 electrons integrals routines with possibility of incore s...
subroutine, public drotnuc(sepi, sepj, rij, de1b, de2a, itype, delta, anag, se_int_control, se_taper)
wrapper for numerical/analytical routines
Type to store integrals for semi-empirical calculations.
Definition of the semi empirical parameter types.
Taper type use in semi-empirical calculations.