1!--------------------------------------------------------------------------------------------------!
2!   CP2K: A general program to perform molecular dynamics simulations                              !
3!   Copyright (C) 2000 - 2020  CP2K developers group                                               !
4!--------------------------------------------------------------------------------------------------!
5
6! **************************************************************************************************
7!> \brief Integral GKS scheme: The order of the integrals in makeCoul reflects
8!>        the standard order by MOPAC
9!> \par History
10!>      Teodoro Laino [tlaino] - 04.2009 : Adapted size arrays to d-orbitals and
11!>                               get rid of the alternative ordering. Using the
12!>                               CP2K one.
13!>      Teodoro Laino [tlaino] - 04.2009 : Skip nullification (speed-up)
14!>      Teodoro Laino [tlaino] - 04.2009 : Speed-up due to fortran arrays order
15!>                               optimization and collection of common pieces of
16!>                               code
17! **************************************************************************************************
18MODULE semi_empirical_int_gks
19
20   USE dg_rho0_types,                   ONLY: dg_rho0_type
21   USE dg_types,                        ONLY: dg_get,&
22                                              dg_type
23   USE kinds,                           ONLY: dp
24   USE mathconstants,                   ONLY: fourpi,&
25                                              oorootpi
26   USE multipole_types,                 ONLY: do_multipole_none
27   USE pw_grid_types,                   ONLY: pw_grid_type
28   USE pw_pool_types,                   ONLY: pw_pool_type
29   USE semi_empirical_int_arrays,       ONLY: indexb,&
30                                              rij_threshold
31   USE semi_empirical_mpole_types,      ONLY: semi_empirical_mpole_type
32   USE semi_empirical_types,            ONLY: se_int_control_type,&
33                                              semi_empirical_type,&
34                                              setup_se_int_control_type
35#include "./base/base_uses.f90"
36
37   IMPLICIT NONE
38   PRIVATE
39
40   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'semi_empirical_int_gks'
41   LOGICAL, PARAMETER, PRIVATE          :: debug_this_module = .FALSE.
42
43   PUBLIC :: corecore_gks, rotnuc_gks, drotnuc_gks, rotint_gks, drotint_gks
44
45CONTAINS
46
47! **************************************************************************************************
48!> \brief Computes the electron-nuclei integrals
49!> \param sepi ...
50!> \param sepj ...
51!> \param rij ...
52!> \param e1b ...
53!> \param e2a ...
54!> \param se_int_control ...
55! **************************************************************************************************
56   SUBROUTINE rotnuc_gks(sepi, sepj, rij, e1b, e2a, se_int_control)
57      TYPE(semi_empirical_type), POINTER                 :: sepi, sepj
58      REAL(dp), DIMENSION(3), INTENT(IN)                 :: rij
59      REAL(dp), DIMENSION(45), INTENT(OUT), OPTIONAL     :: e1b, e2a
60      TYPE(se_int_control_type), INTENT(IN)              :: se_int_control
61
62      CHARACTER(len=*), PARAMETER :: routineN = 'rotnuc_gks', routineP = moduleN//':'//routineN
63
64      INTEGER                                            :: i, mu, nu
65      REAL(KIND=dp), DIMENSION(3)                        :: rab
66      REAL(kind=dp), DIMENSION(45, 45)                   :: Coul
67
68      rab = -rij
69
70      IF (se_int_control%do_ewald_gks) THEN
71         IF (DOT_PRODUCT(rij, rij) > rij_threshold) THEN
72            CALL makeCoulE(rab, sepi, sepj, Coul, se_int_control)
73         ELSE
74            CALL makeCoulE0(sepi, Coul, se_int_control)
75         END IF
76      ELSE
77         CALL makeCoul(rab, sepi, sepj, Coul, se_int_control)
78      END IF
79
80      i = 0
81      DO mu = 1, sepi%natorb
82         DO nu = 1, mu
83            i = i + 1
84            e1b(i) = -Coul(i, 1)*sepj%zeff
85         END DO
86      END DO
87
88      i = 0
89      DO mu = 1, sepj%natorb
90         DO nu = 1, mu
91            i = i + 1
92            e2a(i) = -Coul(1, i)*sepi%zeff
93         END DO
94      END DO
95
96   END SUBROUTINE rotnuc_gks
97
98! **************************************************************************************************
99!> \brief Computes the electron-electron integrals
100!> \param sepi ...
101!> \param sepj ...
102!> \param rij ...
103!> \param w ...
104!> \param se_int_control ...
105! **************************************************************************************************
106   SUBROUTINE rotint_gks(sepi, sepj, rij, w, se_int_control)
107      TYPE(semi_empirical_type), POINTER                 :: sepi, sepj
108      REAL(dp), DIMENSION(3), INTENT(IN)                 :: rij
109      REAL(dp), DIMENSION(2025), INTENT(OUT), OPTIONAL   :: w
110      TYPE(se_int_control_type), INTENT(IN)              :: se_int_control
111
112      CHARACTER(len=*), PARAMETER :: routineN = 'rotint_gks', routineP = moduleN//':'//routineN
113
114      INTEGER                                            :: i, ind1, ind2, lam, mu, nu, sig
115      REAL(KIND=dp), DIMENSION(3)                        :: rab
116      REAL(kind=dp), DIMENSION(45, 45)                   :: Coul
117
118      rab = -rij
119
120      IF (se_int_control%do_ewald_gks) THEN
121         IF (DOT_PRODUCT(rij, rij) > rij_threshold) THEN
122            CALL makeCoulE(rab, sepi, sepj, Coul, se_int_control)
123         ELSE
124            CALL makeCoulE0(sepi, Coul, se_int_control)
125         END IF
126      ELSE
127         CALL makeCoul(rab, sepi, sepj, Coul, se_int_control)
128      END IF
129
130      i = 0
131      ind1 = 0
132      DO mu = 1, sepi%natorb
133         DO nu = 1, mu
134            ind1 = ind1 + 1
135            ind2 = 0
136            DO lam = 1, sepj%natorb
137               DO sig = 1, lam
138                  i = i + 1
139                  ind2 = ind2 + 1
140                  w(i) = Coul(ind1, ind2)
141               END DO
142            END DO
143         END DO
144      END DO
145
146   END SUBROUTINE rotint_gks
147
148! **************************************************************************************************
149!> \brief Computes the derivatives of the electron-nuclei integrals
150!> \param sepi ...
151!> \param sepj ...
152!> \param rij ...
153!> \param de1b ...
154!> \param de2a ...
155!> \param se_int_control ...
156! **************************************************************************************************
157   SUBROUTINE drotnuc_gks(sepi, sepj, rij, de1b, de2a, se_int_control)
158      TYPE(semi_empirical_type), POINTER                 :: sepi, sepj
159      REAL(dp), DIMENSION(3), INTENT(IN)                 :: rij
160      REAL(dp), DIMENSION(3, 45), INTENT(OUT), OPTIONAL  :: de1b, de2a
161      TYPE(se_int_control_type), INTENT(IN)              :: se_int_control
162
163      CHARACTER(len=*), PARAMETER :: routineN = 'drotnuc_gks', routineP = moduleN//':'//routineN
164
165      INTEGER                                            :: i, mu, nu
166      REAL(KIND=dp), DIMENSION(3)                        :: rab
167      REAL(kind=dp), DIMENSION(3, 45, 45)                :: dCoul
168
169      rab = -rij
170
171      IF (se_int_control%do_ewald_gks) THEN
172         CALL makedCoulE(rab, sepi, sepj, dCoul, se_int_control)
173      ELSE
174         CALL makedCoul(rab, sepi, sepj, dCoul, se_int_control)
175      END IF
176
177      i = 0
178      DO mu = 1, sepi%natorb
179         DO nu = 1, mu
180            i = i + 1
181            de1b(1, i) = dCoul(1, i, 1)*sepj%zeff
182            de1b(2, i) = dCoul(2, i, 1)*sepj%zeff
183            de1b(3, i) = dCoul(3, i, 1)*sepj%zeff
184         END DO
185      END DO
186
187      i = 0
188      DO mu = 1, sepj%natorb
189         DO nu = 1, mu
190            i = i + 1
191            de2a(1, i) = dCoul(1, 1, i)*sepi%zeff
192            de2a(2, i) = dCoul(2, 1, i)*sepi%zeff
193            de2a(3, i) = dCoul(3, 1, i)*sepi%zeff
194         END DO
195      END DO
196
197   END SUBROUTINE drotnuc_gks
198
199! **************************************************************************************************
200!> \brief Computes the derivatives of the electron-electron integrals
201!> \param sepi ...
202!> \param sepj ...
203!> \param rij ...
204!> \param dw ...
205!> \param se_int_control ...
206! **************************************************************************************************
207   SUBROUTINE drotint_gks(sepi, sepj, rij, dw, se_int_control)
208      TYPE(semi_empirical_type), POINTER                 :: sepi, sepj
209      REAL(dp), DIMENSION(3), INTENT(IN)                 :: rij
210      REAL(dp), DIMENSION(3, 2025), INTENT(OUT)          :: dw
211      TYPE(se_int_control_type), INTENT(IN)              :: se_int_control
212
213      CHARACTER(len=*), PARAMETER :: routineN = 'drotint_gks', routineP = moduleN//':'//routineN
214
215      INTEGER                                            :: i, ind1, ind2, lam, mu, nu, sig
216      REAL(KIND=dp), DIMENSION(3)                        :: rab
217      REAL(kind=dp), DIMENSION(3, 45, 45)                :: dCoul
218
219      rab = -rij
220
221      IF (se_int_control%do_ewald_gks) THEN
222         CALL makedCoulE(rab, sepi, sepj, dCoul, se_int_control)
223      ELSE
224         CALL makedCoul(rab, sepi, sepj, dCoul, se_int_control)
225      END IF
226
227      i = 0
228      ind1 = 0
229      DO mu = 1, sepi%natorb
230         DO nu = 1, mu
231            ind1 = ind1 + 1
232            ind2 = 0
233            DO lam = 1, sepj%natorb
234               DO sig = 1, lam
235                  i = i + 1
236                  ind2 = ind2 + 1
237                  dw(1, i) = -dCoul(1, ind1, ind2)
238                  dw(2, i) = -dCoul(2, ind1, ind2)
239                  dw(3, i) = -dCoul(3, ind1, ind2)
240               END DO
241            END DO
242         END DO
243      END DO
244
245   END SUBROUTINE drotint_gks
246
247! **************************************************************************************************
248!> \brief Computes the primitives of the integrals (non-periodic case)
249!> \param RAB ...
250!> \param sepi ...
251!> \param sepj ...
252!> \param Coul ...
253!> \param se_int_control ...
254! **************************************************************************************************
255   SUBROUTINE makeCoul(RAB, sepi, sepj, Coul, se_int_control)
256      REAL(kind=dp), DIMENSION(3)                        :: RAB
257      TYPE(semi_empirical_type), POINTER                 :: sepi, sepj
258      REAL(kind=dp), DIMENSION(45, 45), INTENT(OUT)      :: Coul
259      TYPE(se_int_control_type), INTENT(IN)              :: se_int_control
260
261      CHARACTER(len=*), PARAMETER :: routineN = 'makeCoul', routineP = moduleN//':'//routineN
262
263      INTEGER                                            :: iA, iB, imA, imB, jA, jB, k1, k2, k3, k4
264      LOGICAL                                            :: shortrange
265      REAL(kind=dp)                                      :: a2, ACOULA, ACOULB, d1, d1f(3), d2, &
266                                                            d2f(3, 3), d3, d3f(3, 3, 3), d4, &
267                                                            d4f(3, 3, 3, 3), f, rr, w, w0, w1, w2, &
268                                                            w3, w4, w5
269      REAL(kind=dp), DIMENSION(3)                        :: v
270      REAL(kind=dp), DIMENSION(3, 3, 45)                 :: M2A, M2B
271      REAL(kind=dp), DIMENSION(3, 45)                    :: M1A, M1B
272      REAL(kind=dp), DIMENSION(45)                       :: M0A, M0B
273
274      shortrange = se_int_control%shortrange
275      CALL get_se_slater_multipole(sepi, M0A, M1A, M2A, ACOULA)
276      CALL get_se_slater_multipole(sepj, M0B, M1B, M2B, ACOULB)
277
278      v(1) = RAB(1)
279      v(2) = RAB(2)
280      v(3) = RAB(3)
281      rr = SQRT(DOT_PRODUCT(v, v))
282
283      a2 = 0.5_dp*(1.0_dp/ACOULA + 1.0_dp/ACOULB)
284      w0 = a2*rr
285      w = EXP(-w0)
286      w1 = (1.0_dp + 0.5_dp*w0)
287      w2 = (w1 + 0.5_dp*w0 + 0.5_dp*w0**2)
288      w3 = (w2 + w0**3/6.0_dp)
289      w4 = (w3 + w0**4/30.0_dp)
290      w5 = (w3 + 8.0_dp*w0**4/210.0_dp + w0**5/210.0_dp)
291
292      IF (shortrange) THEN
293         f = (-w*w1)/rr
294         d1 = -1.0_dp*(-w*w2)/rr**3
295         d2 = 3.0_dp*(-w*w3)/rr**5
296         d3 = -15.0_dp*(-w*w4)/rr**7
297         d4 = 105.0_dp*(-w*w5)/rr**9
298      ELSE
299         f = (1.0_dp - w*w1)/rr
300         d1 = -1.0_dp*(1.0_dp - w*w2)/rr**3
301         d2 = 3.0_dp*(1.0_dp - w*w3)/rr**5
302         d3 = -15.0_dp*(1.0_dp - w*w4)/rr**7
303         d4 = 105.0_dp*(1.0_dp - w*w5)/rr**9
304      ENDIF
305
306      CALL build_d_tensor_gks(d1f, d2f, d3f, d4f, v=v, d1=d1, d2=d2, d3=d3, d4=d4)
307
308      imA = 0
309      DO iA = 1, sepi%natorb
310         DO jA = 1, iA
311            imA = imA + 1
312
313            imB = 0
314            DO iB = 1, sepj%natorb
315               DO jB = 1, iB
316                  imB = imB + 1
317
318                  w = M0A(imA)*M0B(imB)*f
319                  DO k1 = 1, 3
320                     w = w + (M1A(k1, imA)*M0B(imB) - M0A(imA)*M1B(k1, imB))*d1f(k1)
321                  ENDDO
322                  DO k2 = 1, 3
323                     DO k1 = 1, 3
324                        w = w + (M2A(k1, k2, imA)*M0B(imB) - M1A(k1, imA)*M1B(k2, imB) + M0A(imA)*M2B(k1, k2, imB))*d2f(k1, k2)
325                     ENDDO
326                  ENDDO
327                  DO k3 = 1, 3
328                     DO k2 = 1, 3
329                        DO k1 = 1, 3
330                           w = w + (-M2A(k1, k2, imA)*M1B(k3, imB) + M1A(k1, imA)*M2B(k2, k3, imB))*d3f(k1, k2, k3)
331                        ENDDO
332                     ENDDO
333                  ENDDO
334
335                  DO k4 = 1, 3
336                     DO k3 = 1, 3
337                        DO k2 = 1, 3
338                           DO k1 = 1, 3
339                              w = w + M2A(k1, k2, imA)*M2B(k3, k4, imB)*d4f(k1, k2, k3, k4)
340                           ENDDO
341                        ENDDO
342                     ENDDO
343                  ENDDO
344
345                  Coul(imA, imB) = w
346               ENDDO
347            ENDDO
348         ENDDO
349      ENDDO
350
351   END SUBROUTINE makeCoul
352
353! **************************************************************************************************
354!> \brief Computes the derivatives of the primitives of the integrals
355!>        (non-periodic case)
356!> \param RAB ...
357!> \param sepi ...
358!> \param sepj ...
359!> \param dCoul ...
360!> \param se_int_control ...
361! **************************************************************************************************
362   SUBROUTINE makedCoul(RAB, sepi, sepj, dCoul, se_int_control)
363      REAL(kind=dp), DIMENSION(3)                        :: RAB
364      TYPE(semi_empirical_type), POINTER                 :: sepi, sepj
365      REAL(kind=dp), DIMENSION(3, 45, 45), INTENT(OUT)   :: dCoul
366      TYPE(se_int_control_type), INTENT(IN)              :: se_int_control
367
368      CHARACTER(len=*), PARAMETER :: routineN = 'makedCoul', routineP = moduleN//':'//routineN
369
370      INTEGER                                            :: iA, iB, imA, imB, jA, jB, k1, k2, k3, k4
371      LOGICAL                                            :: shortrange
372      REAL(kind=dp) :: a2, ACOULA, ACOULB, d1, d1f(3), d2, d2f(3, 3), d3, d3f(3, 3, 3), d4, &
373         d4f(3, 3, 3, 3), d5, d5f(3, 3, 3, 3, 3), f, rr, tmp, w, w0, w1, w2, w3, w4, w5, w6
374      REAL(kind=dp), DIMENSION(3)                        :: v, wv
375      REAL(kind=dp), DIMENSION(3, 3, 45)                 :: M2A, M2B
376      REAL(kind=dp), DIMENSION(3, 45)                    :: M1A, M1B
377      REAL(kind=dp), DIMENSION(45)                       :: M0A, M0B
378
379      shortrange = se_int_control%shortrange
380      CALL get_se_slater_multipole(sepi, M0A, M1A, M2A, ACOULA)
381      CALL get_se_slater_multipole(sepj, M0B, M1B, M2B, ACOULB)
382
383      v(1) = RAB(1)
384      v(2) = RAB(2)
385      v(3) = RAB(3)
386      rr = SQRT(DOT_PRODUCT(v, v))
387
388      a2 = 0.5_dp*(1.0_dp/ACOULA + 1.0_dp/ACOULB)
389      w0 = a2*rr
390      w = EXP(-w0)
391      w1 = (1.0_dp + 0.5_dp*w0)
392      w2 = (w1 + 0.5_dp*w0 + 0.5_dp*w0**2)
393      w3 = (w2 + w0**3/6.0_dp)
394      w4 = (w3 + w0**4/30.0_dp)
395      w5 = (w3 + 4.0_dp*w0**4/105.0_dp + w0**5/210.0_dp)
396      w6 = (w3 + 15.0_dp*w0**4/378.0_dp + 2.0_dp*w0**5/315.0_dp + w0**6/1890.0_dp)
397
398      IF (shortrange) THEN
399         f = (-w*w1)/rr
400         d1 = -1.0_dp*(-w*w2)/rr**3
401         d2 = 3.0_dp*(-w*w3)/rr**5
402         d3 = -15.0_dp*(-w*w4)/rr**7
403         d4 = 105.0_dp*(-w*w5)/rr**9
404         d5 = -945.0_dp*(-w*w6)/rr**11
405      ELSE
406         f = (1.0_dp - w*w1)/rr
407         d1 = -1.0_dp*(1.0_dp - w*w2)/rr**3
408         d2 = 3.0_dp*(1.0_dp - w*w3)/rr**5
409         d3 = -15.0_dp*(1.0_dp - w*w4)/rr**7
410         d4 = 105.0_dp*(1.0_dp - w*w5)/rr**9
411         d5 = -945.0_dp*(1.0_dp - w*w6)/rr**11
412      ENDIF
413
414      CALL build_d_tensor_gks(d1f, d2f, d3f, d4f, d5f, v, d1, d2, d3, d4, d5)
415
416      imA = 0
417      DO iA = 1, sepi%natorb
418         DO jA = 1, iA
419            imA = imA + 1
420
421            imB = 0
422            DO iB = 1, sepj%natorb
423               DO jB = 1, iB
424                  imB = imB + 1
425
426                  tmp = M0A(imA)*M0B(imB)
427                  wv(1) = tmp*d1f(1)
428                  wv(2) = tmp*d1f(2)
429                  wv(3) = tmp*d1f(3)
430                  DO k1 = 1, 3
431                     tmp = M1A(k1, imA)*M0B(imB) - M0A(imA)*M1B(k1, imB)
432                     wv(1) = wv(1) + tmp*d2f(1, k1)
433                     wv(2) = wv(2) + tmp*d2f(2, k1)
434                     wv(3) = wv(3) + tmp*d2f(3, k1)
435                  ENDDO
436                  DO k2 = 1, 3
437                     DO k1 = 1, 3
438                        tmp = M2A(k1, k2, imA)*M0B(imB) - M1A(k1, imA)*M1B(k2, imB) + M0A(imA)*M2B(k1, k2, imB)
439                        wv(1) = wv(1) + tmp*d3f(1, k1, k2)
440                        wv(2) = wv(2) + tmp*d3f(2, k1, k2)
441                        wv(3) = wv(3) + tmp*d3f(3, k1, k2)
442                     ENDDO
443                  ENDDO
444                  DO k3 = 1, 3
445                     DO k2 = 1, 3
446                        DO k1 = 1, 3
447                           tmp = -M2A(k1, k2, imA)*M1B(k3, imB) + M1A(k1, imA)*M2B(k2, k3, imB)
448                           wv(1) = wv(1) + tmp*d4f(1, k1, k2, k3)
449                           wv(2) = wv(2) + tmp*d4f(2, k1, k2, k3)
450                           wv(3) = wv(3) + tmp*d4f(3, k1, k2, k3)
451                        ENDDO
452                     ENDDO
453                  ENDDO
454
455                  DO k4 = 1, 3
456                     DO k3 = 1, 3
457                        DO k2 = 1, 3
458                           DO k1 = 1, 3
459                              tmp = M2A(k1, k2, imA)*M2B(k3, k4, imB)
460                              wv(1) = wv(1) + tmp*d5f(1, k1, k2, k3, k4)
461                              wv(2) = wv(2) + tmp*d5f(2, k1, k2, k3, k4)
462                              wv(3) = wv(3) + tmp*d5f(3, k1, k2, k3, k4)
463                           ENDDO
464                        ENDDO
465                     ENDDO
466                  ENDDO
467
468                  dCoul(1, imA, imB) = wv(1)
469                  dCoul(2, imA, imB) = wv(2)
470                  dCoul(3, imA, imB) = wv(3)
471               ENDDO
472            ENDDO
473         ENDDO
474      ENDDO
475
476   END SUBROUTINE makedCoul
477
478! **************************************************************************************************
479!> \brief Computes nuclei-nuclei interactions
480!> \param sepi ...
481!> \param sepj ...
482!> \param rijv ...
483!> \param enuc ...
484!> \param denuc ...
485!> \param se_int_control ...
486! **************************************************************************************************
487   SUBROUTINE corecore_gks(sepi, sepj, rijv, enuc, denuc, se_int_control)
488      TYPE(semi_empirical_type), POINTER                 :: sepi, sepj
489      REAL(dp), DIMENSION(3), INTENT(IN)                 :: rijv
490      REAL(dp), INTENT(OUT), OPTIONAL                    :: enuc
491      REAL(dp), DIMENSION(3), INTENT(OUT), OPTIONAL      :: denuc
492      TYPE(se_int_control_type), INTENT(IN)              :: se_int_control
493
494      CHARACTER(len=*), PARAMETER :: routineN = 'corecore_gks', routineP = moduleN//':'//routineN
495
496      LOGICAL                                            :: l_denuc, l_enuc
497      REAL(dp)                                           :: alpi, alpj, dscale, rij, scale, zz
498      REAL(kind=dp), DIMENSION(3, 45, 45)                :: dCoul, dCoulE
499      REAL(kind=dp), DIMENSION(45, 45)                   :: Coul, CoulE
500      TYPE(se_int_control_type)                          :: se_int_control_off
501
502      rij = DOT_PRODUCT(rijv, rijv)
503
504      l_enuc = PRESENT(enuc)
505      l_denuc = PRESENT(denuc)
506      IF ((rij > rij_threshold) .AND. (l_enuc .OR. l_denuc)) THEN
507
508         rij = SQRT(rij)
509
510         IF (se_int_control%shortrange) THEN
511            CALL setup_se_int_control_type(se_int_control_off, shortrange=.FALSE., do_ewald_r3=.FALSE., &
512                                           do_ewald_gks=.FALSE., integral_screening=se_int_control%integral_screening, &
513                                           max_multipole=do_multipole_none, pc_coulomb_int=.FALSE.)
514            CALL makeCoul(rijv, sepi, sepj, Coul, se_int_control_off)
515            IF (l_denuc) CALL makedCoul(rijv, sepi, sepj, dCoul, se_int_control_off)
516            IF (se_int_control%do_ewald_gks) THEN
517               CALL makeCoulE(rijv, sepi, sepj, CoulE, se_int_control)
518               IF (l_denuc) CALL makedCoulE(rijv, sepi, sepj, dCoulE, se_int_control)
519            ELSE
520               CALL makeCoul(rijv, sepi, sepj, CoulE, se_int_control)
521               IF (l_denuc) CALL makedCoul(rijv, sepi, sepj, dCoulE, se_int_control)
522            END IF
523         ELSE
524            CALL makeCoul(rijv, sepi, sepj, Coul, se_int_control)
525            CoulE = Coul
526            IF (l_denuc) CALL makedCoul(rijv, sepi, sepj, dCoul, se_int_control)
527            IF (l_denuc) dCoulE = dCoul
528         END IF
529
530         scale = 0.0_dp
531         dscale = 0.0_dp
532         zz = sepi%zeff*sepj%zeff
533         alpi = sepi%alp
534         alpj = sepj%alp
535         scale = EXP(-alpi*rij) + EXP(-alpj*rij)
536         IF (l_enuc) THEN
537            enuc = zz*CoulE(1, 1) + scale*zz*Coul(1, 1)
538         END IF
539         IF (l_denuc) THEN
540            dscale = -alpi*EXP(-alpi*rij) - alpj*EXP(-alpj*rij)
541            denuc(1) = zz*dCoulE(1, 1, 1) + dscale*(rijv(1)/rij)*zz*Coul(1, 1) + scale*zz*dCoul(1, 1, 1)
542            denuc(2) = zz*dCoulE(2, 1, 1) + dscale*(rijv(2)/rij)*zz*Coul(1, 1) + scale*zz*dCoul(2, 1, 1)
543            denuc(3) = zz*dCoulE(3, 1, 1) + dscale*(rijv(3)/rij)*zz*Coul(1, 1) + scale*zz*dCoul(3, 1, 1)
544         END IF
545
546      ELSE
547
548         IF (se_int_control%do_ewald_gks) THEN
549            zz = sepi%zeff*sepi%zeff
550            CALL makeCoulE0(sepi, CoulE, se_int_control)
551            IF (l_enuc) THEN
552               enuc = zz*CoulE(1, 1)
553            END IF
554            IF (l_denuc) THEN
555               denuc = 0._dp
556            END IF
557         END IF
558
559      ENDIF
560   END SUBROUTINE corecore_gks
561
562! **************************************************************************************************
563!> \brief Computes the primitives of the integrals (periodic case)
564!> \param RAB ...
565!> \param sepi ...
566!> \param sepj ...
567!> \param Coul ...
568!> \param se_int_control ...
569! **************************************************************************************************
570   SUBROUTINE makeCoulE(RAB, sepi, sepj, Coul, se_int_control)
571      REAL(KIND=dp), DIMENSION(3)                        :: RAB
572      TYPE(semi_empirical_type), POINTER                 :: sepi, sepj
573      REAL(KIND=dp), DIMENSION(45, 45), INTENT(OUT)      :: Coul
574      TYPE(se_int_control_type), INTENT(IN)              :: se_int_control
575
576      CHARACTER(len=*), PARAMETER :: routineN = 'makeCoulE', routineP = moduleN//':'//routineN
577
578      INTEGER                                            :: gpt, imA, imB, k1, k2, k3, k4, lp, mp, np
579      INTEGER, DIMENSION(:, :), POINTER                  :: bds
580      REAL(KIND=dp) :: a2, ACOULA, ACOULB, alpha, cc, d1, d1f(3), d2, d2f(3, 3), d3, d3f(3, 3, 3), &
581         d4, d4f(3, 3, 3, 3), f, ff, kr, kr2, r1, r2, r3, r5, r7, r9, rr, ss, w, w0, w1, w2, w3, &
582         w4, w5
583      REAL(KIND=dp), DIMENSION(3)                        :: kk, v
584      REAL(KIND=dp), DIMENSION(3, 3, 45)                 :: M2A, M2B
585      REAL(KIND=dp), DIMENSION(3, 45)                    :: M1A, M1B
586      REAL(KIND=dp), DIMENSION(45)                       :: M0A, M0B
587      REAL(KIND=dp), DIMENSION(:, :, :), POINTER         :: rho0
588      TYPE(dg_rho0_type), POINTER                        :: dg_rho0
589      TYPE(dg_type), POINTER                             :: dg
590      TYPE(pw_grid_type), POINTER                        :: pw_grid
591      TYPE(pw_pool_type), POINTER                        :: pw_pool
592
593      alpha = se_int_control%ewald_gks%alpha
594      pw_pool => se_int_control%ewald_gks%pw_pool
595      dg => se_int_control%ewald_gks%dg
596      CALL dg_get(dg, dg_rho0=dg_rho0)
597      rho0 => dg_rho0%density%pw%cr3d
598      pw_grid => pw_pool%pw_grid
599      bds => pw_grid%bounds
600
601      CALL get_se_slater_multipole(sepi, M0A, M1A, M2A, ACOULA)
602      CALL get_se_slater_multipole(sepj, M0B, M1B, M2B, ACOULB)
603
604      v(1) = RAB(1)
605      v(2) = RAB(2)
606      v(3) = RAB(3)
607      rr = SQRT(DOT_PRODUCT(v, v))
608
609      r1 = 1.0_dp/rr
610      r2 = r1*r1
611      r3 = r2*r1
612      r5 = r3*r2
613      r7 = r5*r2
614      r9 = r7*r2
615
616      a2 = 0.5_dp*(1.0_dp/ACOULA + 1.0_dp/ACOULB)
617
618      w0 = a2*rr
619      w = EXP(-w0)
620      w1 = (1.0_dp + 0.5_dp*w0)
621      w2 = (w1 + 0.5_dp*w0 + 0.5_dp*w0**2)
622      w3 = (w2 + w0**3/6.0_dp)
623      w4 = (w3 + w0**4/30.0_dp)
624      w5 = (w3 + 8.0_dp*w0**4/210.0_dp + w0**5/210.0_dp)
625
626      f = (1.0_dp - w*w1)*r1
627      d1 = -1.0_dp*(1.0_dp - w*w2)*r3
628      d2 = 3.0_dp*(1.0_dp - w*w3)*r5
629      d3 = -15.0_dp*(1.0_dp - w*w4)*r7
630      d4 = 105.0_dp*(1.0_dp - w*w5)*r9
631
632      kr = alpha*rr
633      kr2 = kr*kr
634      w0 = 1.0_dp - erfc(kr)
635      w1 = 2.0_dp*oorootpi*EXP(-kr2)
636      w2 = w1*kr
637
638      f = f - w0*r1
639      d1 = d1 + (-w2 + w0)*r3
640      d2 = d2 + (w2*(3.0_dp + kr2*2.0_dp) - 3.0_dp*w0)*r5
641      d3 = d3 + (-w2*(15.0_dp + kr2*(10.0_dp + kr2*4.0_dp)) + 15.0_dp*w0)*r7
642      d4 = d4 + (w2*(105.0_dp + kr2*(70.0_dp + kr2*(28.0_dp + kr2*8.0_dp))) - 105.0_dp*w0)*r9
643
644      CALL build_d_tensor_gks(d1f, d2f, d3f, d4f, v=v, d1=d1, d2=d2, d3=d3, d4=d4)
645
646      DO imA = 1, (sepi%natorb*(sepi%natorb + 1))/2
647         DO imB = 1, (sepj%natorb*(sepj%natorb + 1))/2
648
649            w = M0A(imA)*M0B(imB)*f
650            DO k1 = 1, 3
651               w = w + (M1A(k1, imA)*M0B(imB) - M0A(imA)*M1B(k1, imB))*d1f(k1)
652            ENDDO
653            DO k2 = 1, 3
654               DO k1 = 1, 3
655                  w = w + (M2A(k1, k2, imA)*M0B(imB) - M1A(k1, imA)*M1B(k2, imB) + M0A(imA)*M2B(k1, k2, imB))*d2f(k1, k2)
656               ENDDO
657            ENDDO
658            DO k3 = 1, 3
659               DO k2 = 1, 3
660                  DO k1 = 1, 3
661                     w = w + (-M2A(k1, k2, imA)*M1B(k3, imB) + M1A(k1, imA)*M2B(k2, k3, imB))*d3f(k1, k2, k3)
662                  ENDDO
663               ENDDO
664            ENDDO
665
666            DO k4 = 1, 3
667               DO k3 = 1, 3
668                  DO k2 = 1, 3
669                     DO k1 = 1, 3
670                        w = w + M2A(k1, k2, imA)*M2B(k3, k4, imB)*d4f(k1, k2, k3, k4)
671                     ENDDO
672                  ENDDO
673               ENDDO
674            ENDDO
675
676            Coul(imA, imB) = w
677         ENDDO
678      ENDDO
679
680      v(1) = RAB(1)
681      v(2) = RAB(2)
682      v(3) = RAB(3)
683
684      f = 0.0_dp
685      d1f = 0.0_dp
686      d2f = 0.0_dp
687      d3f = 0.0_dp
688      d4f = 0.0_dp
689
690      DO gpt = 1, pw_grid%ngpts_cut_local
691         lp = pw_grid%mapl%pos(pw_grid%g_hat(1, gpt))
692         mp = pw_grid%mapm%pos(pw_grid%g_hat(2, gpt))
693         np = pw_grid%mapn%pos(pw_grid%g_hat(3, gpt))
694
695         lp = lp + bds(1, 1)
696         mp = mp + bds(1, 2)
697         np = np + bds(1, 3)
698
699         IF (pw_grid%gsq(gpt) == 0.0_dp) CYCLE
700         kk(:) = pw_grid%g(:, gpt)
701         ff = 2.0_dp*fourpi*rho0(lp, mp, np)**2*pw_grid%vol/pw_grid%gsq(gpt)
702
703         kr = DOT_PRODUCT(kk, v)
704         cc = COS(kr)
705         ss = SIN(kr)
706
707         f = f + cc*ff
708         DO k1 = 1, 3
709            d1f(k1) = d1f(k1) - kk(k1)*ss*ff
710         ENDDO
711         DO k2 = 1, 3
712            DO k1 = 1, 3
713               d2f(k1, k2) = d2f(k1, k2) - kk(k1)*kk(k2)*cc*ff
714            ENDDO
715         ENDDO
716         DO k3 = 1, 3
717            DO k2 = 1, 3
718               DO k1 = 1, 3
719                  d3f(k1, k2, k3) = d3f(k1, k2, k3) + kk(k1)*kk(k2)*kk(k3)*ss*ff
720               ENDDO
721            ENDDO
722         ENDDO
723         DO k4 = 1, 3
724            DO k3 = 1, 3
725               DO k2 = 1, 3
726                  DO k1 = 1, 3
727                     d4f(k1, k2, k3, k4) = d4f(k1, k2, k3, k4) + kk(k1)*kk(k2)*kk(k3)*kk(k4)*cc*ff
728                  ENDDO
729               ENDDO
730            ENDDO
731         ENDDO
732
733      ENDDO
734
735      DO imA = 1, (sepi%natorb*(sepi%natorb + 1))/2
736         DO imB = 1, (sepj%natorb*(sepj%natorb + 1))/2
737
738            w = M0A(imA)*M0B(imB)*f
739            DO k1 = 1, 3
740               w = w + (M1A(k1, imA)*M0B(imB) - M0A(imA)*M1B(k1, imB))*d1f(k1)
741            ENDDO
742            DO k2 = 1, 3
743               DO k1 = 1, 3
744                  w = w + (M2A(k1, k2, imA)*M0B(imB) - M1A(k1, imA)*M1B(k2, imB) + M0A(imA)*M2B(k1, k2, imB))*d2f(k1, k2)
745               ENDDO
746            ENDDO
747            DO k3 = 1, 3
748               DO k2 = 1, 3
749                  DO k1 = 1, 3
750                     w = w + (-M2A(k1, k2, imA)*M1B(k3, imB) + M1A(k1, imA)*M2B(k2, k3, imB))*d3f(k1, k2, k3)
751                  ENDDO
752               ENDDO
753            ENDDO
754
755            DO k4 = 1, 3
756               DO k3 = 1, 3
757                  DO k2 = 1, 3
758                     DO k1 = 1, 3
759                        w = w + M2A(k1, k2, imA)*M2B(k3, k4, imB)*d4f(k1, k2, k3, k4)
760                     ENDDO
761                  ENDDO
762               ENDDO
763            ENDDO
764
765            Coul(imA, imB) = Coul(imA, imB) + w
766
767         ENDDO
768      ENDDO
769
770      DO imA = 1, (sepi%natorb*(sepi%natorb + 1))/2
771         DO imB = 1, (sepj%natorb*(sepj%natorb + 1))/2
772            w = -M0A(imA)*M0B(imB)*0.25_dp*fourpi/(pw_grid%vol*alpha**2)
773            Coul(imA, imB) = Coul(imA, imB) + w
774         ENDDO
775      ENDDO
776
777   END SUBROUTINE makeCoulE
778
779! **************************************************************************************************
780!> \brief Computes the derivatives of the primitives of the integrals
781!>        (periodic case)
782!> \param RAB ...
783!> \param sepi ...
784!> \param sepj ...
785!> \param dCoul ...
786!> \param se_int_control ...
787! **************************************************************************************************
788   SUBROUTINE makedCoulE(RAB, sepi, sepj, dCoul, se_int_control)
789      REAL(KIND=dp), DIMENSION(3)                        :: RAB
790      TYPE(semi_empirical_type), POINTER                 :: sepi, sepj
791      REAL(KIND=dp), DIMENSION(3, 45, 45), INTENT(OUT)   :: dCoul
792      TYPE(se_int_control_type), INTENT(IN)              :: se_int_control
793
794      CHARACTER(len=*), PARAMETER :: routineN = 'makedCoulE', routineP = moduleN//':'//routineN
795
796      INTEGER                                            :: gpt, imA, imB, k1, k2, k3, k4, k5, lp, &
797                                                            mp, np
798      INTEGER, DIMENSION(:, :), POINTER                  :: bds
799      REAL(KIND=dp) :: a2, ACOULA, ACOULB, alpha, cc, d1, d1f(3), d2, d2f(3, 3), d3, d3f(3, 3, 3), &
800         d4, d4f(3, 3, 3, 3), d5, d5f(3, 3, 3, 3, 3), f, ff, kr, kr2, r1, r11, r2, r3, r5, r7, r9, &
801         rr, ss, tmp, w, w0, w1, w2, w3, w4, w5, w6
802      REAL(KIND=dp), DIMENSION(3)                        :: kk, v, wv
803      REAL(kind=dp), DIMENSION(3, 3, 45)                 :: M2A, M2B
804      REAL(kind=dp), DIMENSION(3, 45)                    :: M1A, M1B
805      REAL(kind=dp), DIMENSION(45)                       :: M0A, M0B
806      REAL(KIND=dp), DIMENSION(:, :, :), POINTER         :: rho0
807      TYPE(dg_rho0_type), POINTER                        :: dg_rho0
808      TYPE(dg_type), POINTER                             :: dg
809      TYPE(pw_grid_type), POINTER                        :: pw_grid
810      TYPE(pw_pool_type), POINTER                        :: pw_pool
811
812      alpha = se_int_control%ewald_gks%alpha
813      pw_pool => se_int_control%ewald_gks%pw_pool
814      dg => se_int_control%ewald_gks%dg
815      CALL dg_get(dg, dg_rho0=dg_rho0)
816      rho0 => dg_rho0%density%pw%cr3d
817      pw_grid => pw_pool%pw_grid
818      bds => pw_grid%bounds
819
820      CALL get_se_slater_multipole(sepi, M0A, M1A, M2A, ACOULA)
821      CALL get_se_slater_multipole(sepj, M0B, M1B, M2B, ACOULB)
822
823      v(1) = RAB(1)
824      v(2) = RAB(2)
825      v(3) = RAB(3)
826      rr = SQRT(DOT_PRODUCT(v, v))
827
828      a2 = 0.5_dp*(1.0_dp/ACOULA + 1.0_dp/ACOULB)
829
830      r1 = 1.0_dp/rr
831      r2 = r1*r1
832      r3 = r2*r1
833      r5 = r3*r2
834      r7 = r5*r2
835      r9 = r7*r2
836      r11 = r9*r2
837
838      w0 = a2*rr
839      w = EXP(-w0)
840      w1 = (1.0_dp + 0.5_dp*w0)
841      w2 = (w1 + 0.5_dp*w0 + 0.5_dp*w0**2)
842      w3 = (w2 + w0**3/6.0_dp)
843      w4 = (w3 + w0**4/30.0_dp)
844      w5 = (w3 + 8.0_dp*w0**4/210.0_dp + w0**5/210.0_dp)
845      w6 = (w3 + 5.0_dp*w0**4/126.0_dp + 2.0_dp*w0**5/315.0_dp + w0**6/1890.0_dp)
846
847      f = (1.0_dp - w*w1)*r1
848      d1 = -1.0_dp*(1.0_dp - w*w2)*r3
849      d2 = 3.0_dp*(1.0_dp - w*w3)*r5
850      d3 = -15.0_dp*(1.0_dp - w*w4)*r7
851      d4 = 105.0_dp*(1.0_dp - w*w5)*r9
852      d5 = -945.0_dp*(1.0_dp - w*w6)*r11
853
854      kr = alpha*rr
855      kr2 = kr*kr
856      w0 = 1.0_dp - erfc(kr)
857      w1 = 2.0_dp*oorootpi*EXP(-kr2)
858      w2 = w1*kr
859
860      f = f - w0*r1
861      d1 = d1 + (-w2 + w0)*r3
862      d2 = d2 + (w2*(3.0_dp + kr2*2.0_dp) - 3.0_dp*w0)*r5
863      d3 = d3 + (-w2*(15.0_dp + kr2*(10.0_dp + kr2*4.0_dp)) + 15.0_dp*w0)*r7
864      d4 = d4 + (w2*(105.0_dp + kr2*(70.0_dp + kr2*(28.0_dp + kr2*8.0_dp))) - 105.0_dp*w0)*r9
865      d5 = d5 + (-w2*(945.0_dp + kr2*(630.0_dp + kr2*(252.0_dp + kr2*(72.0_dp + kr2*16.0_dp)))) + 945.0_dp*w0)*r11
866
867      CALL build_d_tensor_gks(d1f, d2f, d3f, d4f, d5f, v, d1, d2, d3, d4, d5)
868
869      DO imA = 1, (sepi%natorb*(sepi%natorb + 1))/2
870         DO imB = 1, (sepj%natorb*(sepj%natorb + 1))/2
871
872            tmp = M0A(imA)*M0B(imB)
873            wv(1) = tmp*d1f(1)
874            wv(2) = tmp*d1f(2)
875            wv(3) = tmp*d1f(3)
876
877            DO k1 = 1, 3
878               tmp = M1A(k1, imA)*M0B(imB) - M0A(imA)*M1B(k1, imB)
879               wv(1) = wv(1) + tmp*d2f(1, k1)
880               wv(2) = wv(2) + tmp*d2f(2, k1)
881               wv(3) = wv(3) + tmp*d2f(3, k1)
882            ENDDO
883            DO k2 = 1, 3
884               DO k1 = 1, 3
885                  tmp = M2A(k1, k2, imA)*M0B(imB) - M1A(k1, imA)*M1B(k2, imB) + M0A(imA)*M2B(k1, k2, imB)
886                  wv(1) = wv(1) + tmp*d3f(1, k1, k2)
887                  wv(2) = wv(2) + tmp*d3f(2, k1, k2)
888                  wv(3) = wv(3) + tmp*d3f(3, k1, k2)
889               ENDDO
890            ENDDO
891            DO k3 = 1, 3
892               DO k2 = 1, 3
893                  DO k1 = 1, 3
894                     tmp = -M2A(k1, k2, imA)*M1B(k3, imB) + M1A(k1, imA)*M2B(k2, k3, imB)
895                     wv(1) = wv(1) + tmp*d4f(1, k1, k2, k3)
896                     wv(2) = wv(2) + tmp*d4f(2, k1, k2, k3)
897                     wv(3) = wv(3) + tmp*d4f(3, k1, k2, k3)
898                  ENDDO
899               ENDDO
900            ENDDO
901
902            DO k4 = 1, 3
903               DO k3 = 1, 3
904                  DO k2 = 1, 3
905                     DO k1 = 1, 3
906                        tmp = M2A(k1, k2, imA)*M2B(k3, k4, imB)
907                        wv(1) = wv(1) + tmp*d5f(1, k1, k2, k3, k4)
908                        wv(2) = wv(2) + tmp*d5f(2, k1, k2, k3, k4)
909                        wv(3) = wv(3) + tmp*d5f(3, k1, k2, k3, k4)
910                     ENDDO
911                  ENDDO
912               ENDDO
913            ENDDO
914
915            dCoul(1, imA, imB) = wv(1)
916            dCoul(2, imA, imB) = wv(2)
917            dCoul(3, imA, imB) = wv(3)
918         ENDDO
919      ENDDO
920
921      v(1) = RAB(1)
922      v(2) = RAB(2)
923      v(3) = RAB(3)
924
925      f = 0.0_dp
926      d1f = 0.0_dp
927      d2f = 0.0_dp
928      d3f = 0.0_dp
929      d4f = 0.0_dp
930      d5f = 0.0_dp
931
932      DO gpt = 1, pw_grid%ngpts_cut_local
933         lp = pw_grid%mapl%pos(pw_grid%g_hat(1, gpt))
934         mp = pw_grid%mapm%pos(pw_grid%g_hat(2, gpt))
935         np = pw_grid%mapn%pos(pw_grid%g_hat(3, gpt))
936
937         lp = lp + bds(1, 1)
938         mp = mp + bds(1, 2)
939         np = np + bds(1, 3)
940
941         IF (pw_grid%gsq(gpt) == 0.0_dp) CYCLE
942         kk(:) = pw_grid%g(:, gpt)
943         ff = 2.0_dp*fourpi*rho0(lp, mp, np)**2*pw_grid%vol/pw_grid%gsq(gpt)
944
945         kr = DOT_PRODUCT(kk, v)
946         cc = COS(kr)
947         ss = SIN(kr)
948
949         f = f + cc*ff
950         DO k1 = 1, 3
951            d1f(k1) = d1f(k1) - kk(k1)*ss*ff
952         ENDDO
953         DO k2 = 1, 3
954            DO k1 = 1, 3
955               d2f(k1, k2) = d2f(k1, k2) - kk(k1)*kk(k2)*cc*ff
956            ENDDO
957         ENDDO
958         DO k3 = 1, 3
959            DO k2 = 1, 3
960               DO k1 = 1, 3
961                  d3f(k1, k2, k3) = d3f(k1, k2, k3) + kk(k1)*kk(k2)*kk(k3)*ss*ff
962               ENDDO
963            ENDDO
964         ENDDO
965         DO k4 = 1, 3
966            DO k3 = 1, 3
967               DO k2 = 1, 3
968                  DO k1 = 1, 3
969                     d4f(k1, k2, k3, k4) = d4f(k1, k2, k3, k4) + kk(k1)*kk(k2)*kk(k3)*kk(k4)*cc*ff
970                  ENDDO
971               ENDDO
972            ENDDO
973         ENDDO
974         DO k5 = 1, 3
975            DO k4 = 1, 3
976               DO k3 = 1, 3
977                  DO k2 = 1, 3
978                     DO k1 = 1, 3
979                        d5f(k1, k2, k3, k4, k5) = d5f(k1, k2, k3, k4, k5) - kk(k1)*kk(k2)*kk(k3)*kk(k4)*kk(k5)*ss*ff
980                     ENDDO
981                  ENDDO
982               ENDDO
983            ENDDO
984         ENDDO
985      ENDDO
986
987      DO imA = 1, (sepi%natorb*(sepi%natorb + 1))/2
988         DO imB = 1, (sepj%natorb*(sepj%natorb + 1))/2
989            tmp = M0A(imA)*M0B(imB)
990            wv(1) = tmp*d1f(1)
991            wv(2) = tmp*d1f(2)
992            wv(3) = tmp*d1f(3)
993            DO k1 = 1, 3
994               tmp = M1A(k1, imA)*M0B(imB) - M0A(imA)*M1B(k1, imB)
995               wv(1) = wv(1) + tmp*d2f(1, k1)
996               wv(2) = wv(2) + tmp*d2f(2, k1)
997               wv(3) = wv(3) + tmp*d2f(3, k1)
998            ENDDO
999            DO k2 = 1, 3
1000               DO k1 = 1, 3
1001                  tmp = M2A(k1, k2, imA)*M0B(imB) - M1A(k1, imA)*M1B(k2, imB) + M0A(imA)*M2B(k1, k2, imB)
1002                  wv(1) = wv(1) + tmp*d3f(1, k1, k2)
1003                  wv(2) = wv(2) + tmp*d3f(2, k1, k2)
1004                  wv(3) = wv(3) + tmp*d3f(3, k1, k2)
1005               ENDDO
1006            ENDDO
1007            DO k3 = 1, 3
1008               DO k2 = 1, 3
1009                  DO k1 = 1, 3
1010                     tmp = -M2A(k1, k2, imA)*M1B(k3, imB) + M1A(k1, imA)*M2B(k2, k3, imB)
1011                     wv(1) = wv(1) + tmp*d4f(1, k1, k2, k3)
1012                     wv(2) = wv(2) + tmp*d4f(2, k1, k2, k3)
1013                     wv(3) = wv(3) + tmp*d4f(3, k1, k2, k3)
1014                  ENDDO
1015               ENDDO
1016            ENDDO
1017
1018            DO k4 = 1, 3
1019               DO k3 = 1, 3
1020                  DO k2 = 1, 3
1021                     DO k1 = 1, 3
1022                        tmp = M2A(k1, k2, imA)*M2B(k3, k4, imB)
1023                        wv(1) = wv(1) + tmp*d5f(1, k1, k2, k3, k4)
1024                        wv(2) = wv(2) + tmp*d5f(2, k1, k2, k3, k4)
1025                        wv(3) = wv(3) + tmp*d5f(3, k1, k2, k3, k4)
1026                     ENDDO
1027                  ENDDO
1028               ENDDO
1029            ENDDO
1030
1031            dCoul(1, imA, imB) = dCoul(1, imA, imB) + wv(1)
1032            dCoul(2, imA, imB) = dCoul(2, imA, imB) + wv(2)
1033            dCoul(3, imA, imB) = dCoul(3, imA, imB) + wv(3)
1034         ENDDO
1035      ENDDO
1036
1037   END SUBROUTINE makedCoulE
1038
1039! **************************************************************************************************
1040!> \brief Builds the tensor for the evaluation of the integrals with the
1041!>        cartesian multipoles
1042!> \param d1f ...
1043!> \param d2f ...
1044!> \param d3f ...
1045!> \param d4f ...
1046!> \param d5f ...
1047!> \param v ...
1048!> \param d1 ...
1049!> \param d2 ...
1050!> \param d3 ...
1051!> \param d4 ...
1052!> \param d5 ...
1053! **************************************************************************************************
1054   SUBROUTINE build_d_tensor_gks(d1f, d2f, d3f, d4f, d5f, v, d1, d2, d3, d4, d5)
1055      REAL(KIND=dp), DIMENSION(3), INTENT(OUT)           :: d1f
1056      REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT)        :: d2f
1057      REAL(KIND=dp), DIMENSION(3, 3, 3), INTENT(OUT)     :: d3f
1058      REAL(KIND=dp), DIMENSION(3, 3, 3, 3), INTENT(OUT)  :: d4f
1059      REAL(KIND=dp), DIMENSION(3, 3, 3, 3, 3), &
1060         INTENT(OUT), OPTIONAL                           :: d5f
1061      REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: v
1062      REAL(KIND=dp), INTENT(IN)                          :: d1, d2, d3, d4
1063      REAL(KIND=dp), INTENT(IN), OPTIONAL                :: d5
1064
1065      INTEGER                                            :: k1, k2, k3, k4, k5
1066      REAL(KIND=dp)                                      :: w
1067
1068      d1f = 0.0_dp
1069      d2f = 0.0_dp
1070      d3f = 0.0_dp
1071      d4f = 0.0_dp
1072      DO k1 = 1, 3
1073         d1f(k1) = d1f(k1) + v(k1)*d1
1074      ENDDO
1075      DO k1 = 1, 3
1076         DO k2 = 1, 3
1077            d2f(k2, k1) = d2f(k2, k1) + v(k1)*v(k2)*d2
1078         ENDDO
1079         d2f(k1, k1) = d2f(k1, k1) + d1
1080      ENDDO
1081      DO k1 = 1, 3
1082         DO k2 = 1, 3
1083            DO k3 = 1, 3
1084               d3f(k3, k2, k1) = d3f(k3, k2, k1) + v(k1)*v(k2)*v(k3)*d3
1085            ENDDO
1086            w = v(k1)*d2
1087            d3f(k1, k2, k2) = d3f(k1, k2, k2) + w
1088            d3f(k2, k1, k2) = d3f(k2, k1, k2) + w
1089            d3f(k2, k2, k1) = d3f(k2, k2, k1) + w
1090         ENDDO
1091      ENDDO
1092      DO k1 = 1, 3
1093         DO k2 = 1, 3
1094            DO k3 = 1, 3
1095               DO k4 = 1, 3
1096                  d4f(k4, k3, k2, k1) = d4f(k4, k3, k2, k1) + v(k1)*v(k2)*v(k3)*v(k4)*d4
1097               ENDDO
1098               w = v(k1)*v(k2)*d3
1099               d4f(k1, k2, k3, k3) = d4f(k1, k2, k3, k3) + w
1100               d4f(k1, k3, k2, k3) = d4f(k1, k3, k2, k3) + w
1101               d4f(k3, k1, k2, k3) = d4f(k3, k1, k2, k3) + w
1102               d4f(k1, k3, k3, k2) = d4f(k1, k3, k3, k2) + w
1103               d4f(k3, k1, k3, k2) = d4f(k3, k1, k3, k2) + w
1104               d4f(k3, k3, k1, k2) = d4f(k3, k3, k1, k2) + w
1105            ENDDO
1106            d4f(k1, k1, k2, k2) = d4f(k1, k1, k2, k2) + d2
1107            d4f(k1, k2, k1, k2) = d4f(k1, k2, k1, k2) + d2
1108            d4f(k1, k2, k2, k1) = d4f(k1, k2, k2, k1) + d2
1109         ENDDO
1110      ENDDO
1111      IF (PRESENT(d5f) .AND. PRESENT(d5)) THEN
1112         d5f = 0.0_dp
1113
1114         DO k1 = 1, 3
1115            DO k2 = 1, 3
1116               DO k3 = 1, 3
1117                  DO k4 = 1, 3
1118                     DO k5 = 1, 3
1119                        d5f(k5, k4, k3, k2, k1) = d5f(k5, k4, k3, k2, k1) + v(k1)*v(k2)*v(k3)*v(k4)*v(k5)*d5
1120                     ENDDO
1121                     w = v(k1)*v(k2)*v(k3)*d4
1122                     d5f(k1, k2, k3, k4, k4) = d5f(k1, k2, k3, k4, k4) + w
1123                     d5f(k1, k2, k4, k3, k4) = d5f(k1, k2, k4, k3, k4) + w
1124                     d5f(k1, k4, k2, k3, k4) = d5f(k1, k4, k2, k3, k4) + w
1125                     d5f(k4, k1, k2, k3, k4) = d5f(k4, k1, k2, k3, k4) + w
1126                     d5f(k1, k2, k4, k4, k3) = d5f(k1, k2, k4, k4, k3) + w
1127                     d5f(k1, k4, k2, k4, k3) = d5f(k1, k4, k2, k4, k3) + w
1128                     d5f(k4, k1, k2, k4, k3) = d5f(k4, k1, k2, k4, k3) + w
1129                     d5f(k1, k4, k4, k2, k3) = d5f(k1, k4, k4, k2, k3) + w
1130                     d5f(k4, k1, k4, k2, k3) = d5f(k4, k1, k4, k2, k3) + w
1131                     d5f(k4, k4, k1, k2, k3) = d5f(k4, k4, k1, k2, k3) + w
1132                  ENDDO
1133                  w = v(k1)*d3
1134                  d5f(k1, k2, k2, k3, k3) = d5f(k1, k2, k2, k3, k3) + w
1135                  d5f(k1, k2, k3, k2, k3) = d5f(k1, k2, k3, k2, k3) + w
1136                  d5f(k1, k2, k3, k3, k2) = d5f(k1, k2, k3, k3, k2) + w
1137                  d5f(k2, k1, k2, k3, k3) = d5f(k2, k1, k2, k3, k3) + w
1138                  d5f(k2, k1, k3, k2, k3) = d5f(k2, k1, k3, k2, k3) + w
1139                  d5f(k2, k1, k3, k3, k2) = d5f(k2, k1, k3, k3, k2) + w
1140                  d5f(k2, k2, k1, k3, k3) = d5f(k2, k2, k1, k3, k3) + w
1141                  d5f(k2, k3, k1, k2, k3) = d5f(k2, k3, k1, k2, k3) + w
1142                  d5f(k2, k3, k1, k3, k2) = d5f(k2, k3, k1, k3, k2) + w
1143                  d5f(k2, k2, k3, k1, k3) = d5f(k2, k2, k3, k1, k3) + w
1144                  d5f(k2, k3, k2, k1, k3) = d5f(k2, k3, k2, k1, k3) + w
1145                  d5f(k2, k3, k3, k1, k2) = d5f(k2, k3, k3, k1, k2) + w
1146                  d5f(k2, k2, k3, k3, k1) = d5f(k2, k2, k3, k3, k1) + w
1147                  d5f(k2, k3, k2, k3, k1) = d5f(k2, k3, k2, k3, k1) + w
1148                  d5f(k2, k3, k3, k2, k1) = d5f(k2, k3, k3, k2, k1) + w
1149               ENDDO
1150            ENDDO
1151         ENDDO
1152      END IF
1153   END SUBROUTINE build_d_tensor_gks
1154
1155! **************************************************************************************************
1156!> \brief ...
1157!> \param sepi ...
1158!> \param Coul ...
1159!> \param se_int_control ...
1160! **************************************************************************************************
1161   SUBROUTINE makeCoulE0(sepi, Coul, se_int_control)
1162      TYPE(semi_empirical_type), POINTER                 :: sepi
1163      REAL(KIND=dp), DIMENSION(45, 45), INTENT(OUT)      :: Coul
1164      TYPE(se_int_control_type), INTENT(IN)              :: se_int_control
1165
1166      CHARACTER(len=*), PARAMETER :: routineN = 'makeCoulE0', routineP = moduleN//':'//routineN
1167
1168      INTEGER                                            :: gpt, imA, imB, k1, k2, k3, k4, lp, mp, np
1169      INTEGER, DIMENSION(:, :), POINTER                  :: bds
1170      REAL(KIND=dp)                                      :: alpha, d2f(3, 3), d4f(3, 3, 3, 3), f, &
1171                                                            ff, w
1172      REAL(KIND=dp), DIMENSION(3)                        :: kk
1173      REAL(KIND=dp), DIMENSION(3, 3, 45)                 :: M2A
1174      REAL(KIND=dp), DIMENSION(3, 45)                    :: M1A
1175      REAL(KIND=dp), DIMENSION(45)                       :: M0A
1176      REAL(KIND=dp), DIMENSION(:, :, :), POINTER         :: rho0
1177      TYPE(dg_rho0_type), POINTER                        :: dg_rho0
1178      TYPE(dg_type), POINTER                             :: dg
1179      TYPE(pw_grid_type), POINTER                        :: pw_grid
1180      TYPE(pw_pool_type), POINTER                        :: pw_pool
1181
1182      alpha = se_int_control%ewald_gks%alpha
1183      pw_pool => se_int_control%ewald_gks%pw_pool
1184      dg => se_int_control%ewald_gks%dg
1185      CALL dg_get(dg, dg_rho0=dg_rho0)
1186      rho0 => dg_rho0%density%pw%cr3d
1187      pw_grid => pw_pool%pw_grid
1188      bds => pw_grid%bounds
1189
1190      CALL get_se_slater_multipole(sepi, M0A, M1A, M2A)
1191
1192      f = 0.0_dp
1193      d2f = 0.0_dp
1194      d4f = 0.0_dp
1195
1196      DO gpt = 1, pw_grid%ngpts_cut_local
1197         lp = pw_grid%mapl%pos(pw_grid%g_hat(1, gpt))
1198         mp = pw_grid%mapm%pos(pw_grid%g_hat(2, gpt))
1199         np = pw_grid%mapn%pos(pw_grid%g_hat(3, gpt))
1200
1201         lp = lp + bds(1, 1)
1202         mp = mp + bds(1, 2)
1203         np = np + bds(1, 3)
1204
1205         IF (pw_grid%gsq(gpt) == 0.0_dp) CYCLE
1206         kk(:) = pw_grid%g(:, gpt)
1207         ff = 2.0_dp*fourpi*rho0(lp, mp, np)**2*pw_grid%vol/pw_grid%gsq(gpt)
1208
1209         f = f + ff
1210         DO k2 = 1, 3
1211            DO k1 = 1, 3
1212               d2f(k1, k2) = d2f(k1, k2) - kk(k1)*kk(k2)*ff
1213            ENDDO
1214         ENDDO
1215         DO k4 = 1, 3
1216            DO k3 = 1, 3
1217               DO k2 = 1, 3
1218                  DO k1 = 1, 3
1219                     d4f(k1, k2, k3, k4) = d4f(k1, k2, k3, k4) + kk(k1)*kk(k2)*kk(k3)*kk(k4)*ff
1220                  ENDDO
1221               ENDDO
1222            ENDDO
1223         ENDDO
1224
1225      ENDDO
1226
1227      DO imA = 1, (sepi%natorb*(sepi%natorb + 1))/2
1228         DO imB = 1, (sepi%natorb*(sepi%natorb + 1))/2
1229
1230            w = M0A(imA)*M0A(imB)*f
1231            DO k2 = 1, 3
1232               DO k1 = 1, 3
1233                  w = w + (M2A(k1, k2, imA)*M0A(imB) - M1A(k1, imA)*M1A(k2, imB) + M0A(imA)*M2A(k1, k2, imB))*d2f(k1, k2)
1234               ENDDO
1235            ENDDO
1236
1237            DO k4 = 1, 3
1238               DO k3 = 1, 3
1239                  DO k2 = 1, 3
1240                     DO k1 = 1, 3
1241                        w = w + M2A(k1, k2, imA)*M2A(k3, k4, imB)*d4f(k1, k2, k3, k4)
1242                     ENDDO
1243                  ENDDO
1244               ENDDO
1245            ENDDO
1246
1247            Coul(imA, imB) = w
1248
1249         ENDDO
1250      ENDDO
1251
1252      DO imA = 1, (sepi%natorb*(sepi%natorb + 1))/2
1253         DO imB = 1, (sepi%natorb*(sepi%natorb + 1))/2
1254            w = -M0A(imA)*M0A(imB)*0.25_dp*fourpi/(pw_grid%vol*alpha**2)
1255            Coul(imA, imB) = Coul(imA, imB) + w
1256         ENDDO
1257      ENDDO
1258
1259      DO imA = 1, (sepi%natorb*(sepi%natorb + 1))/2
1260         DO imB = 1, (sepi%natorb*(sepi%natorb + 1))/2
1261
1262            w = M0A(imA)*M0A(imB)
1263            Coul(imA, imB) = Coul(imA, imB) - 2.0_dp*alpha*oorootpi*w
1264
1265            w = 0.0_dp
1266            DO k1 = 1, 3
1267               w = w + M1A(k1, imA)*M1A(k1, imB)
1268               w = w - M0A(imA)*M2A(k1, k1, imB)
1269               w = w - M2A(k1, k1, imA)*M0A(imB)
1270            ENDDO
1271            Coul(imA, imB) = Coul(imA, imB) - 4.0_dp*alpha**3*oorootpi*w/3.0_dp
1272
1273            w = 0.0_dp
1274            DO k2 = 1, 3
1275               DO k1 = 1, 3
1276                  w = w + 2.0_dp*M2A(k1, k2, imA)*M2A(k1, k2, imB)
1277                  w = w + M2A(k1, k1, imA)*M2A(k2, k2, imB)
1278               ENDDO
1279            ENDDO
1280            Coul(imA, imB) = Coul(imA, imB) - 8.0_dp*alpha**5*oorootpi*w/5.0_dp
1281         ENDDO
1282      ENDDO
1283   END SUBROUTINE makeCoulE0
1284
1285! **************************************************************************************************
1286!> \brief Retrieves the multipole for the Slater integral evaluation
1287!> \param sepi ...
1288!> \param M0 ...
1289!> \param M1 ...
1290!> \param M2 ...
1291!> \param ACOUL ...
1292! **************************************************************************************************
1293   SUBROUTINE get_se_slater_multipole(sepi, M0, M1, M2, ACOUL)
1294      TYPE(semi_empirical_type), POINTER                 :: sepi
1295      REAL(kind=dp), DIMENSION(45), INTENT(OUT)          :: M0
1296      REAL(kind=dp), DIMENSION(3, 45), INTENT(OUT)       :: M1
1297      REAL(kind=dp), DIMENSION(3, 3, 45), INTENT(OUT)    :: M2
1298      REAL(KIND=dp), INTENT(OUT), OPTIONAL               :: ACOUL
1299
1300      INTEGER                                            :: i, j, jint, size_1c_int
1301      TYPE(semi_empirical_mpole_type), POINTER           :: mpole
1302
1303      NULLIFY (mpole)
1304      size_1c_int = SIZE(sepi%w_mpole)
1305      DO jint = 1, size_1c_int
1306         mpole => sepi%w_mpole(jint)%mpole
1307         i = mpole%indi
1308         j = mpole%indj
1309         M0(indexb(i, j)) = -mpole%cs
1310
1311         M1(1, indexb(i, j)) = -mpole%ds(1)
1312         M1(2, indexb(i, j)) = -mpole%ds(2)
1313         M1(3, indexb(i, j)) = -mpole%ds(3)
1314
1315         M2(1, 1, indexb(i, j)) = -mpole%qq(1, 1)/3.0_dp
1316         M2(2, 1, indexb(i, j)) = -mpole%qq(2, 1)/3.0_dp
1317         M2(3, 1, indexb(i, j)) = -mpole%qq(3, 1)/3.0_dp
1318
1319         M2(1, 2, indexb(i, j)) = -mpole%qq(1, 2)/3.0_dp
1320         M2(2, 2, indexb(i, j)) = -mpole%qq(2, 2)/3.0_dp
1321         M2(3, 2, indexb(i, j)) = -mpole%qq(3, 2)/3.0_dp
1322
1323         M2(1, 3, indexb(i, j)) = -mpole%qq(1, 3)/3.0_dp
1324         M2(2, 3, indexb(i, j)) = -mpole%qq(2, 3)/3.0_dp
1325         M2(3, 3, indexb(i, j)) = -mpole%qq(3, 3)/3.0_dp
1326      ENDDO
1327      IF (PRESENT(ACOUL)) ACOUL = sepi%acoul
1328   END SUBROUTINE get_se_slater_multipole
1329
1330END MODULE semi_empirical_int_gks
1331