47 #include "./base/base_uses.f90"
53 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .false.
54 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'semi_empirical_int_num'
76 SUBROUTINE rotint_num(sepi, sepj, rijv, w, se_int_control, se_taper)
77 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
78 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rijv
79 REAL(
dp),
DIMENSION(2025),
INTENT(OUT) :: w
80 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
81 TYPE(se_taper_type),
POINTER :: se_taper
83 INTEGER :: i, i1, ii, ij, ij1, iminus, istep, &
84 iw_loc, j, j1, jj, k, kk, kl, l, &
86 LOGICAL,
DIMENSION(45, 45) :: logv
88 REAL(kind=
dp) :: cc, wrepp
89 REAL(kind=
dp),
DIMENSION(2025) :: ww
90 REAL(kind=
dp),
DIMENSION(45, 45) :: v
91 REAL(kind=
dp),
DIMENSION(491) :: rep
92 TYPE(rotmat_type),
POINTER :: ij_matrix
95 rij = dot_product(rijv, rijv)
105 CALL rotmat(sepi, sepj, rijv, rij, ij_matrix, do_derivatives=.false.)
108 CALL terep_num(sepi, sepj, rij, rep, se_taper=se_taper, se_int_control=se_int_control)
114 limij = sepi%atm_int_size
115 limkl = sepj%atm_int_size
122 CALL rot_2el_2c_first(sepi, sepj, rijv, se_int_control, se_taper, .false., ii, kk, rep, &
123 logv, ij_matrix, v, lgrad=.false.)
134 IF (logv(ij, kl))
THEN
141 iw_loc = (
indexb(i, j) - 1)*limkl + kl
147 iw_loc = (
indexb(i + 1, j) - 1)*limkl + kl
148 ww(iw_loc) = ww(iw_loc) + ij_matrix%sp(i1 - 1, i)*wrepp
153 cc = ij_matrix%pp(i, i1 - 1, j1 - 1)
154 iw_loc = (
indexb(i + 1, i + 1) - 1)*limkl + kl
155 ww(iw_loc) = ww(iw_loc) + cc*wrepp
157 IF (iminus /= 0)
THEN
159 cc = ij_matrix%pp(1 + i + j, i1 - 1, j1 - 1)
160 iw_loc = (
indexb(i + 1, j + 1) - 1)*limkl + kl
161 ww(iw_loc) = ww(iw_loc) + cc*wrepp
169 iw_loc = (
indexb(i + 4, j) - 1)*limkl + kl
170 ww(iw_loc) = ww(iw_loc) + ij_matrix%sd(i1 - 4, i)*wrepp
176 iw_loc = (
indexb(i + 4, j + 1) - 1)*limkl + kl
178 ww(iw_loc) = ww(iw_loc) + ij_matrix%pd(ij1, i1 - 4, j1 - 1)*wrepp
184 cc = ij_matrix%dd(i, i1 - 4, j1 - 4)
185 iw_loc = (
indexb(i + 4, i + 4) - 1)*limkl + kl
186 ww(iw_loc) = ww(iw_loc) + cc*wrepp
188 IF (iminus /= 0)
THEN
191 cc = ij_matrix%dd(ij1, i1 - 4, j1 - 4)
192 iw_loc = (
indexb(i + 4, j + 4) - 1)*limkl + kl
193 ww(iw_loc) = ww(iw_loc) + cc*wrepp
225 SUBROUTINE terep_num(sepi, sepj, rij, rep, se_taper, se_int_control)
226 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
227 REAL(
dp),
INTENT(IN) :: rij
228 REAL(
dp),
DIMENSION(491),
INTENT(OUT) :: rep
229 TYPE(se_taper_type),
POINTER :: se_taper
230 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
233 TYPE(se_int_screen_type) :: se_int_screen
238 se_int_screen%ft =
taper_eval(se_taper%taper_add, rij)
242 CALL terep_sp_num(sepi, sepj, rij, rep, se_int_control, se_int_screen, ft)
244 IF (sepi%dorb .OR. sepj%dorb)
THEN
246 CALL terep_d_num(sepi, sepj, rij, rep, se_int_control, se_int_screen, &
267 SUBROUTINE terep_sp_num(sepi, sepj, rij, rep, se_int_control, se_int_screen, &
269 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
270 REAL(
dp),
INTENT(IN) :: rij
271 REAL(
dp),
DIMENSION(491),
INTENT(OUT) :: rep
272 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
273 TYPE(se_int_screen_type),
INTENT(IN) :: se_int_screen
274 REAL(
dp),
INTENT(IN) :: ft
276 INTEGER :: i, ij, j, k, kl, l, lasti, lastj, li, &
277 lj, lk, ll, nold, numb
282 DO i = 1, min(lasti, 4)
287 DO k = 1, min(lastj, 4)
297 rep(numb) = rep(nold)
298 ELSE IF (nold < 0)
THEN
299 rep(numb) = -rep(-nold)
300 ELSE IF (nold == 0)
THEN
301 tmp =
ijkl_sp(sepi, sepj, ij, kl, li, lj, lk, ll, 0, rij, &
328 SUBROUTINE terep_d_num(sepi, sepj, rij, rep, se_int_control, se_int_screen, &
330 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
331 REAL(
dp),
INTENT(IN) :: rij
332 REAL(
dp),
DIMENSION(491),
INTENT(INOUT) :: rep
333 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
334 TYPE(se_int_screen_type),
INTENT(IN) :: se_int_screen
335 REAL(
dp),
INTENT(IN) :: ft
337 INTEGER :: i, ij, j, k, kl, l, lasti, lastj, li, &
338 lj, lk, ll, nold, numb
359 rep(numb) = rep(nold)
360 ELSE IF (nold < -34)
THEN
361 rep(numb) = -rep(-nold)
362 ELSE IF (nold == 0)
THEN
363 tmp =
ijkl_d(sepi, sepj, ij, kl, li, lj, lk, ll, 0, rij, &
393 SUBROUTINE rotnuc_num(sepi, sepj, rijv, e1b, e2a, itype, se_int_control, se_taper)
394 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
395 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rijv
396 REAL(
dp),
DIMENSION(45),
INTENT(OUT),
OPTIONAL :: e1b, e2a
397 INTEGER,
INTENT(IN) :: itype
398 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
399 TYPE(se_taper_type),
POINTER :: se_taper
401 INTEGER :: i, idd, idp, ind1, ind2, ipp, j, &
402 last_orbital(2), m, n
403 LOGICAL :: l_e1b, l_e2a, task(2)
405 REAL(
dp),
DIMENSION(10, 2) :: core
406 REAL(
dp),
DIMENSION(45) :: tmp
407 TYPE(rotmat_type),
POINTER :: ij_matrix
412 rij = dot_product(rijv, rijv)
418 CALL rotmat(sepi, sepj, rijv, rij, ij_matrix, do_derivatives=.false.)
421 CALL core_nucint_num(sepi, sepj, rij, core=core, itype=itype, se_taper=se_taper, &
422 se_int_control=se_int_control)
425 last_orbital(1) = sepi%natorb
426 last_orbital(2) = sepj%natorb
430 IF (.NOT. task(n)) cycle
431 DO i = 1, last_orbital(n)
435 m = (i*(i - 1))/2 + j
441 ELSE IF (ind1 < 4)
THEN
443 tmp(m) = ij_matrix%sp(1, ind1)*core(2, n)
446 tmp(m) = ij_matrix%sd(1, ind1 - 3)*core(5, n)
448 ELSE IF (ind2 < 4)
THEN
451 ipp =
indpp(ind1, ind2)
452 tmp(m) = core(3, n)*ij_matrix%pp(ipp, 1, 1) + &
453 core(4, n)*(ij_matrix%pp(ipp, 2, 2) + ij_matrix%pp(ipp, 3, 3))
456 idp =
inddp(ind1 - 3, ind2)
457 tmp(m) = core(6, n)*ij_matrix%pd(idp, 1, 1) + &
458 core(8, n)*(ij_matrix%pd(idp, 2, 2) + ij_matrix%pd(idp, 3, 3))
462 idd =
inddd(ind1 - 3, ind2 - 3)
463 tmp(m) = core(7, n)*ij_matrix%dd(idd, 1, 1) + &
464 core(9, n)*(ij_matrix%dd(idd, 2, 2) + ij_matrix%dd(idd, 3, 3)) + &
465 core(10, n)*(ij_matrix%dd(idd, 4, 4) + ij_matrix%dd(idd, 5, 5))
470 DO i = 1, sepi%atm_int_size
475 DO i = 1, sepj%atm_int_size
499 SUBROUTINE corecore_num(sepi, sepj, rijv, enuc, itype, se_int_control, se_taper)
500 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
501 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rijv
502 REAL(
dp),
INTENT(OUT) :: enuc
503 INTEGER,
INTENT(IN) :: itype
504 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
505 TYPE(se_taper_type),
POINTER :: se_taper
508 REAL(
dp) :: aab, alpi, alpj, apdg, ax, dai, daj, &
509 dbi, dbj, pai, paj, pbi, pbj, qcorr, &
510 rij, rija, scale, ssss, ssss_sr, tmp, &
512 REAL(
dp),
DIMENSION(4) :: fni1, fni2, fni3, fnj1, fnj2, fnj3
513 TYPE(se_int_control_type) :: se_int_control_off
515 rij = dot_product(rijv, rijv)
520 do_ewald_gks=.false., integral_screening=se_int_control%integral_screening, &
522 CALL ssss_nucint_num(sepi, sepj, rij, ssss=ssss, itype=itype, se_taper=se_taper, &
523 se_int_control=se_int_control_off)
525 IF (se_int_control%shortrange)
THEN
526 CALL ssss_nucint_num(sepi, sepj, rij, ssss=ssss_sr, itype=itype, se_taper=se_taper, &
527 se_int_control=se_int_control)
531 zz = sepi%zeff*sepj%zeff
538 scale = exp(-alpi*rij) + exp(-alpj*rij)
541 IF (nt == 8 .OR. nt == 9)
THEN
542 IF (sepi%z == 7 .OR. sepi%z == 8) scale = scale + (
angstrom*rij - 1._dp)*exp(-alpi*rij)
543 IF (sepj%z == 7 .OR. sepj%z == 8) scale = scale + (
angstrom*rij - 1._dp)*exp(-alpj*rij)
545 scale = abs(scale*zz*ssss)
560 fni1(:) = sepi%bfn1(:, nt)
561 fni2(:) = sepi%bfn2(:, nt)
562 fni3(:) = sepi%bfn3(:, nt)
564 fni1(:) = sepi%fn1(:)
565 fni2(:) = sepi%fn2(:)
566 fni3(:) = sepi%fn3(:)
580 fnj1(:) = sepj%bfn1(:, nt)
581 fnj2(:) = sepj%bfn2(:, nt)
582 fnj3(:) = sepj%bfn3(:, nt)
584 fnj1(:) = sepj%fn1(:)
585 fnj2(:) = sepj%fn2(:)
586 fnj3(:) = sepj%fn3(:)
589 DO ig = 1,
SIZE(fni1)
590 IF (abs(fni1(ig)) > 0._dp)
THEN
591 ax = fni2(ig)*(rij - fni3(ig))**2
592 IF (ax <= 25._dp)
THEN
593 scale = scale + zz*fni1(ig)*exp(-ax)
596 IF (abs(fnj1(ig)) > 0._dp)
THEN
597 ax = fnj2(ig)*(rij - fnj3(ig))**2
598 IF (ax <= 25._dp)
THEN
599 scale = scale + zz*fnj1(ig)*exp(-ax)
618 (zaf*pai + zbf*paj)*exp(-apdg*(rij - dai - daj)**2) + &
619 (zaf*pai + zbf*pbj)*exp(-apdg*(rij - dai - dbj)**2) + &
620 (zaf*pbi + zbf*paj)*exp(-apdg*(rij - dbi - daj)**2) + &
621 (zaf*pbi + zbf*pbj)*exp(-apdg*(rij - dbi - dbj)**2)
632 xab = sepi%xab(sepj%z)
633 aab = sepi%aab(sepj%z)
634 IF ((sepi%z == 1 .AND. (sepj%z == 6 .OR. sepj%z == 7 .OR. sepj%z == 8)) .OR. &
635 (sepj%z == 1 .AND. (sepi%z == 6 .OR. sepi%z == 7 .OR. sepi%z == 8)))
THEN
637 scale = scale*(2._dp*xab*exp(-aab*rija*rija))
638 ELSEIF (sepi%z == 6 .AND. sepj%z == 6)
THEN
640 scale = scale*(2._dp*xab*exp(-aab*(rija + 0.0003_dp*rija**6)) + 9.28_dp*exp(-5.98_dp*rija))
641 ELSEIF ((sepi%z == 8 .AND. sepj%z == 14) .OR. &
642 (sepj%z == 8 .AND. sepi%z == 14))
THEN
644 scale = scale*(2._dp*xab*exp(-aab*(rija + 0.0003_dp*rija**6)) - 0.0007_dp*exp(-(rija - 2.9_dp)**2))
648 scale = scale*(2._dp*xab*exp(-aab*(rija + 0.0003_dp*rija**6)))
651 qcorr = (sepi%a*exp(-sepi%b*(rij - sepi%c)**2))*sepi%zeff*sepj%zeff/rij + &
652 (sepj%a*exp(-sepj%b*(rij - sepj%c)**2))*sepi%zeff*sepj%zeff/rij
654 tmp = (real(sepi%z,
dp)**(1._dp/3._dp) + real(sepj%z,
dp)**(1._dp/3._dp))
655 qcorr = qcorr + 1.e-8_dp/
evolt*(tmp/rija)**12
657 enuc = enuc + scale + qcorr
674 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
675 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rijv
676 REAL(
dp),
INTENT(OUT) :: enuc
677 INTEGER,
INTENT(IN) :: itype
678 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
679 TYPE(se_taper_type),
POINTER :: se_taper
681 REAL(
dp) :: rij, ssss, ssss_sr, zz
682 TYPE(se_int_control_type) :: se_int_control_off
684 rij = dot_product(rijv, rijv)
689 do_ewald_gks=.false., integral_screening=se_int_control%integral_screening, &
691 CALL ssss_nucint_num(sepi, sepj, rij, ssss=ssss, itype=itype, se_taper=se_taper, &
692 se_int_control=se_int_control_off)
694 IF (se_int_control%shortrange .OR. se_int_control%pc_coulomb_int)
THEN
695 CALL ssss_nucint_num(sepi, sepj, rij, ssss=ssss_sr, itype=itype, se_taper=se_taper, &
696 se_int_control=se_int_control)
700 zz = sepi%zeff*sepj%zeff
723 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
724 REAL(
dp),
INTENT(IN) :: rij
725 REAL(
dp),
INTENT(OUT) :: ssss
726 INTEGER,
INTENT(IN) :: itype
727 TYPE(se_taper_type),
POINTER :: se_taper
728 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
731 TYPE(se_int_screen_type) :: se_int_screen
742 se_int_screen%ft = 1.0_dp
744 se_int_screen%ft =
taper_eval(se_taper%taper_add, rij)
749 CALL nucint_sp_num(sepi, sepj, rij, ssss=ssss, itype=itype, &
750 se_int_control=se_int_control, se_int_screen=se_int_screen)
774 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
775 REAL(
dp),
INTENT(IN) :: rij
776 REAL(
dp),
DIMENSION(10, 2),
INTENT(OUT) :: core
777 INTEGER,
INTENT(IN) :: itype
778 TYPE(se_taper_type),
POINTER :: se_taper
779 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
783 TYPE(se_int_screen_type) :: se_int_screen
794 se_int_screen%ft = 1.0_dp
796 se_int_screen%ft =
taper_eval(se_taper%taper_add, rij)
801 CALL nucint_sp_num(sepi, sepj, rij, core=core, itype=itype, &
802 se_int_control=se_int_control, se_int_screen=se_int_screen)
804 IF (sepi%dorb .OR. sepj%dorb)
THEN
806 CALL nucint_d_num(sepi, sepj, rij, core, itype, se_int_control, &
811 DO i = 1, sepi%core_size
812 core(i, 1) = ft*core(i, 1)
814 DO i = 1, sepj%core_size
815 core(i, 2) = ft*core(i, 2)
837 SUBROUTINE nucint_sp_num(sepi, sepj, rij, ssss, core, itype, se_int_control, &
839 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
840 REAL(
dp),
INTENT(IN) :: rij
841 REAL(
dp),
INTENT(INOUT),
OPTIONAL :: ssss
842 REAL(
dp),
DIMENSION(10, 2),
INTENT(INOUT), &
844 INTEGER,
INTENT(IN) :: itype
845 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
846 TYPE(se_int_screen_type),
INTENT(IN) :: se_int_screen
849 LOGICAL :: l_core, l_ssss, si, sj
851 l_core =
PRESENT(core)
852 l_ssss =
PRESENT(ssss)
853 IF (.NOT. (l_core .OR. l_ssss))
RETURN
854 si = (sepi%natorb > 1)
855 sj = (sepj%natorb > 1)
860 ssss =
ijkl_sp(sepi, sepj, ij, ij, 0, 0, 0, 0, -1, rij, se_int_control, se_int_screen, itype)
866 core(1, 1) =
ijkl_sp(sepi, sepj, kl, ij, 0, 0, 0, 0, 2, rij, se_int_control, se_int_screen, itype)*sepj%zeff
870 core(2, 1) =
ijkl_sp(sepi, sepj, kl, ij, 0, 1, 0, 0, 2, rij, se_int_control, se_int_screen, itype)*sepj%zeff
873 core(3, 1) =
ijkl_sp(sepi, sepj, kl, ij, 1, 1, 0, 0, 2, rij, se_int_control, se_int_screen, itype)*sepj%zeff
876 core(4, 1) =
ijkl_sp(sepi, sepj, kl, ij, 1, 1, 0, 0, 2, rij, se_int_control, se_int_screen, itype)*sepj%zeff
881 core(1, 2) =
ijkl_sp(sepi, sepj, ij, kl, 0, 0, 0, 0, 1, rij, se_int_control, se_int_screen, itype)*sepi%zeff
885 core(2, 2) =
ijkl_sp(sepi, sepj, ij, kl, 0, 0, 0, 1, 1, rij, se_int_control, se_int_screen, itype)*sepi%zeff
888 core(3, 2) =
ijkl_sp(sepi, sepj, ij, kl, 0, 0, 1, 1, 1, rij, se_int_control, se_int_screen, itype)*sepi%zeff
891 core(4, 2) =
ijkl_sp(sepi, sepj, ij, kl, 0, 0, 1, 1, 1, rij, se_int_control, se_int_screen, itype)*sepi%zeff
918 SUBROUTINE nucint_d_num(sepi, sepj, rij, core, itype, se_int_control, &
920 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
921 REAL(
dp),
INTENT(IN) :: rij
922 REAL(
dp),
DIMENSION(10, 2),
INTENT(INOUT) :: core
923 INTEGER,
INTENT(IN) :: itype
924 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
925 TYPE(se_int_screen_type),
INTENT(IN) :: se_int_screen
931 IF (sepi%dorb .OR. sepj%dorb)
THEN
936 core(5, 2) =
ijkl_d(sepi, sepj, ij, kl, 0, 0, 2, 0, 1, rij, se_int_control, se_int_screen, itype)*sepi%zeff
939 core(6, 2) =
ijkl_d(sepi, sepj, ij, kl, 0, 0, 2, 1, 1, rij, se_int_control, se_int_screen, itype)*sepi%zeff
942 core(7, 2) =
ijkl_d(sepi, sepj, ij, kl, 0, 0, 2, 2, 1, rij, se_int_control, se_int_screen, itype)*sepi%zeff
945 core(8, 2) =
ijkl_d(sepi, sepj, ij, kl, 0, 0, 2, 1, 1, rij, se_int_control, se_int_screen, itype)*sepi%zeff
948 core(9, 2) =
ijkl_d(sepi, sepj, ij, kl, 0, 0, 2, 2, 1, rij, se_int_control, se_int_screen, itype)*sepi%zeff
951 core(10, 2) =
ijkl_d(sepi, sepj, ij, kl, 0, 0, 2, 2, 1, rij, se_int_control, se_int_screen, itype)*sepi%zeff
956 core(5, 1) =
ijkl_d(sepi, sepj, kl, ij, 2, 0, 0, 0, 2, rij, se_int_control, se_int_screen, itype)*sepj%zeff
959 core(6, 1) =
ijkl_d(sepi, sepj, kl, ij, 2, 1, 0, 0, 2, rij, se_int_control, se_int_screen, itype)*sepj%zeff
962 core(7, 1) =
ijkl_d(sepi, sepj, kl, ij, 2, 2, 0, 0, 2, rij, se_int_control, se_int_screen, itype)*sepj%zeff
965 core(8, 1) =
ijkl_d(sepi, sepj, kl, ij, 2, 1, 0, 0, 2, rij, se_int_control, se_int_screen, itype)*sepj%zeff
968 core(9, 1) =
ijkl_d(sepi, sepj, kl, ij, 2, 2, 0, 0, 2, rij, se_int_control, se_int_screen, itype)*sepj%zeff
971 core(10, 1) =
ijkl_d(sepi, sepj, kl, ij, 2, 2, 0, 0, 2, rij, se_int_control, se_int_screen, itype)*sepj%zeff
987 SUBROUTINE drotint_num(sepi, sepj, r, dw, delta, se_int_control, se_taper)
988 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
989 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: r
990 REAL(
dp),
DIMENSION(3, 2025),
INTENT(OUT) :: dw
991 REAL(
dp),
INTENT(IN) :: delta
992 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
993 TYPE(se_taper_type),
POINTER :: se_taper
995 INTEGER :: i, j, nsize
997 REAL(
dp),
DIMENSION(2025) :: wm, wp
998 REAL(
dp),
DIMENSION(3) :: rr
1001 nsize = sepi%atm_int_size*sepj%atm_int_size
1004 rr(i) = rr(i) + delta
1005 CALL rotint_num(sepi, sepj, rr, wp, se_int_control, se_taper=se_taper)
1006 rr(i) = rr(i) - 2._dp*delta
1007 CALL rotint_num(sepi, sepj, rr, wm, se_int_control, se_taper=se_taper)
1009 dw(i, j) = od*(wp(j) - wm(j))
1027 SUBROUTINE drotnuc_num(sepi, sepj, r, de1b, de2a, itype, delta, se_int_control, se_taper)
1028 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
1029 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: r
1030 REAL(
dp),
DIMENSION(3, 45),
INTENT(OUT),
OPTIONAL :: de1b, de2a
1031 INTEGER,
INTENT(IN) :: itype
1032 REAL(
dp),
INTENT(IN) :: delta
1033 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
1034 TYPE(se_taper_type),
POINTER :: se_taper
1037 LOGICAL :: l_de1b, l_de2a
1039 REAL(
dp),
DIMENSION(3) :: rr
1040 REAL(
dp),
DIMENSION(45) :: e1m, e1p, e2m, e2p
1042 l_de1b =
PRESENT(de1b)
1043 l_de2a =
PRESENT(de2a)
1044 IF (.NOT. (l_de1b .OR. l_de2a))
RETURN
1048 rr(i) = rr(i) + delta
1049 CALL rotnuc_num(sepi, sepj, rr, e1p, e2p, itype, se_int_control, se_taper=se_taper)
1050 rr(i) = rr(i) - 2._dp*delta
1051 CALL rotnuc_num(sepi, sepj, rr, e1m, e2m, itype, se_int_control, se_taper=se_taper)
1053 DO j = 1, sepi%atm_int_size
1054 de1b(i, j) = od*(e1p(j) - e1m(j))
1058 DO j = 1, sepj%atm_int_size
1059 de2a(i, j) = od*(e2p(j) - e2m(j))
1076 SUBROUTINE dcorecore_num(sepi, sepj, r, denuc, itype, delta, se_int_control, se_taper)
1077 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
1078 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: r
1079 REAL(
dp),
DIMENSION(3),
INTENT(OUT) :: denuc
1080 INTEGER,
INTENT(IN) :: itype
1081 REAL(
dp),
INTENT(IN) :: delta
1082 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
1083 TYPE(se_taper_type),
POINTER :: se_taper
1086 REAL(
dp) :: enucm, enucp, od
1087 REAL(
dp),
DIMENSION(3) :: rr
1092 rr(i) = rr(i) + delta
1093 CALL corecore_num(sepi, sepj, rr, enucp, itype, se_int_control, se_taper=se_taper)
1094 rr(i) = rr(i) - 2._dp*delta
1095 CALL corecore_num(sepi, sepj, rr, enucm, itype, se_int_control, se_taper=se_taper)
1096 denuc(i) = od*(enucp - enucm)
1112 TYPE(semi_empirical_type),
POINTER :: sepi, sepj
1113 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: r
1114 REAL(
dp),
DIMENSION(3),
INTENT(OUT) :: denuc
1115 INTEGER,
INTENT(IN) :: itype
1116 REAL(
dp),
INTENT(IN) :: delta
1117 TYPE(se_int_control_type),
INTENT(IN) :: se_int_control
1118 TYPE(se_taper_type),
POINTER :: se_taper
1121 REAL(
dp) :: enucm, enucp, od
1122 REAL(
dp),
DIMENSION(3) :: rr
1127 rr(i) = rr(i) + delta
1128 CALL corecore_el_num(sepi, sepj, rr, enucp, itype, se_int_control, se_taper=se_taper)
1129 rr(i) = rr(i) - 2._dp*delta
1130 CALL corecore_el_num(sepi, sepj, rr, enucm, itype, se_int_control, se_taper=se_taper)
1131 denuc(i) = od*(enucp - enucm)
Defines the basic variable types.
integer, parameter, public dp
Multipole structure: for multipole (fixed and induced) in FF based MD.
integer, parameter, public do_multipole_none
Definition of physical constants:
real(kind=dp), parameter, public evolt
real(kind=dp), parameter, public angstrom
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
integer, dimension(45), parameter, public int2c_type
integer, dimension(491), public ijkl_sym
integer, dimension(5, 3), public inddp
integer, dimension(3, 3), public indpp
integer, dimension(9), parameter, public l_index
integer, dimension(9, 9), public indexa
integer, dimension(5, 5), public inddd
integer, dimension(45, 45), public ijkl_ind
Integrals for semi-empiric methods.
subroutine, public rotnuc_num(sepi, sepj, rijv, e1b, e2a, itype, se_int_control, se_taper)
Computes the two-particle interactions.
subroutine, public corecore_el_num(sepi, sepj, rijv, enuc, itype, se_int_control, se_taper)
Computes the electrostatic core-core interactions only.
subroutine, public rotint_num(sepi, sepj, rijv, w, se_int_control, se_taper)
Computes the two particle interactions in the lab frame.
subroutine, public terep_d_num(sepi, sepj, rij, rep, se_int_control, se_int_screen, ft)
Calculates the two-electron repulsion integrals - d shell only.
subroutine, public drotint_num(sepi, sepj, r, dw, delta, se_int_control, se_taper)
Numerical Derivatives for rotint.
subroutine, public core_nucint_num(sepi, sepj, rij, core, itype, se_taper, se_int_control)
Calculates the nuclear attraction integrals CORE (main driver)
subroutine, public ssss_nucint_num(sepi, sepj, rij, ssss, itype, se_taper, se_int_control)
Calculates the SSSS integrals (main driver)
subroutine, public drotnuc_num(sepi, sepj, r, de1b, de2a, itype, delta, se_int_control, se_taper)
Numerical Derivatives for rotnuc.
subroutine, public dcorecore_num(sepi, sepj, r, denuc, itype, delta, se_int_control, se_taper)
Numerical Derivatives for corecore.
subroutine, public terep_sp_num(sepi, sepj, rij, rep, se_int_control, se_int_screen, ft)
Calculates the two-electron repulsion integrals - sp shell only.
subroutine, public nucint_d_num(sepi, sepj, rij, core, itype, se_int_control, se_int_screen)
Calculates the nuclear attraction integrals involving d orbitals.
subroutine, public dcorecore_el_num(sepi, sepj, r, denuc, itype, delta, se_int_control, se_taper)
Numerical Derivatives for corecore.
subroutine, public nucint_sp_num(sepi, sepj, rij, ssss, core, itype, se_int_control, se_int_screen)
...
subroutine, public corecore_num(sepi, sepj, rijv, enuc, itype, se_int_control, se_taper)
Computes the core-core interactions.
subroutine, public terep_num(sepi, sepj, rij, rep, se_taper, se_int_control)
Calculates the derivative pf two-electron repulsion integrals and the nuclear attraction integrals w....
Utilities for Integrals for semi-empiric methods.
real(kind=dp) function, public ijkl_sp(sepi, sepj, ij, kl, li, lj, lk, ll, ic, r, se_int_control, se_int_screen, itype)
General driver for computing semi-empirical integrals <ij|kl> with sp basis set. This code uses the o...
subroutine, public store_2el_2c_diag(limij, limkl, ww, w, ww_dx, ww_dy, ww_dz, dw)
Store the two-electron two-center integrals in diagonal form.
recursive subroutine, public rotmat(sepi, sepj, rjiv, r, ij_matrix, do_derivatives, do_invert, debug_invert)
Computes the general rotation matrices for the integrals between I and J (J>=I)
recursive subroutine, public rot_2el_2c_first(sepi, sepj, rijv, se_int_control, se_taper, invert, ii, kk, rep, logv, ij_matrix, v, lgrad, rep_d, v_d, logv_d, drij)
First Step of the rotation of the two-electron two-center integrals in SPD basis.
real(kind=dp) function, public ijkl_d(sepi, sepj, ij, kl, li, lj, lk, ll, ic, r, se_int_control, se_int_screen, itype)
General driver for computing semi-empirical integrals <ij|kl> involving d-orbitals....
Definition of the semi empirical parameter types.
subroutine, public rotmat_release(rotmat)
Releases rotmat type.
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.
subroutine, public rotmat_create(rotmat)
Creates rotmat type.
Definition of the semi empirical parameter types.
real(kind=dp) function, public taper_eval(taper, rij)
Taper functions.