37 #include "./base/base_uses.f90"
42 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'semi_empirical_int_gks'
43 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .false.
58 SUBROUTINE rotnuc_gks(sepi, sepj, rij, e1b, e2a, se_int_control)
59 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
60 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rij
61 REAL(
dp),
DIMENSION(45),
INTENT(OUT),
OPTIONAL :: e1b, e2a
62 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
65 REAL(kind=
dp),
DIMENSION(3) :: rab
66 REAL(kind=
dp),
DIMENSION(45, 45) :: coul
70 IF (se_int_control%do_ewald_gks)
THEN
72 CALL makecoule(rab, sepi, sepj, coul, se_int_control)
74 CALL makecoule0(sepi, coul, se_int_control)
77 CALL makecoul(rab, sepi, sepj, coul, se_int_control)
81 DO mu = 1, sepi%natorb
84 e1b(i) = -coul(i, 1)*sepj%zeff
89 DO mu = 1, sepj%natorb
92 e2a(i) = -coul(1, i)*sepi%zeff
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
112 INTEGER :: i, ind1, ind2, lam, mu, nu, sig
113 REAL(kind=
dp),
DIMENSION(3) :: rab
114 REAL(kind=
dp),
DIMENSION(45, 45) :: coul
118 IF (se_int_control%do_ewald_gks)
THEN
120 CALL makecoule(rab, sepi, sepj, coul, se_int_control)
122 CALL makecoule0(sepi, coul, se_int_control)
125 CALL makecoul(rab, sepi, sepj, coul, se_int_control)
130 DO mu = 1, sepi%natorb
134 DO lam = 1, sepj%natorb
138 w(i) = coul(ind1, ind2)
155 SUBROUTINE drotnuc_gks(sepi, sepj, rij, de1b, de2a, se_int_control)
156 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
157 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rij
158 REAL(
dp),
DIMENSION(3, 45),
INTENT(OUT),
OPTIONAL :: de1b, de2a
159 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
162 REAL(kind=
dp),
DIMENSION(3) :: rab
163 REAL(kind=
dp),
DIMENSION(3, 45, 45) :: dcoul
167 IF (se_int_control%do_ewald_gks)
THEN
168 CALL makedcoule(rab, sepi, sepj, dcoul, se_int_control)
170 CALL makedcoul(rab, sepi, sepj, dcoul, se_int_control)
174 DO mu = 1, sepi%natorb
177 de1b(1, i) = dcoul(1, i, 1)*sepj%zeff
178 de1b(2, i) = dcoul(2, i, 1)*sepj%zeff
179 de1b(3, i) = dcoul(3, i, 1)*sepj%zeff
184 DO mu = 1, sepj%natorb
187 de2a(1, i) = dcoul(1, 1, i)*sepi%zeff
188 de2a(2, i) = dcoul(2, 1, i)*sepi%zeff
189 de2a(3, i) = dcoul(3, 1, i)*sepi%zeff
204 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
205 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rij
206 REAL(
dp),
DIMENSION(3, 2025),
INTENT(OUT) :: dw
207 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
209 INTEGER :: i, ind1, ind2, lam, mu, nu, sig
210 REAL(kind=
dp),
DIMENSION(3) :: rab
211 REAL(kind=
dp),
DIMENSION(3, 45, 45) :: dcoul
215 IF (se_int_control%do_ewald_gks)
THEN
216 CALL makedcoule(rab, sepi, sepj, dcoul, se_int_control)
218 CALL makedcoul(rab, sepi, sepj, dcoul, se_int_control)
223 DO mu = 1, sepi%natorb
227 DO lam = 1, sepj%natorb
231 dw(1, i) = -dcoul(1, ind1, ind2)
232 dw(2, i) = -dcoul(2, ind1, ind2)
233 dw(3, i) = -dcoul(3, ind1, ind2)
249 SUBROUTINE makecoul(RAB, sepi, sepj, Coul, se_int_control)
250 REAL(kind=
dp),
DIMENSION(3) :: rab
251 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
252 REAL(kind=
dp),
DIMENSION(45, 45),
INTENT(OUT) :: coul
253 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
255 INTEGER :: ia, ib, ima, imb, ja, jb, k1, k2, k3, k4
256 LOGICAL :: shortrange
257 REAL(kind=
dp) :: a2, acoula, acoulb, d1, d1f(3), d2, &
258 d2f(3, 3), d3, d3f(3, 3, 3), d4, &
259 d4f(3, 3, 3, 3), f, rr, w, w0, w1, w2, &
261 REAL(kind=
dp),
DIMENSION(3) :: v
262 REAL(kind=
dp),
DIMENSION(3, 3, 45) :: m2a, m2b
263 REAL(kind=
dp),
DIMENSION(3, 45) :: m1a, m1b
264 REAL(kind=
dp),
DIMENSION(45) :: m0a, m0b
266 shortrange = se_int_control%shortrange
267 CALL get_se_slater_multipole(sepi, m0a, m1a, m2a, acoula)
268 CALL get_se_slater_multipole(sepj, m0b, m1b, m2b, acoulb)
273 rr = sqrt(dot_product(v, v))
275 a2 = 0.5_dp*(1.0_dp/acoula + 1.0_dp/acoulb)
278 w1 = (1.0_dp + 0.5_dp*w0)
279 w2 = (w1 + 0.5_dp*w0 + 0.5_dp*w0**2)
280 w3 = (w2 + w0**3/6.0_dp)
281 w4 = (w3 + w0**4/30.0_dp)
282 w5 = (w3 + 8.0_dp*w0**4/210.0_dp + w0**5/210.0_dp)
286 d1 = -1.0_dp*(-w*w2)/rr**3
287 d2 = 3.0_dp*(-w*w3)/rr**5
288 d3 = -15.0_dp*(-w*w4)/rr**7
289 d4 = 105.0_dp*(-w*w5)/rr**9
291 f = (1.0_dp - w*w1)/rr
292 d1 = -1.0_dp*(1.0_dp - w*w2)/rr**3
293 d2 = 3.0_dp*(1.0_dp - w*w3)/rr**5
294 d3 = -15.0_dp*(1.0_dp - w*w4)/rr**7
295 d4 = 105.0_dp*(1.0_dp - w*w5)/rr**9
298 CALL build_d_tensor_gks(d1f, d2f, d3f, d4f, v=v, d1=d1, d2=d2, d3=d3, d4=d4)
301 DO ia = 1, sepi%natorb
306 DO ib = 1, sepj%natorb
310 w = m0a(ima)*m0b(imb)*f
312 w = w + (m1a(k1, ima)*m0b(imb) - m0a(ima)*m1b(k1, imb))*d1f(k1)
316 w = w + (m2a(k1, k2, ima)*m0b(imb) - m1a(k1, ima)*m1b(k2, imb) + m0a(ima)*m2b(k1, k2, imb))*d2f(k1, k2)
322 w = w + (-m2a(k1, k2, ima)*m1b(k3, imb) + m1a(k1, ima)*m2b(k2, k3, imb))*d3f(k1, k2, k3)
331 w = w + m2a(k1, k2, ima)*m2b(k3, k4, imb)*d4f(k1, k2, k3, k4)
343 END SUBROUTINE makecoul
354 SUBROUTINE makedcoul(RAB, sepi, sepj, dCoul, se_int_control)
355 REAL(kind=
dp),
DIMENSION(3) :: rab
356 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
357 REAL(kind=
dp),
DIMENSION(3, 45, 45),
INTENT(OUT) :: dcoul
358 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
360 INTEGER :: ia, ib, ima, imb, ja, jb, k1, k2, k3, k4
361 LOGICAL :: shortrange
362 REAL(kind=
dp) :: a2, acoula, acoulb, d1, d1f(3), d2, d2f(3, 3), d3, d3f(3, 3, 3), d4, &
363 d4f(3, 3, 3, 3), d5, d5f(3, 3, 3, 3, 3), f, rr, tmp, w, w0, w1, w2, w3, w4, w5, w6
364 REAL(kind=
dp),
DIMENSION(3) :: v, wv
365 REAL(kind=
dp),
DIMENSION(3, 3, 45) :: m2a, m2b
366 REAL(kind=
dp),
DIMENSION(3, 45) :: m1a, m1b
367 REAL(kind=
dp),
DIMENSION(45) :: m0a, m0b
369 shortrange = se_int_control%shortrange
370 CALL get_se_slater_multipole(sepi, m0a, m1a, m2a, acoula)
371 CALL get_se_slater_multipole(sepj, m0b, m1b, m2b, acoulb)
376 rr = sqrt(dot_product(v, v))
378 a2 = 0.5_dp*(1.0_dp/acoula + 1.0_dp/acoulb)
381 w1 = (1.0_dp + 0.5_dp*w0)
382 w2 = (w1 + 0.5_dp*w0 + 0.5_dp*w0**2)
383 w3 = (w2 + w0**3/6.0_dp)
384 w4 = (w3 + w0**4/30.0_dp)
385 w5 = (w3 + 4.0_dp*w0**4/105.0_dp + w0**5/210.0_dp)
386 w6 = (w3 + 15.0_dp*w0**4/378.0_dp + 2.0_dp*w0**5/315.0_dp + w0**6/1890.0_dp)
390 d1 = -1.0_dp*(-w*w2)/rr**3
391 d2 = 3.0_dp*(-w*w3)/rr**5
392 d3 = -15.0_dp*(-w*w4)/rr**7
393 d4 = 105.0_dp*(-w*w5)/rr**9
394 d5 = -945.0_dp*(-w*w6)/rr**11
396 f = (1.0_dp - w*w1)/rr
397 d1 = -1.0_dp*(1.0_dp - w*w2)/rr**3
398 d2 = 3.0_dp*(1.0_dp - w*w3)/rr**5
399 d3 = -15.0_dp*(1.0_dp - w*w4)/rr**7
400 d4 = 105.0_dp*(1.0_dp - w*w5)/rr**9
401 d5 = -945.0_dp*(1.0_dp - w*w6)/rr**11
404 CALL build_d_tensor_gks(d1f, d2f, d3f, d4f, d5f, v, d1, d2, d3, d4, d5)
407 DO ia = 1, sepi%natorb
412 DO ib = 1, sepj%natorb
416 tmp = m0a(ima)*m0b(imb)
421 tmp = m1a(k1, ima)*m0b(imb) - m0a(ima)*m1b(k1, imb)
422 wv(1) = wv(1) + tmp*d2f(1, k1)
423 wv(2) = wv(2) + tmp*d2f(2, k1)
424 wv(3) = wv(3) + tmp*d2f(3, k1)
428 tmp = m2a(k1, k2, ima)*m0b(imb) - m1a(k1, ima)*m1b(k2, imb) + m0a(ima)*m2b(k1, k2, imb)
429 wv(1) = wv(1) + tmp*d3f(1, k1, k2)
430 wv(2) = wv(2) + tmp*d3f(2, k1, k2)
431 wv(3) = wv(3) + tmp*d3f(3, k1, k2)
437 tmp = -m2a(k1, k2, ima)*m1b(k3, imb) + m1a(k1, ima)*m2b(k2, k3, imb)
438 wv(1) = wv(1) + tmp*d4f(1, k1, k2, k3)
439 wv(2) = wv(2) + tmp*d4f(2, k1, k2, k3)
440 wv(3) = wv(3) + tmp*d4f(3, k1, k2, k3)
449 tmp = m2a(k1, k2, ima)*m2b(k3, k4, imb)
450 wv(1) = wv(1) + tmp*d5f(1, k1, k2, k3, k4)
451 wv(2) = wv(2) + tmp*d5f(2, k1, k2, k3, k4)
452 wv(3) = wv(3) + tmp*d5f(3, k1, k2, k3, k4)
458 dcoul(1, ima, imb) = wv(1)
459 dcoul(2, ima, imb) = wv(2)
460 dcoul(3, ima, imb) = wv(3)
466 END SUBROUTINE makedcoul
478 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
479 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rijv
480 REAL(
dp),
INTENT(OUT),
OPTIONAL :: enuc
481 REAL(
dp),
DIMENSION(3),
INTENT(OUT),
OPTIONAL :: denuc
482 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
484 LOGICAL :: l_denuc, l_enuc
485 REAL(
dp) :: alpi, alpj, dscale, rij, scale, zz
486 REAL(kind=
dp),
DIMENSION(3, 45, 45) :: dcoul, dcoule
487 REAL(kind=
dp),
DIMENSION(45, 45) :: coul, coule
488 TYPE(se_int_control_type) :: se_int_control_off
490 rij = dot_product(rijv, rijv)
492 l_enuc =
PRESENT(enuc)
493 l_denuc =
PRESENT(denuc)
498 IF (se_int_control%shortrange)
THEN
500 do_ewald_gks=.false., integral_screening=se_int_control%integral_screening, &
502 CALL makecoul(rijv, sepi, sepj, coul, se_int_control_off)
503 IF (l_denuc)
CALL makedcoul(rijv, sepi, sepj, dcoul, se_int_control_off)
504 IF (se_int_control%do_ewald_gks)
THEN
505 CALL makecoule(rijv, sepi, sepj, coule, se_int_control)
506 IF (l_denuc)
CALL makedcoule(rijv, sepi, sepj, dcoule, se_int_control)
508 CALL makecoul(rijv, sepi, sepj, coule, se_int_control)
509 IF (l_denuc)
CALL makedcoul(rijv, sepi, sepj, dcoule, se_int_control)
512 CALL makecoul(rijv, sepi, sepj, coul, se_int_control)
514 IF (l_denuc)
CALL makedcoul(rijv, sepi, sepj, dcoul, se_int_control)
515 IF (l_denuc) dcoule = dcoul
520 zz = sepi%zeff*sepj%zeff
523 scale = exp(-alpi*rij) + exp(-alpj*rij)
525 enuc = zz*coule(1, 1) + scale*zz*coul(1, 1)
528 dscale = -alpi*exp(-alpi*rij) - alpj*exp(-alpj*rij)
529 denuc(1) = zz*dcoule(1, 1, 1) + dscale*(rijv(1)/rij)*zz*coul(1, 1) + scale*zz*dcoul(1, 1, 1)
530 denuc(2) = zz*dcoule(2, 1, 1) + dscale*(rijv(2)/rij)*zz*coul(1, 1) + scale*zz*dcoul(2, 1, 1)
531 denuc(3) = zz*dcoule(3, 1, 1) + dscale*(rijv(3)/rij)*zz*coul(1, 1) + scale*zz*dcoul(3, 1, 1)
536 IF (se_int_control%do_ewald_gks)
THEN
537 zz = sepi%zeff*sepi%zeff
538 CALL makecoule0(sepi, coule, se_int_control)
540 enuc = zz*coule(1, 1)
558 SUBROUTINE makecoule(RAB, sepi, sepj, Coul, se_int_control)
559 REAL(kind=
dp),
DIMENSION(3) :: rab
560 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
561 REAL(kind=
dp),
DIMENSION(45, 45),
INTENT(OUT) :: coul
562 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
564 INTEGER :: gpt, ima, imb, k1, k2, k3, k4, lp, mp, np
565 INTEGER,
DIMENSION(:, :),
POINTER :: bds
566 REAL(kind=
dp) :: a2, acoula, acoulb, alpha, cc, d1, d1f(3), d2, d2f(3, 3), d3, d3f(3, 3, 3), &
567 d4, d4f(3, 3, 3, 3), f, ff, kr, kr2, r1, r2, r3, r5, r7, r9, rr, ss, w, w0, w1, w2, w3, &
569 REAL(kind=
dp),
DIMENSION(3) :: kk, v
570 REAL(kind=
dp),
DIMENSION(3, 3, 45) :: m2a, m2b
571 REAL(kind=
dp),
DIMENSION(3, 45) :: m1a, m1b
572 REAL(kind=
dp),
DIMENSION(45) :: m0a, m0b
573 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: rho0
574 TYPE(dg_rho0_type),
POINTER :: dg_rho0
576 TYPE(pw_grid_type),
POINTER :: pw_grid
577 TYPE(pw_pool_type),
POINTER :: pw_pool
579 alpha = se_int_control%ewald_gks%alpha
580 pw_pool => se_int_control%ewald_gks%pw_pool
581 dg => se_int_control%ewald_gks%dg
582 CALL dg_get(dg, dg_rho0=dg_rho0)
583 rho0 => dg_rho0%density%array
584 pw_grid => pw_pool%pw_grid
585 bds => pw_grid%bounds
587 CALL get_se_slater_multipole(sepi, m0a, m1a, m2a, acoula)
588 CALL get_se_slater_multipole(sepj, m0b, m1b, m2b, acoulb)
593 rr = sqrt(dot_product(v, v))
602 a2 = 0.5_dp*(1.0_dp/acoula + 1.0_dp/acoulb)
606 w1 = (1.0_dp + 0.5_dp*w0)
607 w2 = (w1 + 0.5_dp*w0 + 0.5_dp*w0**2)
608 w3 = (w2 + w0**3/6.0_dp)
609 w4 = (w3 + w0**4/30.0_dp)
610 w5 = (w3 + 8.0_dp*w0**4/210.0_dp + w0**5/210.0_dp)
612 f = (1.0_dp - w*w1)*r1
613 d1 = -1.0_dp*(1.0_dp - w*w2)*r3
614 d2 = 3.0_dp*(1.0_dp - w*w3)*r5
615 d3 = -15.0_dp*(1.0_dp - w*w4)*r7
616 d4 = 105.0_dp*(1.0_dp - w*w5)*r9
620 w0 = 1.0_dp - erfc(kr)
625 d1 = d1 + (-w2 + w0)*r3
626 d2 = d2 + (w2*(3.0_dp + kr2*2.0_dp) - 3.0_dp*w0)*r5
627 d3 = d3 + (-w2*(15.0_dp + kr2*(10.0_dp + kr2*4.0_dp)) + 15.0_dp*w0)*r7
628 d4 = d4 + (w2*(105.0_dp + kr2*(70.0_dp + kr2*(28.0_dp + kr2*8.0_dp))) - 105.0_dp*w0)*r9
630 CALL build_d_tensor_gks(d1f, d2f, d3f, d4f, v=v, d1=d1, d2=d2, d3=d3, d4=d4)
632 DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
633 DO imb = 1, (sepj%natorb*(sepj%natorb + 1))/2
635 w = m0a(ima)*m0b(imb)*f
637 w = w + (m1a(k1, ima)*m0b(imb) - m0a(ima)*m1b(k1, imb))*d1f(k1)
641 w = w + (m2a(k1, k2, ima)*m0b(imb) - m1a(k1, ima)*m1b(k2, imb) + m0a(ima)*m2b(k1, k2, imb))*d2f(k1, k2)
647 w = w + (-m2a(k1, k2, ima)*m1b(k3, imb) + m1a(k1, ima)*m2b(k2, k3, imb))*d3f(k1, k2, k3)
656 w = w + m2a(k1, k2, ima)*m2b(k3, k4, imb)*d4f(k1, k2, k3, k4)
676 DO gpt = 1, pw_grid%ngpts_cut_local
677 lp = pw_grid%mapl%pos(pw_grid%g_hat(1, gpt))
678 mp = pw_grid%mapm%pos(pw_grid%g_hat(2, gpt))
679 np = pw_grid%mapn%pos(pw_grid%g_hat(3, gpt))
685 IF (pw_grid%gsq(gpt) == 0.0_dp) cycle
686 kk(:) = pw_grid%g(:, gpt)
687 ff = 2.0_dp*
fourpi*rho0(lp, mp, np)**2*pw_grid%vol/pw_grid%gsq(gpt)
689 kr = dot_product(kk, v)
695 d1f(k1) = d1f(k1) - kk(k1)*ss*ff
699 d2f(k1, k2) = d2f(k1, k2) - kk(k1)*kk(k2)*cc*ff
705 d3f(k1, k2, k3) = d3f(k1, k2, k3) + kk(k1)*kk(k2)*kk(k3)*ss*ff
713 d4f(k1, k2, k3, k4) = d4f(k1, k2, k3, k4) + kk(k1)*kk(k2)*kk(k3)*kk(k4)*cc*ff
721 DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
722 DO imb = 1, (sepj%natorb*(sepj%natorb + 1))/2
724 w = m0a(ima)*m0b(imb)*f
726 w = w + (m1a(k1, ima)*m0b(imb) - m0a(ima)*m1b(k1, imb))*d1f(k1)
730 w = w + (m2a(k1, k2, ima)*m0b(imb) - m1a(k1, ima)*m1b(k2, imb) + m0a(ima)*m2b(k1, k2, imb))*d2f(k1, k2)
736 w = w + (-m2a(k1, k2, ima)*m1b(k3, imb) + m1a(k1, ima)*m2b(k2, k3, imb))*d3f(k1, k2, k3)
745 w = w + m2a(k1, k2, ima)*m2b(k3, k4, imb)*d4f(k1, k2, k3, k4)
751 coul(ima, imb) = coul(ima, imb) + w
756 DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
757 DO imb = 1, (sepj%natorb*(sepj%natorb + 1))/2
758 w = -m0a(ima)*m0b(imb)*0.25_dp*
fourpi/(pw_grid%vol*alpha**2)
759 coul(ima, imb) = coul(ima, imb) + w
763 END SUBROUTINE makecoule
774 SUBROUTINE makedcoule(RAB, sepi, sepj, dCoul, se_int_control)
775 REAL(kind=
dp),
DIMENSION(3) :: rab
776 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
777 REAL(kind=
dp),
DIMENSION(3, 45, 45),
INTENT(OUT) :: dcoul
778 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
780 INTEGER :: gpt, ima, imb, k1, k2, k3, k4, k5, lp, &
782 INTEGER,
DIMENSION(:, :),
POINTER :: bds
783 REAL(kind=
dp) :: a2, acoula, acoulb, alpha, cc, d1, d1f(3), d2, d2f(3, 3), d3, d3f(3, 3, 3), &
784 d4, d4f(3, 3, 3, 3), d5, d5f(3, 3, 3, 3, 3), f, ff, kr, kr2, r1, r11, r2, r3, r5, r7, r9, &
785 rr, ss, tmp, w, w0, w1, w2, w3, w4, w5, w6
786 REAL(kind=
dp),
DIMENSION(3) :: kk, v, wv
787 REAL(kind=
dp),
DIMENSION(3, 3, 45) :: m2a, m2b
788 REAL(kind=
dp),
DIMENSION(3, 45) :: m1a, m1b
789 REAL(kind=
dp),
DIMENSION(45) :: m0a, m0b
790 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: rho0
791 TYPE(dg_rho0_type),
POINTER :: dg_rho0
793 TYPE(pw_grid_type),
POINTER :: pw_grid
794 TYPE(pw_pool_type),
POINTER :: pw_pool
796 alpha = se_int_control%ewald_gks%alpha
797 pw_pool => se_int_control%ewald_gks%pw_pool
798 dg => se_int_control%ewald_gks%dg
799 CALL dg_get(dg, dg_rho0=dg_rho0)
800 rho0 => dg_rho0%density%array
801 pw_grid => pw_pool%pw_grid
802 bds => pw_grid%bounds
804 CALL get_se_slater_multipole(sepi, m0a, m1a, m2a, acoula)
805 CALL get_se_slater_multipole(sepj, m0b, m1b, m2b, acoulb)
810 rr = sqrt(dot_product(v, v))
812 a2 = 0.5_dp*(1.0_dp/acoula + 1.0_dp/acoulb)
824 w1 = (1.0_dp + 0.5_dp*w0)
825 w2 = (w1 + 0.5_dp*w0 + 0.5_dp*w0**2)
826 w3 = (w2 + w0**3/6.0_dp)
827 w4 = (w3 + w0**4/30.0_dp)
828 w5 = (w3 + 8.0_dp*w0**4/210.0_dp + w0**5/210.0_dp)
829 w6 = (w3 + 5.0_dp*w0**4/126.0_dp + 2.0_dp*w0**5/315.0_dp + w0**6/1890.0_dp)
831 f = (1.0_dp - w*w1)*r1
832 d1 = -1.0_dp*(1.0_dp - w*w2)*r3
833 d2 = 3.0_dp*(1.0_dp - w*w3)*r5
834 d3 = -15.0_dp*(1.0_dp - w*w4)*r7
835 d4 = 105.0_dp*(1.0_dp - w*w5)*r9
836 d5 = -945.0_dp*(1.0_dp - w*w6)*r11
840 w0 = 1.0_dp - erfc(kr)
845 d1 = d1 + (-w2 + w0)*r3
846 d2 = d2 + (w2*(3.0_dp + kr2*2.0_dp) - 3.0_dp*w0)*r5
847 d3 = d3 + (-w2*(15.0_dp + kr2*(10.0_dp + kr2*4.0_dp)) + 15.0_dp*w0)*r7
848 d4 = d4 + (w2*(105.0_dp + kr2*(70.0_dp + kr2*(28.0_dp + kr2*8.0_dp))) - 105.0_dp*w0)*r9
849 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
851 CALL build_d_tensor_gks(d1f, d2f, d3f, d4f, d5f, v, d1, d2, d3, d4, d5)
853 DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
854 DO imb = 1, (sepj%natorb*(sepj%natorb + 1))/2
856 tmp = m0a(ima)*m0b(imb)
862 tmp = m1a(k1, ima)*m0b(imb) - m0a(ima)*m1b(k1, imb)
863 wv(1) = wv(1) + tmp*d2f(1, k1)
864 wv(2) = wv(2) + tmp*d2f(2, k1)
865 wv(3) = wv(3) + tmp*d2f(3, k1)
869 tmp = m2a(k1, k2, ima)*m0b(imb) - m1a(k1, ima)*m1b(k2, imb) + m0a(ima)*m2b(k1, k2, imb)
870 wv(1) = wv(1) + tmp*d3f(1, k1, k2)
871 wv(2) = wv(2) + tmp*d3f(2, k1, k2)
872 wv(3) = wv(3) + tmp*d3f(3, k1, k2)
878 tmp = -m2a(k1, k2, ima)*m1b(k3, imb) + m1a(k1, ima)*m2b(k2, k3, imb)
879 wv(1) = wv(1) + tmp*d4f(1, k1, k2, k3)
880 wv(2) = wv(2) + tmp*d4f(2, k1, k2, k3)
881 wv(3) = wv(3) + tmp*d4f(3, k1, k2, k3)
890 tmp = m2a(k1, k2, ima)*m2b(k3, k4, imb)
891 wv(1) = wv(1) + tmp*d5f(1, k1, k2, k3, k4)
892 wv(2) = wv(2) + tmp*d5f(2, k1, k2, k3, k4)
893 wv(3) = wv(3) + tmp*d5f(3, k1, k2, k3, k4)
899 dcoul(1, ima, imb) = wv(1)
900 dcoul(2, ima, imb) = wv(2)
901 dcoul(3, ima, imb) = wv(3)
916 DO gpt = 1, pw_grid%ngpts_cut_local
917 lp = pw_grid%mapl%pos(pw_grid%g_hat(1, gpt))
918 mp = pw_grid%mapm%pos(pw_grid%g_hat(2, gpt))
919 np = pw_grid%mapn%pos(pw_grid%g_hat(3, gpt))
925 IF (pw_grid%gsq(gpt) == 0.0_dp) cycle
926 kk(:) = pw_grid%g(:, gpt)
927 ff = 2.0_dp*
fourpi*rho0(lp, mp, np)**2*pw_grid%vol/pw_grid%gsq(gpt)
929 kr = dot_product(kk, v)
935 d1f(k1) = d1f(k1) - kk(k1)*ss*ff
939 d2f(k1, k2) = d2f(k1, k2) - kk(k1)*kk(k2)*cc*ff
945 d3f(k1, k2, k3) = d3f(k1, k2, k3) + kk(k1)*kk(k2)*kk(k3)*ss*ff
953 d4f(k1, k2, k3, k4) = d4f(k1, k2, k3, k4) + kk(k1)*kk(k2)*kk(k3)*kk(k4)*cc*ff
963 d5f(k1, k2, k3, k4, k5) = d5f(k1, k2, k3, k4, k5) - kk(k1)*kk(k2)*kk(k3)*kk(k4)*kk(k5)*ss*ff
971 DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
972 DO imb = 1, (sepj%natorb*(sepj%natorb + 1))/2
973 tmp = m0a(ima)*m0b(imb)
978 tmp = m1a(k1, ima)*m0b(imb) - m0a(ima)*m1b(k1, imb)
979 wv(1) = wv(1) + tmp*d2f(1, k1)
980 wv(2) = wv(2) + tmp*d2f(2, k1)
981 wv(3) = wv(3) + tmp*d2f(3, k1)
985 tmp = m2a(k1, k2, ima)*m0b(imb) - m1a(k1, ima)*m1b(k2, imb) + m0a(ima)*m2b(k1, k2, imb)
986 wv(1) = wv(1) + tmp*d3f(1, k1, k2)
987 wv(2) = wv(2) + tmp*d3f(2, k1, k2)
988 wv(3) = wv(3) + tmp*d3f(3, k1, k2)
994 tmp = -m2a(k1, k2, ima)*m1b(k3, imb) + m1a(k1, ima)*m2b(k2, k3, imb)
995 wv(1) = wv(1) + tmp*d4f(1, k1, k2, k3)
996 wv(2) = wv(2) + tmp*d4f(2, k1, k2, k3)
997 wv(3) = wv(3) + tmp*d4f(3, k1, k2, k3)
1006 tmp = m2a(k1, k2, ima)*m2b(k3, k4, imb)
1007 wv(1) = wv(1) + tmp*d5f(1, k1, k2, k3, k4)
1008 wv(2) = wv(2) + tmp*d5f(2, k1, k2, k3, k4)
1009 wv(3) = wv(3) + tmp*d5f(3, k1, k2, k3, k4)
1015 dcoul(1, ima, imb) = dcoul(1, ima, imb) + wv(1)
1016 dcoul(2, ima, imb) = dcoul(2, ima, imb) + wv(2)
1017 dcoul(3, ima, imb) = dcoul(3, ima, imb) + wv(3)
1021 END SUBROUTINE makedcoule
1038 SUBROUTINE build_d_tensor_gks(d1f, d2f, d3f, d4f, d5f, v, d1, d2, d3, d4, d5)
1039 REAL(kind=
dp),
DIMENSION(3),
INTENT(OUT) :: d1f
1040 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT) :: d2f
1041 REAL(kind=
dp),
DIMENSION(3, 3, 3),
INTENT(OUT) :: d3f
1042 REAL(kind=
dp),
DIMENSION(3, 3, 3, 3),
INTENT(OUT) :: d4f
1043 REAL(kind=
dp),
DIMENSION(3, 3, 3, 3, 3), &
1044 INTENT(OUT),
OPTIONAL :: d5f
1045 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: v
1046 REAL(kind=
dp),
INTENT(IN) :: d1, d2, d3, d4
1047 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: d5
1049 INTEGER :: k1, k2, k3, k4, k5
1057 d1f(k1) = d1f(k1) + v(k1)*d1
1061 d2f(k2, k1) = d2f(k2, k1) + v(k1)*v(k2)*d2
1063 d2f(k1, k1) = d2f(k1, k1) + d1
1068 d3f(k3, k2, k1) = d3f(k3, k2, k1) + v(k1)*v(k2)*v(k3)*d3
1071 d3f(k1, k2, k2) = d3f(k1, k2, k2) + w
1072 d3f(k2, k1, k2) = d3f(k2, k1, k2) + w
1073 d3f(k2, k2, k1) = d3f(k2, k2, k1) + w
1080 d4f(k4, k3, k2, k1) = d4f(k4, k3, k2, k1) + v(k1)*v(k2)*v(k3)*v(k4)*d4
1083 d4f(k1, k2, k3, k3) = d4f(k1, k2, k3, k3) + w
1084 d4f(k1, k3, k2, k3) = d4f(k1, k3, k2, k3) + w
1085 d4f(k3, k1, k2, k3) = d4f(k3, k1, k2, k3) + w
1086 d4f(k1, k3, k3, k2) = d4f(k1, k3, k3, k2) + w
1087 d4f(k3, k1, k3, k2) = d4f(k3, k1, k3, k2) + w
1088 d4f(k3, k3, k1, k2) = d4f(k3, k3, k1, k2) + w
1090 d4f(k1, k1, k2, k2) = d4f(k1, k1, k2, k2) + d2
1091 d4f(k1, k2, k1, k2) = d4f(k1, k2, k1, k2) + d2
1092 d4f(k1, k2, k2, k1) = d4f(k1, k2, k2, k1) + d2
1095 IF (
PRESENT(d5f) .AND.
PRESENT(d5))
THEN
1103 d5f(k5, k4, k3, k2, k1) = d5f(k5, k4, k3, k2, k1) + v(k1)*v(k2)*v(k3)*v(k4)*v(k5)*d5
1105 w = v(k1)*v(k2)*v(k3)*d4
1106 d5f(k1, k2, k3, k4, k4) = d5f(k1, k2, k3, k4, k4) + w
1107 d5f(k1, k2, k4, k3, k4) = d5f(k1, k2, k4, k3, k4) + w
1108 d5f(k1, k4, k2, k3, k4) = d5f(k1, k4, k2, k3, k4) + w
1109 d5f(k4, k1, k2, k3, k4) = d5f(k4, k1, k2, k3, k4) + w
1110 d5f(k1, k2, k4, k4, k3) = d5f(k1, k2, k4, k4, k3) + w
1111 d5f(k1, k4, k2, k4, k3) = d5f(k1, k4, k2, k4, k3) + w
1112 d5f(k4, k1, k2, k4, k3) = d5f(k4, k1, k2, k4, k3) + w
1113 d5f(k1, k4, k4, k2, k3) = d5f(k1, k4, k4, k2, k3) + w
1114 d5f(k4, k1, k4, k2, k3) = d5f(k4, k1, k4, k2, k3) + w
1115 d5f(k4, k4, k1, k2, k3) = d5f(k4, k4, k1, k2, k3) + w
1118 d5f(k1, k2, k2, k3, k3) = d5f(k1, k2, k2, k3, k3) + w
1119 d5f(k1, k2, k3, k2, k3) = d5f(k1, k2, k3, k2, k3) + w
1120 d5f(k1, k2, k3, k3, k2) = d5f(k1, k2, k3, k3, k2) + w
1121 d5f(k2, k1, k2, k3, k3) = d5f(k2, k1, k2, k3, k3) + w
1122 d5f(k2, k1, k3, k2, k3) = d5f(k2, k1, k3, k2, k3) + w
1123 d5f(k2, k1, k3, k3, k2) = d5f(k2, k1, k3, k3, k2) + w
1124 d5f(k2, k2, k1, k3, k3) = d5f(k2, k2, k1, k3, k3) + w
1125 d5f(k2, k3, k1, k2, k3) = d5f(k2, k3, k1, k2, k3) + w
1126 d5f(k2, k3, k1, k3, k2) = d5f(k2, k3, k1, k3, k2) + w
1127 d5f(k2, k2, k3, k1, k3) = d5f(k2, k2, k3, k1, k3) + w
1128 d5f(k2, k3, k2, k1, k3) = d5f(k2, k3, k2, k1, k3) + w
1129 d5f(k2, k3, k3, k1, k2) = d5f(k2, k3, k3, k1, k2) + w
1130 d5f(k2, k2, k3, k3, k1) = d5f(k2, k2, k3, k3, k1) + w
1131 d5f(k2, k3, k2, k3, k1) = d5f(k2, k3, k2, k3, k1) + w
1132 d5f(k2, k3, k3, k2, k1) = d5f(k2, k3, k3, k2, k1) + w
1137 END SUBROUTINE build_d_tensor_gks
1145 SUBROUTINE makecoule0(sepi, Coul, se_int_control)
1146 TYPE(semi_empirical_type),
POINTER :: sepi
1147 REAL(kind=
dp),
DIMENSION(45, 45),
INTENT(OUT) :: coul
1148 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
1150 INTEGER :: gpt, ima, imb, k1, k2, k3, k4, lp, mp, np
1151 INTEGER,
DIMENSION(:, :),
POINTER :: bds
1152 REAL(kind=
dp) :: alpha, d2f(3, 3), d4f(3, 3, 3, 3), f, &
1154 REAL(kind=
dp),
DIMENSION(3) :: kk
1155 REAL(kind=
dp),
DIMENSION(3, 3, 45) :: m2a
1156 REAL(kind=
dp),
DIMENSION(3, 45) :: m1a
1157 REAL(kind=
dp),
DIMENSION(45) :: m0a
1158 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: rho0
1159 TYPE(dg_rho0_type),
POINTER :: dg_rho0
1161 TYPE(pw_grid_type),
POINTER :: pw_grid
1162 TYPE(pw_pool_type),
POINTER :: pw_pool
1164 alpha = se_int_control%ewald_gks%alpha
1165 pw_pool => se_int_control%ewald_gks%pw_pool
1166 dg => se_int_control%ewald_gks%dg
1167 CALL dg_get(dg, dg_rho0=dg_rho0)
1168 rho0 => dg_rho0%density%array
1169 pw_grid => pw_pool%pw_grid
1170 bds => pw_grid%bounds
1172 CALL get_se_slater_multipole(sepi, m0a, m1a, m2a)
1178 DO gpt = 1, pw_grid%ngpts_cut_local
1179 lp = pw_grid%mapl%pos(pw_grid%g_hat(1, gpt))
1180 mp = pw_grid%mapm%pos(pw_grid%g_hat(2, gpt))
1181 np = pw_grid%mapn%pos(pw_grid%g_hat(3, gpt))
1187 IF (pw_grid%gsq(gpt) == 0.0_dp) cycle
1188 kk(:) = pw_grid%g(:, gpt)
1189 ff = 2.0_dp*
fourpi*rho0(lp, mp, np)**2*pw_grid%vol/pw_grid%gsq(gpt)
1194 d2f(k1, k2) = d2f(k1, k2) - kk(k1)*kk(k2)*ff
1201 d4f(k1, k2, k3, k4) = d4f(k1, k2, k3, k4) + kk(k1)*kk(k2)*kk(k3)*kk(k4)*ff
1209 DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
1210 DO imb = 1, (sepi%natorb*(sepi%natorb + 1))/2
1212 w = m0a(ima)*m0a(imb)*f
1215 w = w + (m2a(k1, k2, ima)*m0a(imb) - m1a(k1, ima)*m1a(k2, imb) + m0a(ima)*m2a(k1, k2, imb))*d2f(k1, k2)
1223 w = w + m2a(k1, k2, ima)*m2a(k3, k4, imb)*d4f(k1, k2, k3, k4)
1234 DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
1235 DO imb = 1, (sepi%natorb*(sepi%natorb + 1))/2
1236 w = -m0a(ima)*m0a(imb)*0.25_dp*
fourpi/(pw_grid%vol*alpha**2)
1237 coul(ima, imb) = coul(ima, imb) + w
1241 DO ima = 1, (sepi%natorb*(sepi%natorb + 1))/2
1242 DO imb = 1, (sepi%natorb*(sepi%natorb + 1))/2
1244 w = m0a(ima)*m0a(imb)
1245 coul(ima, imb) = coul(ima, imb) - 2.0_dp*alpha*
oorootpi*w
1249 w = w + m1a(k1, ima)*m1a(k1, imb)
1250 w = w - m0a(ima)*m2a(k1, k1, imb)
1251 w = w - m2a(k1, k1, ima)*m0a(imb)
1253 coul(ima, imb) = coul(ima, imb) - 4.0_dp*alpha**3*
oorootpi*w/3.0_dp
1258 w = w + 2.0_dp*m2a(k1, k2, ima)*m2a(k1, k2, imb)
1259 w = w + m2a(k1, k1, ima)*m2a(k2, k2, imb)
1262 coul(ima, imb) = coul(ima, imb) - 8.0_dp*alpha**5*
oorootpi*w/5.0_dp
1265 END SUBROUTINE makecoule0
1275 SUBROUTINE get_se_slater_multipole(sepi, M0, M1, M2, ACOUL)
1276 TYPE(semi_empirical_type),
POINTER :: sepi
1277 REAL(kind=
dp),
DIMENSION(45),
INTENT(OUT) :: m0
1278 REAL(kind=
dp),
DIMENSION(3, 45),
INTENT(OUT) :: m1
1279 REAL(kind=
dp),
DIMENSION(3, 3, 45),
INTENT(OUT) :: m2
1280 REAL(kind=
dp),
INTENT(OUT),
OPTIONAL :: acoul
1282 INTEGER :: i, j, jint, size_1c_int
1283 TYPE(semi_empirical_mpole_type),
POINTER :: mpole
1286 size_1c_int =
SIZE(sepi%w_mpole)
1287 DO jint = 1, size_1c_int
1288 mpole => sepi%w_mpole(jint)%mpole
1291 m0(
indexb(i, j)) = -mpole%cs
1293 m1(1,
indexb(i, j)) = -mpole%ds(1)
1294 m1(2,
indexb(i, j)) = -mpole%ds(2)
1295 m1(3,
indexb(i, j)) = -mpole%ds(3)
1297 m2(1, 1,
indexb(i, j)) = -mpole%qq(1, 1)/3.0_dp
1298 m2(2, 1,
indexb(i, j)) = -mpole%qq(2, 1)/3.0_dp
1299 m2(3, 1,
indexb(i, j)) = -mpole%qq(3, 1)/3.0_dp
1301 m2(1, 2,
indexb(i, j)) = -mpole%qq(1, 2)/3.0_dp
1302 m2(2, 2,
indexb(i, j)) = -mpole%qq(2, 2)/3.0_dp
1303 m2(3, 2,
indexb(i, j)) = -mpole%qq(3, 2)/3.0_dp
1305 m2(1, 3,
indexb(i, j)) = -mpole%qq(1, 3)/3.0_dp
1306 m2(2, 3,
indexb(i, j)) = -mpole%qq(2, 3)/3.0_dp
1307 m2(3, 3,
indexb(i, j)) = -mpole%qq(3, 3)/3.0_dp
1309 IF (
PRESENT(acoul)) acoul = sepi%acoul
1310 END SUBROUTINE get_se_slater_multipole
subroutine, public dg_get(dg, dg_rho0)
Get the dg_type.
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), parameter, public oorootpi
real(kind=dp), parameter, public fourpi
Multipole structure: for multipole (fixed and induced) in FF based MD.
integer, parameter, public do_multipole_none
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Arrays of parameters used in the semi-empirical calculations \References Everywhere in this module TC...
real(kind=dp), parameter, public rij_threshold
integer, dimension(9, 9), public indexb
Integral GKS scheme: The order of the integrals in makeCoul reflects the standard order by MOPAC.
subroutine, public drotnuc_gks(sepi, sepj, rij, de1b, de2a, se_int_control)
Computes the derivatives of the electron-nuclei integrals.
subroutine, public corecore_gks(sepi, sepj, rijv, enuc, denuc, se_int_control)
Computes nuclei-nuclei interactions.
subroutine, public drotint_gks(sepi, sepj, rij, dw, se_int_control)
Computes the derivatives of the electron-electron integrals.
subroutine, public rotnuc_gks(sepi, sepj, rij, e1b, e2a, se_int_control)
Computes the electron-nuclei integrals.
subroutine, public rotint_gks(sepi, sepj, rij, w, se_int_control)
Computes the electron-electron integrals.
Definition of the semi empirical multipole integral expansions types.
Definition of the semi empirical parameter types.
subroutine, public setup_se_int_control_type(se_int_control, shortrange, do_ewald_r3, do_ewald_gks, integral_screening, max_multipole, pc_coulomb_int)
Setup the Semiempirical integral control type.