24 lmat, no_pseudo, sgp_pseudo, upf_pseudo
55#include "./base/base_uses.f90"
61 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'atom_utils'
83 MODULE PROCEDURE integrate_grid_function1, &
84 integrate_grid_function2, &
85 integrate_grid_function3
103 CHARACTER(LEN=default_string_length), &
104 DIMENSION(:),
POINTER :: ostring
105 REAL(kind=
dp),
DIMENSION(0:lmat, 10) :: occupation, wfnocc
106 INTEGER,
INTENT(OUT),
OPTIONAL :: multiplicity
108 CHARACTER(len=2) :: elem
109 CHARACTER(LEN=default_string_length) :: pstring
110 INTEGER :: i, i1, i2, ielem, is, jd, jf, jp, js, k, &
112 REAL(kind=
dp) :: e0, el, oo
116 cpassert(
ASSOCIATED(ostring))
117 cpassert(
SIZE(ostring) > 0)
125 IF (index(ostring(is),
"(") /= 0)
THEN
126 i1 = index(ostring(is),
"(")
127 i2 = index(ostring(is),
")")
128 cpassert((i2 - i1 - 1 > 0) .AND. (i2 - i1 - 1 < 3))
129 elem = ostring(is) (i1 + 1:i2 - 1)
130 IF (index(elem,
"HS") /= 0)
THEN
132 ELSE IF (index(elem,
"LS") /= 0)
THEN
142 IF (index(ostring(is),
"CORE") /= 0) is = is + 1
145 IF (index(ostring(is),
"none") /= 0) is = is + 1
148 IF (index(ostring(is),
"[") /= 0)
THEN
150 i1 = index(ostring(is),
"[")
151 i2 = index(ostring(is),
"]")
152 cpassert((i2 - i1 - 1 > 0) .AND. (i2 - i1 - 1 < 3))
153 elem = ostring(is) (i1 + 1:i2 - 1)
156 IF (elem ==
ptable(k)%symbol)
THEN
162 DO l = 0, min(
lmat, ubound(
ptable(ielem)%e_conv, 1))
163 el = 2._dp*(2._dp*real(l,
dp) + 1._dp)
164 e0 =
ptable(ielem)%e_conv(l)
166 occupation(l, k) = min(el, e0)
168 IF (e0 <= 0._dp)
EXIT
179 js = index(pstring,
"S")
180 jp = index(pstring,
"P")
181 jd = index(pstring,
"D")
182 jf = index(pstring,
"F")
183 cpassert(js + jp + jd + jf > 0)
185 cpassert(jp + jd + jf == 0)
186 READ (pstring(1:js - 1), *) n
187 READ (pstring(js + 1:), *) oo
189 cpassert(oo >= 0._dp)
190 cpassert(occupation(0, n) == 0)
191 occupation(0, n) = oo
194 cpassert(js + jd + jf == 0)
195 READ (pstring(1:jp - 1), *) n
196 READ (pstring(jp + 1:), *) oo
198 cpassert(oo >= 0._dp)
199 cpassert(occupation(1, n - 1) == 0)
200 occupation(1, n - 1) = oo
203 cpassert(js + jp + jf == 0)
204 READ (pstring(1:jd - 1), *) n
205 READ (pstring(jd + 1:), *) oo
207 cpassert(oo >= 0._dp)
208 cpassert(occupation(2, n - 2) == 0)
209 occupation(2, n - 2) = oo
212 cpassert(js + jp + jd == 0)
213 READ (pstring(1:jf - 1), *) n
214 READ (pstring(jf + 1:), *) oo
216 cpassert(oo >= 0._dp)
217 cpassert(occupation(3, n - 3) == 0)
218 occupation(3, n - 3) = oo
227 IF (occupation(l, i) /= 0._dp)
THEN
229 wfnocc(l, k) = occupation(l, i)
241 IF (wfnocc(l, i) /= 0._dp .AND. wfnocc(l, i) /= real(k,
dp))
THEN
249 IF (js == 0 .AND. mult == -2) mult = 1
250 IF (js == 0 .AND. mult == -3) mult = 1
257 k = nint(wfnocc(l, i))
258 IF (k > (2*l + 1)) k = 2*(2*l + 1) - k
259 IF (mult == -2) mult = k + 1
260 IF (mult == -3) mult = mod(k, 2) + 1
261 cpassert(mod(k + 1 - mult, 2) == 0)
263 IF (js > 1 .AND. mult /= -2)
THEN
269 IF (
PRESENT(multiplicity)) multiplicity = mult
281 REAL(kind=
dp),
DIMENSION(0:lmat, 10),
INTENT(IN) :: occupation
288 IF (sum(occupation(l, :)) /= 0._dp) maxl = l
301 REAL(kind=
dp),
DIMENSION(0:lmat, 10),
INTENT(IN) :: occupation
302 INTEGER,
DIMENSION(0:lmat) :: maxn
309 IF (occupation(l, k) /= 0._dp) maxn(l) = maxn(l) + 1
327 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(INOUT) :: pmat
328 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(IN) :: wfn
329 INTEGER,
DIMENSION(0:lmat),
INTENT(IN) :: nbas
330 REAL(kind=
dp),
DIMENSION(0:, :),
INTENT(IN) :: occ
331 INTEGER,
INTENT(IN) :: maxl
332 INTEGER,
DIMENSION(0:lmat),
INTENT(IN) :: maxn
334 INTEGER :: i, j, k, l, n
339 DO i = 1, min(n, maxn(l))
342 pmat(j, k, l) = pmat(j, k, l) + occ(l, i)*wfn(j, i, l)*wfn(k, i, l)
366 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: density
367 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(IN) :: pmat
369 INTEGER,
INTENT(IN) :: maxl
370 CHARACTER(LEN=*),
OPTIONAL :: typ
371 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN),
OPTIONAL :: rr
373 CHARACTER(LEN=3) :: my_typ
374 INTEGER :: i, j, l, n
378 IF (
PRESENT(typ)) my_typ = typ(1:3)
379 IF (my_typ ==
"KIN")
THEN
380 cpassert(
PRESENT(rr))
389 IF (i /= j) ff = 2._dp*pmat(i, j, l)
390 IF (my_typ ==
"RHO")
THEN
391 density(:) = density(:) + ff*basis%bf(:, i, l)*basis%bf(:, j, l)
392 ELSE IF (my_typ ==
"DER")
THEN
393 density(:) = density(:) + ff*basis%dbf(:, i, l)*basis%bf(:, j, l) &
394 + ff*basis%bf(:, i, l)*basis%dbf(:, j, l)
395 ELSE IF (my_typ ==
"KIN")
THEN
396 density(:) = density(:) + 0.5_dp*ff*( &
397 basis%dbf(:, i, l)*basis%dbf(:, j, l) + &
398 REAL(l*(l + 1),
dp)*basis%bf(:, i, l)*basis%bf(:, j, l)/rr(:))
399 ELSE IF (my_typ ==
"LAP")
THEN
400 density(:) = density(:) + ff*basis%ddbf(:, i, l)*basis%bf(:, j, l) &
401 + ff*basis%bf(:, i, l)*basis%ddbf(:, j, l) &
402 + 2._dp*ff*basis%dbf(:, i, l)*basis%bf(:, j, l)/rr(:) &
403 + 2._dp*ff*basis%bf(:, i, l)*basis%dbf(:, j, l)/rr(:)
425 INTEGER :: extunit, i, k, l, n
428 CALL open_file(file_name=
atom%zmp_restart_file, file_status=
"UNKNOWN", &
429 file_form=
"FORMATTED", file_action=
"WRITE", &
432 n =
SIZE(
atom%orbitals%wfn, 2)
433 WRITE (extunit, *)
atom%basis%nbas
434 DO l = 0,
atom%state%maxl_occ
435 DO i = 1, min(n,
atom%state%maxn_occ(l))
436 DO k = 1,
atom%basis%nbas(l)
437 WRITE (extunit, *)
atom%orbitals%wfn(k, i, l)
458 LOGICAL,
INTENT(INOUT) :: doguess
459 INTEGER,
INTENT(IN) :: iw
461 INTEGER :: er, extunit, i, k, l, maxl, n
462 INTEGER,
DIMENSION(0:lmat) :: maxn, nbas
464 INQUIRE (file=
atom%zmp_restart_file, exist=
atom%doread)
466 IF (
atom%doread)
THEN
467 WRITE (iw, fmt=
"(' ZMP | Restart file found')")
469 CALL open_file(file_name=
atom%zmp_restart_file, file_status=
"OLD", &
470 file_form=
"FORMATTED", file_action=
"READ", &
473 READ (extunit, *, iostat=er) nbas
476 WRITE (iw, fmt=
"(' ZMP | ERROR! Restart file unreadable')")
477 WRITE (iw, fmt=
"(' ZMP | ERROR! Starting ZMP calculation form initial atomic guess')")
479 atom%doread = .false.
480 ELSE IF (nbas(1) .NE.
atom%basis%nbas(1))
THEN
481 WRITE (iw, fmt=
"(' ZMP | ERROR! Restart file contains a different basis set')")
482 WRITE (iw, fmt=
"(' ZMP | ERROR! Starting ZMP calculation form initial atomic guess')")
484 atom%doread = .false.
486 nbas =
atom%basis%nbas
487 maxl =
atom%state%maxl_occ
488 maxn =
atom%state%maxn_occ
489 n =
SIZE(
atom%orbitals%wfn, 2)
490 DO l = 0,
atom%state%maxl_occ
491 DO i = 1, min(n,
atom%state%maxn_occ(l))
492 DO k = 1,
atom%basis%nbas(l)
493 READ (extunit, *)
atom%orbitals%wfn(k, i, l)
501 WRITE (iw, fmt=
"(' ZMP | WARNING! Restart file not found')")
502 WRITE (iw, fmt=
"(' ZMP | WARNING! Starting ZMP calculation form initial atomic guess')")
516 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: density
518 INTEGER,
INTENT(IN) :: iw
520 CHARACTER(LEN=default_string_length) :: filename
521 INTEGER :: extunit, ir, j, k, l, maxl_occ, maxnbas, &
525 REAL(kind=
dp),
ALLOCATABLE :: pmatread(:, :, :)
527 filename =
atom%ext_file
531 CALL open_file(file_name=filename, file_status=
"OLD", &
532 file_form=
"FORMATTED", file_action=
"READ", &
538 IF (nr .NE.
atom%basis%grid%nr)
THEN
539 IF (iw > 0)
WRITE (iw, fmt=
"(' ZMP | ERROR! External grid dimension ',I4,' differs from internal grid ',I4)") &
540 nr,
atom%basis%grid%nr
541 IF (iw > 0)
WRITE (iw, fmt=
"(' ZMP | ERROR! Stopping ZMP calculation')")
546 READ (extunit, *) rr, density(ir)
547 IF (abs(rr -
atom%basis%grid%rad(ir)) .GT.
atom%zmpgrid_tol)
THEN
548 IF (iw > 0)
WRITE (iw, fmt=
"(' ZMP | ERROR! Grid points do not coincide: ')")
549 IF (iw > 0)
WRITE (iw, fmt=
'(" ZMP |",T20,"R_out[bohr]",T36,"R_in[bohr]",T61,"R_diff[bohr]")')
550 IF (iw > 0)
WRITE (iw, fmt=
'(" ZMP |",T14,E24.15,T39,E24.15,T64,E24.15)') &
551 rr,
atom%basis%grid%rad(ir), abs(rr -
atom%basis%grid%rad(ir))
557 READ (extunit, *) maxl_occ
558 maxnbas = maxval(
atom%basis%nbas)
559 ALLOCATE (pmatread(maxnbas, maxnbas, 0:maxl_occ))
562 nbas =
atom%basis%nbas(l)
565 READ (extunit, *) (pmatread(j, k, l), j=1, k)
567 pmatread(k, j, l) = pmatread(j, k, l)
577 CALL open_file(file_name=
"rho_target.dat", file_status=
"UNKNOWN", &
578 file_form=
"FORMATTED", file_action=
"WRITE", unit_number=extunit)
580 IF (iw > 0)
WRITE (iw, fmt=
"(' ZMP | Writing target density from density matrix')")
582 WRITE (extunit, fmt=
'("# Target density built from density matrix : ",A20)') filename
583 WRITE (extunit, fmt=
'("#",T10,"R[bohr]",T36,"Rho[au]")')
585 nr =
atom%basis%grid%nr
588 WRITE (extunit, fmt=
'(T1,E24.15,T26,E24.15)') &
589 atom%basis%grid%rad(ir), density(ir)
591 DEALLOCATE (pmatread)
607 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: vxc
609 INTEGER,
INTENT(IN) :: iw
611 CHARACTER(LEN=default_string_length) :: adum, filename
612 INTEGER :: extunit, ir, nr
615 filename =
atom%ext_vxc_file
618 CALL open_file(file_name=filename, file_status=
"OLD", &
619 file_form=
"FORMATTED", file_action=
"READ", &
623 READ (extunit, *) adum, nr
625 IF (nr .NE.
atom%basis%grid%nr)
THEN
626 IF (iw > 0)
WRITE (iw, fmt=
"(' ZMP | ERROR! External grid dimension ',I4,' differs from internal grid ',I4)") &
627 nr,
atom%basis%grid%nr
628 IF (iw > 0)
WRITE (iw, fmt=
"(' ZMP | ERROR! Stopping ZMP calculation')")
632 READ (extunit, *) rr, vxc(ir)
633 IF (abs(rr -
atom%basis%grid%rad(ir)) .GT.
atom%zmpvxcgrid_tol)
THEN
634 IF (iw > 0)
WRITE (iw, fmt=
"(' ZMP | ERROR! Grid points do not coincide: ')")
635 IF (iw > 0)
WRITE (iw, fmt=
'(" ZMP |",T20,"R_out[bohr]",T36,"R_in[bohr]",T61,"R_diff[bohr]")')
636 IF (iw > 0)
WRITE (iw, fmt=
'(" ZMP |",T14,E24.15,T39,E24.15,T64,E24.15)') &
637 rr,
atom%basis%grid%rad(ir), abs(rr -
atom%basis%grid%rad(ir))
653 REAL(kind=
dp),
INTENT(OUT) :: charge
654 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: wfn
655 REAL(kind=
dp),
INTENT(IN) :: rcov
656 INTEGER,
INTENT(IN) :: l
659 INTEGER :: i, j, m, n
661 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: den
664 m =
SIZE(basis%bf, 1)
671 den(1:m) = den(1:m) + ff*basis%bf(1:m, i, l)*basis%bf(1:m, j, l)
675 IF (basis%grid%rad(i) > rcov) den(i) = 0._dp
677 charge = sum(den(1:m)*basis%grid%wr(1:m))
693 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT) :: corden
695 CHARACTER(LEN=*),
OPTIONAL :: typ
696 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rr
698 CHARACTER(LEN=3) :: my_typ
699 INTEGER :: i, j, m, n
701 REAL(kind=
dp) :: a, a2, cval, fb
702 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: fe, rc, rhoc, rval
705 IF (
PRESENT(typ)) my_typ = typ(1:3)
707 SELECT CASE (potential%ppot_type)
711 IF (potential%gth_pot%nlcc)
THEN
713 ALLOCATE (fe(m), rc(m))
714 n = potential%gth_pot%nexp_nlcc
716 a = potential%gth_pot%alpha_nlcc(i)
720 fe(:) = exp(-0.5_dp*rc(:)*rc(:))
721 DO j = 1, potential%gth_pot%nct_nlcc(i)
722 cval = potential%gth_pot%cval_nlcc(j, i)
723 IF (my_typ ==
"RHO")
THEN
724 corden(:) = corden(:) + fe(:)*rc**(2*j - 2)*cval
725 ELSE IF (my_typ ==
"DER")
THEN
726 corden(:) = corden(:) - fe(:)*rc**(2*j - 1)*cval/a
728 corden(:) = corden(:) + real(2*j - 2,
dp)*fe(:)*rc**(2*j - 3)*cval/a
730 ELSE IF (my_typ ==
"LAP")
THEN
732 corden(:) = corden(:) - fb*fe(:)/rr(:)*rc**(2*j - 1)
733 corden(:) = corden(:) + fe(:)*rc**(2*j)*cval/a2
735 corden(:) = corden(:) + fb*real(2*j - 2,
dp)*fe(:)/rr(:)*rc**(2*j - 3)
736 corden(:) = corden(:) + real((2*j - 2)*(2*j - 3),
dp)*fe(:)*rc**(2*j - 4)*cval/a2
737 corden(:) = corden(:) - real(2*j - 2,
dp)*fe(:)*rc**(2*j - 2)*cval/a2
747 IF (potential%upf_pot%core_correction)
THEN
749 n = potential%upf_pot%mesh_size
751 IF (rr(1) > rr(m)) reverse = .true.
752 ALLOCATE (rhoc(m), rval(m))
755 rval(i) = rr(m - i + 1)
760 IF (my_typ ==
"RHO")
THEN
761 CALL spline3ders(potential%upf_pot%r(1:n), potential%upf_pot%rho_nlcc(1:n), rval(1:m), &
763 ELSE IF (my_typ ==
"DER")
THEN
764 CALL spline3ders(potential%upf_pot%r(1:n), potential%upf_pot%rho_nlcc(1:n), rval(1:m), &
766 ELSE IF (my_typ ==
"LAP")
THEN
767 CALL spline3ders(potential%upf_pot%r(1:n), potential%upf_pot%rho_nlcc(1:n), rval(1:m), &
774 rval(i) = rr(m - i + 1)
775 corden(i) = corden(i) + rhoc(m - i + 1)
778 corden(1:m) = corden(1:m) + rhoc(1:m)
780 DEALLOCATE (rhoc, rval)
783 IF (potential%sgp_pot%has_nlcc)
THEN
784 cpabort(
"not implemented")
787 cpabort(
"Unknown PP type")
799 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT) :: locpot
801 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rr
803 INTEGER :: i, j, m, n
805 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: fe, rc
808 ALLOCATE (fe(m), rc(m))
809 rc(:) = rr(:)/gthpot%rc
811 locpot(i) = -gthpot%zion*erf(rc(i)/sqrt(2._dp))/rr(i)
814 fe(:) = exp(-0.5_dp*rc(:)*rc(:))
816 locpot(:) = locpot(:) + fe(:)*rc**(2*i - 2)*gthpot%cl(i)
818 IF (gthpot%lpotextended)
THEN
819 DO j = 1, gthpot%nexp_lpot
820 a = gthpot%alpha_lpot(j)
822 fe(:) = exp(-0.5_dp*rc(:)*rc(:))
823 n = gthpot%nct_lpot(j)
825 locpot(:) = locpot(:) + fe(:)*rc**(2*i - 2)*gthpot%cval_lpot(i, j)
842 REAL(kind=
dp),
INTENT(OUT) :: rmax
843 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: wfn
844 REAL(kind=
dp),
INTENT(IN) :: rcov
845 INTEGER,
INTENT(IN) :: l
850 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: dorb
852 m =
SIZE(basis%bf, 1)
858 dorb(1:m) = dorb(1:m) + ff*basis%dbf(1:m, i, l)
862 IF (basis%grid%rad(i) < 2*rcov)
THEN
863 IF (dorb(i)*dorb(i + 1) < 0._dp)
THEN
864 rmax = max(rmax, basis%grid%rad(i))
881 INTEGER,
INTENT(OUT) :: node
882 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: wfn
883 REAL(kind=
dp),
INTENT(IN) :: rcov
884 INTEGER,
INTENT(IN) :: l
889 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: orb
892 m =
SIZE(basis%bf, 1)
898 orb(1:m) = orb(1:m) + ff*basis%bf(1:m, i, l)
901 IF (basis%grid%rad(i) < rcov)
THEN
902 IF (orb(i)*orb(i + 1) < 0._dp) node = node + 1
916 REAL(kind=
dp),
INTENT(OUT) ::
value
917 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: wfn
923 m = maxval(minloc(basis%grid%rad))
926 value =
value + wfn(i)*basis%bf(m, i, 0)
943 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(IN) :: hmat, umat
944 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(INOUT) :: orb
945 REAL(kind=
dp),
DIMENSION(:, 0:),
INTENT(INOUT) :: ener
946 INTEGER,
DIMENSION(0:),
INTENT(IN) :: nb, nv
947 INTEGER,
INTENT(IN) :: maxl
949 INTEGER :: info, l, lwork, m, n
950 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: w, work
951 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: a
953 cpassert(all(nb >= nv))
959 IF (n > 0 .AND. m > 0)
THEN
961 ALLOCATE (a(n, n), w(n), work(lwork))
962 a(1:m, 1:m) = matmul(transpose(umat(1:n, 1:m, l)), matmul(hmat(1:n, 1:n, l), umat(1:n, 1:m, l)))
963 CALL dsyev(
"V",
"U", m, a(1:m, 1:m), m, w(1:m), work, lwork, info)
964 a(1:n, 1:m) = matmul(umat(1:n, 1:m, l), a(1:m, 1:m))
966 m = min(m,
SIZE(orb, 2))
967 orb(1:n, 1:m, l) = a(1:n, 1:m)
968 ener(1:m, l) = w(1:m)
970 DEALLOCATE (a, w, work)
982 FUNCTION prune_grid(fun, deps)
RESULT(nc)
983 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fun
984 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: deps
988 REAL(kind=
dp) :: meps
991 IF (
PRESENT(deps)) meps = deps
996 IF (abs(fun(i)) > meps)
THEN
1002 END FUNCTION prune_grid
1012 PURE FUNCTION integrate_grid_function1(fun, grid)
RESULT(integral)
1013 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fun
1015 REAL(kind=
dp) :: integral
1020 integral = sum(fun(1:nc)*grid%wr(1:nc))
1022 END FUNCTION integrate_grid_function1
1033 PURE FUNCTION integrate_grid_function2(fun1, fun2, grid)
RESULT(integral)
1034 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fun1, fun2
1036 REAL(kind=
dp) :: integral
1040 nc = min(
SIZE(fun1),
SIZE(fun2))
1041 integral = sum(fun1(1:nc)*fun2(1:nc)*grid%wr(1:nc))
1043 END FUNCTION integrate_grid_function2
1055 PURE FUNCTION integrate_grid_function3(fun1, fun2, fun3, grid)
RESULT(integral)
1056 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fun1, fun2, fun3
1058 REAL(kind=
dp) :: integral
1062 nc = min(
SIZE(fun1),
SIZE(fun2),
SIZE(fun3))
1063 integral = sum(fun1(1:nc)*fun2(1:nc)*fun3(1:nc)*grid%wr(1:nc))
1065 END FUNCTION integrate_grid_function3
1076 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT) :: cpot
1077 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: density
1081 REAL(
dp) :: int1, int2
1082 REAL(
dp),
DIMENSION(:),
POINTER :: r, wr
1084 nc = min(
SIZE(cpot),
SIZE(density))
1090 cpot(nc:) = int1/r(nc:)
1094 cpassert(r(1) > r(nc))
1096 cpot(i) = int1/r(i) + int2
1097 int1 = int1 -
fourpi*density(i)*wr(i)
1098 int2 = int2 +
fourpi*density(i)*wr(i)/r(i)
1114 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT) :: cpot
1115 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(IN) :: pmat
1118 INTEGER,
INTENT(IN) :: maxl
1120 INTEGER :: i, j, k, l, m, n
1121 REAL(kind=
dp) :: a, b, ff, oab, sab
1122 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: erfa, expa, z
1123 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: unp
1126 ALLOCATE (erfa(1:m), expa(1:m), z(1:m))
1131 IF (maxval(abs(pmat(:, :, l))) < 1.e-14_dp) cycle
1132 SELECT CASE (basis%basis_type)
1136 DO i = 1, basis%nbas(l)
1137 DO j = i, basis%nbas(l)
1138 IF (abs(pmat(i, j, l)) < 1.e-14_dp) cycle
1140 IF (i /= j) ff = 2._dp*ff
1144 oab =
rootpi/(a + b)**(l + 1.5_dp)*ff
1145 z(:) = sab*grid%rad(:)
1146 DO k = 1,
SIZE(erfa)
1147 erfa(k) = oab*erf(z(k))/grid%rad(k)
1149 expa(:) = exp(-z(:)**2)*ff/(a + b)**(l + 1)
1154 cpot(:) = cpot(:) + 0.25_dp*erfa(:)
1156 cpot(:) = cpot(:) + 0.375_dp*erfa(:) - 0.25_dp*expa(:)
1158 cpot(:) = cpot(:) + 0.9375_dp*erfa(:) - expa(:)*(0.875_dp + 0.25_dp*z(:)**2)
1160 cpot(:) = cpot(:) + 3.28125_dp*erfa(:) - expa(:)*(3.5625_dp + 1.375_dp*z(:)**2 + 0.25*z(:)**4)
1167 ALLOCATE (unp(n, n))
1169 unp(1:n, 1:n) = matmul(matmul(basis%cm(1:n, 1:m, l), pmat(1:m, 1:m, l)), &
1170 transpose(basis%cm(1:n, 1:m, l)))
1171 DO i = 1, basis%nprim(l)
1172 DO j = i, basis%nprim(l)
1173 IF (abs(unp(i, j)) < 1.e-14_dp) cycle
1175 IF (i /= j) ff = 2._dp*ff
1179 oab =
rootpi/(a + b)**(l + 1.5_dp)*ff
1180 z(:) = sab*grid%rad(:)
1181 DO k = 1,
SIZE(erfa)
1182 erfa(k) = oab*erf(z(k))/grid%rad(k)
1184 expa(:) = exp(-z(:)**2)*ff/(a + b)**(l + 1)
1189 cpot(:) = cpot(:) + 0.25_dp*erfa(:)
1191 cpot(:) = cpot(:) + 0.375_dp*erfa(:) - 0.25_dp*expa(:)
1193 cpot(:) = cpot(:) + 0.9375_dp*erfa(:) - expa(:)*(0.875_dp + 0.25_dp*z(:)**2)
1195 cpot(:) = cpot(:) + 3.28125_dp*erfa(:) - expa(:)*(3.5625_dp + 1.375_dp*z(:)**2 + 0.25*z(:)**4)
1203 DEALLOCATE (erfa, expa, z)
1219 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(INOUT) :: kmat
1221 REAL(kind=
dp),
DIMENSION(0:, :),
INTENT(IN) :: occ
1222 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: wfn
1226 INTEGER :: i, ia, ib, k, lad, lbc, lh, ll, nbas, &
1228 REAL(kind=
dp) :: almn
1229 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: cpot, nai, nbi, pot
1230 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: orb
1231 REAL(kind=
dp),
DIMENSION(0:maxfac) :: arho
1236 arho(ll) =
fac(ll)/
fac(lh)**2
1242 ALLOCATE (nai(nr), nbi(nr), cpot(nr), pot(nr))
1244 DO lad = 0, state%maxl_calc
1245 DO lbc = 0, state%maxl_occ
1246 norb = state%maxn_occ(lbc)
1247 nbas = basis%nbas(lbc)
1249 ALLOCATE (orb(nr, norb))
1253 orb(:, i) = orb(:, i) + wfn(k, i, lbc)*basis%bf(:, k, lbc)
1256 DO nu = abs(lad - lbc), lad + lbc, 2
1257 almn = arho(-lad + lbc + nu)*arho(lad - lbc + nu)*arho(lad + lbc - nu)/(real(lad + lbc + nu + 1,
dp) &
1258 *arho(lad + lbc + nu))
1261 DO ia = 1, basis%nbas(lad)
1263 nai(:) = orb(:, i)*basis%bf(:, ia, lad)
1265 IF (hfx_pot%scale_coulomb /= 0.0_dp)
THEN
1266 CALL potential_coulomb_numeric(pot, nai, nu, basis%grid)
1267 cpot(:) = cpot(:) + pot(:)*hfx_pot%scale_coulomb
1269 IF (hfx_pot%scale_longrange /= 0.0_dp)
THEN
1270 IF (hfx_pot%do_gh)
THEN
1271 CALL potential_longrange_numeric_gh(pot, nai, nu, basis%grid, hfx_pot%omega, &
1272 hfx_pot%kernel(:, :, nu))
1274 CALL potential_longrange_numeric(pot, nai, nu, basis%grid, hfx_pot%omega, &
1275 hfx_pot%kernel(:, :, nu))
1277 cpot(:) = cpot(:) + pot(:)*hfx_pot%scale_longrange
1279 DO ib = 1, basis%nbas(lad)
1280 kmat(ia, ib, lad) = kmat(ia, ib, lad) + almn*occ(lbc, i)* &
1281 integrate_grid(cpot, orb(:, i), basis%bf(:, ib, lad), basis%grid)
1291 DEALLOCATE (nai, nbi, cpot)
1307 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(INOUT) :: kmat
1309 REAL(kind=
dp),
DIMENSION(0:, :),
INTENT(IN) :: occ
1310 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: wfn
1314 INTEGER :: i, ia, ib, k, lad, lbc, lh, ll, nbas, &
1316 REAL(kind=
dp) :: almn
1317 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: cpot, nai, nbi
1318 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: orb
1319 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: pot
1320 REAL(kind=
dp),
DIMENSION(0:maxfac) :: arho
1325 arho(ll) =
fac(ll)/
fac(lh)**2
1331 nbas = maxval(basis%nbas)
1332 ALLOCATE (pot(nr, nbas, nbas))
1333 ALLOCATE (nai(nr), nbi(nr), cpot(nr))
1335 DO lad = 0, state%maxl_calc
1336 DO lbc = 0, state%maxl_occ
1337 norb = state%maxn_occ(lbc)
1338 nbas = basis%nbas(lbc)
1340 ALLOCATE (orb(nr, norb))
1344 orb(:, i) = orb(:, i) + wfn(k, i, lbc)*basis%bf(:, k, lbc)
1347 DO nu = abs(lad - lbc), lad + lbc, 2
1348 almn = arho(-lad + lbc + nu)*arho(lad - lbc + nu) &
1349 *arho(lad + lbc - nu)/(real(lad + lbc + nu + 1,
dp)*arho(lad + lbc + nu))
1353 CALL potential_analytic(pot, lad, lbc, nu, basis, hfx_pot)
1354 DO ia = 1, basis%nbas(lad)
1358 cpot(:) = cpot(:) + pot(:, ia, k)*wfn(k, i, lbc)
1360 DO ib = 1, basis%nbas(lad)
1361 kmat(ia, ib, lad) = kmat(ia, ib, lad) + almn*occ(lbc, i)* &
1362 integrate_grid(cpot, orb(:, i), basis%bf(:, ib, lad), basis%grid)
1372 DEALLOCATE (nai, nbi, cpot)
1386 SUBROUTINE potential_coulomb_numeric(cpot, density, nu, grid)
1387 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: cpot
1388 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: density
1389 INTEGER,
INTENT(IN) :: nu
1393 REAL(
dp) :: int1, int2
1394 REAL(
dp),
DIMENSION(:),
POINTER :: r, wr
1396 nc = min(
SIZE(cpot),
SIZE(density))
1402 cpot(nc:) = int1/r(nc:)**(nu + 1)
1405 cpassert(r(1) > r(nc))
1407 cpot(i) = int1/r(i)**(nu + 1) + int2*r(i)**nu
1408 int1 = int1 - r(i)**(nu)*density(i)*wr(i)
1409 int2 = int2 + density(i)*wr(i)/r(i)**(nu + 1)
1412 END SUBROUTINE potential_coulomb_numeric
1423 SUBROUTINE potential_longrange_numeric(cpot, density, nu, grid, omega, kernel)
1424 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: cpot
1425 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: density
1426 INTEGER,
INTENT(IN) :: nu
1428 REAL(kind=
dp),
INTENT(IN) :: omega
1429 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: kernel
1432 REAL(
dp),
DIMENSION(:),
POINTER :: r, wr
1433 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: work_inp, work_out
1435 nc = min(
SIZE(cpot),
SIZE(density))
1439 ALLOCATE (work_inp(nc), work_out(nc))
1444 work_inp(:nc) = density(:nc)*wr(:nc)
1445 CALL dsymv(
'U', nc, 1.0_dp, kernel, nc, work_inp, 1, 0.0_dp, work_out, 1)
1448 work_inp(:nc) = work_out(:nc)*exp(-r(:nc)**2)/r(:nc)**2*wr(:nc)
1449 CALL dsymv(
'U', nc, 1.0_dp, kernel, nc, work_inp, 1, 0.0_dp, work_out, 1)
1451 cpot(:nc) = work_out(:nc)*(2.0_dp*real(nu,
dp) + 1.0_dp)*4.0_dp/
pi*omega
1453 END SUBROUTINE potential_longrange_numeric
1464 SUBROUTINE potential_longrange_numeric_gh(cpot, density, nu, grid, omega, kernel)
1465 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: cpot
1466 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: density
1467 INTEGER,
INTENT(IN) :: nu
1469 REAL(kind=
dp),
INTENT(IN) :: omega
1470 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: kernel
1472 INTEGER :: n_max, nc, nc_kernel, nr_kernel
1473 REAL(
dp),
DIMENSION(:),
POINTER :: wr
1474 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: work_inp, work_out
1476 nc = min(
SIZE(cpot),
SIZE(density))
1479 nc_kernel =
SIZE(kernel, 1)
1480 nr_kernel =
SIZE(kernel, 2)
1481 n_max = max(nc, nc_kernel, nr_kernel)
1483 ALLOCATE (work_inp(n_max), work_out(n_max))
1488 work_inp(:nc) = density(:nc)*wr(:nc)
1489 CALL dgemv(
'T', nc_kernel, nr_kernel, 1.0_dp, kernel, nc_kernel, work_inp, 1, 0.0_dp, work_out, 1)
1492 work_inp(:nr_kernel) = work_out(:nr_kernel)
1493 CALL dgemv(
'N', nc_kernel, nr_kernel, 1.0_dp, kernel, nc_kernel, work_inp, 1, 0.0_dp, work_out, 1)
1495 cpot(:nc) = work_out(:nc)*(2.0_dp*real(nu,
dp) + 1.0_dp)*4.0_dp/
pi*omega
1497 END SUBROUTINE potential_longrange_numeric_gh
1512 SUBROUTINE potential_analytic(cpot, la, lb, nu, basis, hfx_pot)
1513 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(OUT) :: cpot
1514 INTEGER,
INTENT(IN) :: la, lb, nu
1518 INTEGER :: i, j, k, l, ll, m
1519 REAL(kind=
dp) :: a, b
1520 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: erfa, pot
1523 ALLOCATE (erfa(1:m))
1529 SELECT CASE (basis%basis_type)
1533 DO i = 1, basis%nbas(la)
1534 DO j = 1, basis%nbas(lb)
1538 IF (hfx_pot%scale_coulomb /= 0.0_dp)
THEN
1539 CALL potential_coulomb_analytic(erfa, a, b, ll, nu, basis%grid%rad)
1541 cpot(:, i, j) = cpot(:, i, j) + erfa(:)*hfx_pot%scale_coulomb
1544 IF (hfx_pot%scale_longrange /= 0.0_dp)
THEN
1545 CALL potential_longrange_analytic(erfa, a, b, ll, nu, basis%grid%rad, hfx_pot%omega)
1547 cpot(:, i, j) = cpot(:, i, j) + erfa(:)*hfx_pot%scale_longrange
1554 DO i = 1, basis%nprim(la)
1555 DO j = 1, basis%nprim(lb)
1561 IF (hfx_pot%scale_coulomb /= 0.0_dp)
THEN
1562 CALL potential_coulomb_analytic(erfa, a, b, ll, nu, basis%grid%rad)
1564 pot(:) = pot(:) + erfa(:)*hfx_pot%scale_coulomb
1567 IF (hfx_pot%scale_longrange /= 0.0_dp)
THEN
1568 CALL potential_longrange_analytic(erfa, a, b, ll, nu, basis%grid%rad, hfx_pot%omega)
1570 pot(:) = pot(:) + erfa(:)*hfx_pot%scale_longrange
1573 DO k = 1, basis%nbas(la)
1574 DO l = 1, basis%nbas(lb)
1575 cpot(:, k, l) = cpot(:, k, l) + pot(:)*basis%cm(i, k, la)*basis%cm(j, l, lb)
1585 END SUBROUTINE potential_analytic
1596 SUBROUTINE potential_coulomb_analytic(erfa, a, b, ll, nu, rad)
1597 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: erfa
1598 REAL(kind=
dp),
INTENT(IN) :: a, b
1599 INTEGER,
INTENT(IN) :: ll, nu
1600 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rad
1603 REAL(kind=
dp) :: oab, sab
1604 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: expa, z
1607 ALLOCATE (expa(nr), z(nr))
1610 oab =
dfac(ll + nu + 1)*
rootpi/sab**(ll + 2)/2._dp**((ll + nu)/2 + 2)
1612 erfa(:) = oab*erf(z(:))/z(:)**(nu + 1)
1613 expa(:) = exp(-z(:)**2)/sab**(ll + 2)/2._dp**((ll + nu)/2 + 2)
1621 erfa(:) = erfa(:) - 6._dp*expa(:)/z(:)
1627 erfa(:) = erfa(:) - 2._dp*expa(:)
1629 erfa(:) = erfa(:) - expa(:)*(20._dp + 30._dp/z(:)**2)
1636 erfa(:) = erfa(:) - expa(:)*(12._dp*z(:) + 30._dp/z(:))
1638 erfa(:) = erfa(:) - expa(:)*(56._dp*z(:) + 140._dp/z(:) + 210._dp/z(:)**3)
1645 erfa(:) = erfa(:) - expa(:)*(4._dp*z(:)**2 + 14._dp)
1647 erfa(:) = erfa(:) - expa(:)*(40._dp*z(:)**2 + 140._dp + 210._dp/z(:)**2)
1649 erfa(:) = erfa(:) - expa(:)*(144._dp*z(:)**2 + 504._dp + 1260._dp/z(:)**2 + 1890._dp/z(:)**4)
1656 erfa(:) = erfa(:) - expa(:)*(24._dp*z(:)**3 + 108._dp*z(:) + 210._dp/z(:))
1658 erfa(:) = erfa(:) - expa(:)*(112._dp*z(:)**3 + 504._dp*z(:) + 1260._dp/z(:) + 1890._dp/z(:)**3)
1660 erfa(:) = erfa(:) - expa(:)*(352._dp*z(:)**3 + 1584._dp*z(:) + 5544._dp/z(:) + &
1661 13860._dp/z(:)**3 + 20790._dp/z(:)**5)
1668 erfa(:) = erfa(:) - expa(:)*(8._dp*z(:)**4 + 44._dp*z(:)**2 + 114._dp)
1670 erfa(:) = erfa(:) - expa(:)*(80._dp*z(:)**4 + 440._dp*z(:)**2 + 1260._dp + 1896._dp/z(:)**2)
1672 erfa(:) = erfa(:) - expa(:)*(288._dp*z(:)**4 + 1584._dp*z(:)**2 + 5544._dp + &
1673 13860._dp/z(:)**2 + 20790._dp/z(:)**4)
1675 erfa(:) = erfa(:) - expa(:)*(832._dp*z(:)**4 + 4576._dp*z(:)**2 + 20592._dp + &
1676 72072._dp/z(:)**2 + 180180._dp/z(:)**4 + 270270._dp/z(:)**6)
1680 DEALLOCATE (expa, z)
1682 END SUBROUTINE potential_coulomb_analytic
1694 PURE SUBROUTINE potential_longrange_analytic(erfa, a, b, ll, nu, rad, omega)
1695 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: erfa
1696 REAL(kind=
dp),
INTENT(IN) :: a, b
1697 INTEGER,
INTENT(IN) :: ll, nu
1698 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rad
1699 REAL(kind=
dp),
INTENT(IN) :: omega
1701 INTEGER :: i, lambda, nr
1702 REAL(kind=
dp) :: ab, oab, pab, prel, sab
1703 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: expa, z
1705 IF (mod(ll - nu, 2) == 0 .AND. ll >= nu .AND. nu >= 0)
THEN
1707 ALLOCATE (expa(nr), z(nr))
1709 lambda = (ll - nu)/2
1712 pab = omega**2*ab/(omega**2 + ab)
1714 z(:) = sqrt(pab)*rad(:)
1715 oab =
fac(lambda)/sqrt(ab)**(ll + 2)/4.0_dp*sqrt(prel)**(nu + 1)*(2.0_dp*real(nu, kind=
dp) + 1.0_dp)
1716 expa(:) = exp(-z(:)**2)
1717 lambda = (ll - nu)/2
1719 IF (lambda > 0)
THEN
1722 erfa = erfa + (-prel)**i/real(i, kind=
dp)*
binomial_gen(lambda + nu + 0.5_dp, lambda - i)* &
1723 assoc_laguerre(z, real(nu, kind=
dp) + 0.5_dp, i - 1)
1725 erfa = erfa*expa*z**nu
1727 erfa = erfa + 2.0_dp*
binomial_gen(lambda + nu + 0.5_dp, lambda)*znfn(z, expa, nu)
1729 erfa = 2.0_dp*znfn(z, expa, nu)
1734 DEALLOCATE (expa, z)
1740 END SUBROUTINE potential_longrange_analytic
1749 ELEMENTAL FUNCTION znfn(z, expa, n)
RESULT(res)
1751 REAL(kind=
dp),
INTENT(IN) :: z, expa
1752 INTEGER,
INTENT(IN) :: n
1753 REAL(kind=
dp) :: res
1756 REAL(kind=
dp) :: z_exp
1759 IF (abs(z) < 1.0e-20)
THEN
1760 res = z**n/(2.0_dp*real(n, kind=
dp) + 1.0_dp)
1761 ELSE IF (n == 0)
THEN
1762 res =
rootpi/2.0_dp*erf(z)/z
1764 res =
rootpi/4.0_dp*erf(z)/z**2 - expa/z/2.0_dp
1765 z_exp = -expa*0.5_dp
1768 res = (real(i, kind=
dp) - 0.5_dp)*res/z + z_exp
1785 ELEMENTAL FUNCTION assoc_laguerre(z, a, n)
RESULT(res)
1787 REAL(kind=
dp),
INTENT(IN) :: z, a
1788 INTEGER,
INTENT(IN) :: n
1789 REAL(kind=
dp) :: res
1792 REAL(kind=
dp) :: f0, f1
1796 ELSE IF (n == 1)
THEN
1797 res = a + 1.0_dp - z
1798 ELSE IF (n > 0)
THEN
1803 res = (2.0_dp + (a - 1.0_dp - z)/real(i,
dp))*f1 - (1.0_dp + (a - 1.0_dp)/real(i,
dp))*f0
1811 END FUNCTION assoc_laguerre
1822 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(IN) :: opmat, pmat
1823 REAL(kind=
dp) :: trace
1839 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(INOUT) :: imat
1840 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: cpot
1842 INTEGER,
INTENT(IN) :: derivatives
1844 INTEGER :: i, j, l, n
1846 SELECT CASE (derivatives)
1852 imat(i, j, l) = imat(i, j, l) + &
1853 integrate_grid(cpot, basis%bf(:, i, l), basis%bf(:, j, l), basis%grid)
1854 imat(j, i, l) = imat(i, j, l)
1863 imat(i, j, l) = imat(i, j, l) + &
1864 integrate_grid(cpot, basis%dbf(:, i, l), basis%bf(:, j, l), basis%grid)
1865 imat(i, j, l) = imat(i, j, l) + &
1866 integrate_grid(cpot, basis%bf(:, i, l), basis%dbf(:, j, l), basis%grid)
1867 imat(j, i, l) = imat(i, j, l)
1876 imat(i, j, l) = imat(i, j, l) + &
1877 integrate_grid(cpot, basis%dbf(:, i, l), basis%dbf(:, j, l), basis%grid)
1878 imat(j, i, l) = imat(i, j, l)
1899 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(INOUT) :: jmat
1900 TYPE(
eri),
DIMENSION(:),
INTENT(IN) :: erint
1901 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(IN) :: pmat
1902 INTEGER,
DIMENSION(0:),
INTENT(IN) :: nsize
1903 LOGICAL,
INTENT(IN),
OPTIONAL :: all_nu
1905 INTEGER :: i1, i2, ij1, ij2, j1, j2, l1, l2, ll, &
1907 LOGICAL :: have_all_nu
1908 REAL(kind=
dp) :: eint, f1, f2
1910 IF (
PRESENT(all_nu))
THEN
1911 have_all_nu = all_nu
1913 have_all_nu = .false.
1916 jmat(:, :, :) = 0._dp
1928 IF (i1 /= j1) f1 = 2._dp
1934 IF (i2 /= j2) f2 = 2._dp
1935 eint = erint(ll)%int(ij1, ij2)
1937 jmat(i1, j1, l1) = jmat(i1, j1, l1) + f2*pmat(i2, j2, l2)*eint
1939 jmat(i1, j1, l1) = jmat(i1, j1, l1) + f2*pmat(i2, j2, l2)*eint
1940 jmat(i2, j2, l2) = jmat(i2, j2, l2) + f1*pmat(i1, j1, l1)*eint
1946 IF (have_all_nu)
THEN
1956 jmat(j1, i1, l1) = jmat(i1, j1, l1)
1973 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(INOUT) :: kmat
1974 TYPE(
eri),
DIMENSION(:),
INTENT(IN) :: erint
1975 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(IN) :: pmat
1976 INTEGER,
DIMENSION(0:),
INTENT(IN) :: nsize
1978 INTEGER :: i1, i2, ij1, ij2, j1, j2, l1, l2, lh, &
1980 REAL(kind=
dp) :: almn, eint, f1, f2
1981 REAL(kind=
dp),
DIMENSION(0:maxfac) :: arho
1986 arho(ll) =
fac(ll)/
fac(lh)**2
1989 kmat(:, :, :) = 0._dp
1995 DO nu = abs(l1 - l2), l1 + l2, 2
1996 almn = arho(-l1 + l2 + nu)*arho(l1 - l2 + nu)*arho(l1 + l2 - nu)/(real(l1 + l2 + nu + 1,
dp)*arho(l1 + l2 + nu))
2004 IF (i1 /= j1) f1 = 2._dp
2010 IF (i2 /= j2) f2 = 2._dp
2011 eint = erint(ll)%int(ij1, ij2)
2013 kmat(i1, j1, l1) = kmat(i1, j1, l1) + f2*almn*pmat(i2, j2, l2)*eint
2015 kmat(i1, j1, l1) = kmat(i1, j1, l1) + f2*almn*pmat(i2, j2, l2)*eint
2016 kmat(i2, j2, l2) = kmat(i2, j2, l2) + f1*almn*pmat(i1, j1, l1)*eint
2029 kmat(j1, i1, l1) = kmat(i1, j1, l1)
2049 PURE SUBROUTINE err_matrix(emat, demax, kmat, pmat, umat, upmat, nval, nbs)
2050 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(OUT) :: emat
2051 REAL(kind=
dp),
INTENT(OUT) :: demax
2052 REAL(kind=
dp),
DIMENSION(:, :, 0:),
INTENT(IN) :: kmat, pmat, umat, upmat
2053 INTEGER,
DIMENSION(0:),
INTENT(IN) :: nval, nbs
2056 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: tkmat, tpmat
2063 ALLOCATE (tkmat(1:m, 1:m), tpmat(1:m, 1:m))
2066 tkmat(1:m, 1:m) = matmul(transpose(umat(1:n, 1:m, l)), matmul(kmat(1:n, 1:n, l), umat(1:n, 1:m, l)))
2067 tpmat(1:m, 1:m) = matmul(transpose(umat(1:n, 1:m, l)), matmul(pmat(1:n, 1:n, l), umat(1:n, 1:m, l)))
2068 tpmat(1:m, 1:m) = matmul(upmat(1:m, 1:m, l), matmul(tpmat(1:m, 1:m), upmat(1:m, 1:m, l)))
2070 emat(1:m, 1:m, l) = matmul(tkmat(1:m, 1:m), tpmat(1:m, 1:m)) - matmul(tpmat(1:m, 1:m), tkmat(1:m, 1:m))
2072 DEALLOCATE (tkmat, tpmat)
2075 demax = maxval(abs(emat))
2093 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: density1, density2
2094 INTEGER,
INTENT(IN) :: zcore
2098 INTEGER :: counter, i, l, mc, mm(0:
lmat), mo, n, ns
2099 INTEGER,
DIMENSION(lmat+1, 20) :: ne
2100 REAL(kind=
dp) :: a, pf
2108 mo = state%maxn_occ(l)
2109 IF (sum(state%core(l, :)) == 0)
THEN
2110 cpassert(ns >= l + mo)
2112 ne(l + 1, l + counter) = nint(state%occ(l, counter))
2116 cpassert(sum(state%occ(l, 1:mc)) == 0)
2117 cpassert(ns >= l + mc)
2119 ne(l + 1, l + counter) = nint(state%core(l, counter))
2121 cpassert(ns >= l + mc + mo)
2122 DO counter = mc + 1, mc + mo
2123 ne(l + 1, l + counter) = nint(state%occ(l, counter))
2130 DO l = 0, state%maxl_occ
2131 DO i = 1,
SIZE(state%occ, 2)
2132 IF (state%occ(l, i) > 0._dp)
THEN
2134 a =
srules(zcore, ne, n, l)
2135 pf = 1._dp/sqrt(
fac(2*n))*(2._dp*a)**(n + 0.5_dp)
2136 IF (state%multiplicity == -1)
THEN
2137 density1(:) = density1(:) + state%occ(l, i)/
fourpi*(grid%rad(:)**(n - 1)*exp(-a*grid%rad(:))*pf)**2
2139 density1(:) = density1(:) + state%occa(l, i)/
fourpi*(grid%rad(:)**(n - 1)*exp(-a*grid%rad(:))*pf)**2
2140 density2(:) = density2(:) + state%occb(l, i)/
fourpi*(grid%rad(:)**(n - 1)*exp(-a*grid%rad(:))*pf)**2
2158 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rho
2159 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: vxc
2162 REAL(kind=
dp) :: ec, ex, rs, vc, vx
2166 IF (rho(i) > 1.e-20_dp)
THEN
2168 ex = -0.7385588_dp*rho(i)**0.333333333_dp
2169 vx = 1.333333333_dp*ex
2170 rs = (3._dp/
fourpi/rho(i))**0.333333333_dp
2171 ec = -0.88_dp/(rs + 7.8_dp)
2172 vc = ec*(1._dp + rs/(3._dp*(rs + 7.8_dp)))
2188 INTEGER,
INTENT(IN) :: method, multiplicity
2189 LOGICAL :: consistent
2193 SELECT CASE (method)
2195 consistent = .false.
2197 consistent = (multiplicity == -1)
2199 consistent = (multiplicity /= -1)
2201 consistent = (multiplicity == -1)
2203 consistent = (multiplicity /= -1)
2205 consistent = .false.
2219 REAL(kind=
dp),
INTENT(OUT) :: rho0
2221 INTEGER :: m0, m1, m2, method, nr
2222 LOGICAL :: nlcc, spinpol
2223 REAL(kind=
dp) :: d0, d1, d2, r0, r1, r2, w0, w1
2224 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: xfun
2225 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rho
2227 method =
atom%method_type
2228 SELECT CASE (method)
2239 nr =
atom%basis%grid%nr
2242 nlcc =
atom%potential%gth_pot%nlcc
2244 nlcc =
atom%potential%upf_pot%core_correction
2246 nlcc =
atom%potential%sgp_pot%has_nlcc
2252 m0 = maxval(minloc(
atom%basis%grid%rad))
2256 ELSE IF (m0 == 1)
THEN
2260 cpabort(
"GRID Definition incompatible")
2262 r0 =
atom%basis%grid%rad(m0)
2263 r1 =
atom%basis%grid%rad(m1)
2264 r2 =
atom%basis%grid%rad(m2)
2269 ALLOCATE (rho(nr, 2))
2275 rho(:, 1) = rho(:, 1) + 0.5_dp*xfun(:)
2276 rho(:, 2) = rho(:, 2) + 0.5_dp*xfun(:)
2278 rho(:, 1) = rho(:, 1) + rho(:, 2)
2280 ALLOCATE (rho(nr, 1))
2290 rho0 = w0*d0 + w1*d1
2291 rho0 = max(rho0, 0.0_dp)
2310 REAL(kind=
dp) :: crad
2311 INTEGER,
INTENT(IN) :: iw
2315 REAL(kind=
dp),
DIMENSION(10) :: cnum, rad
2317 WRITE (iw,
'(/,A,F8.4)')
" Basis Set Condition Numbers: 2*covalent radius=", 2*crad
2322 ci = 2.0_dp*(0.85_dp + i*0.05_dp)
2325 WRITE (iw,
'(A,F15.3,T50,A,F14.4)')
" Lattice constant:", &
2326 rad(i),
"Condition number:", cnum(i)
2330 WRITE (iw,
'(A,A,T50,A,F14.4)')
" Lattice constant:", &
2331 " Inf",
"Condition number:", cnum(i)
2345 INTEGER,
INTENT(IN) :: zv, iw
2347 INTEGER :: i, j, l, ll, m, n, nbas, nl, nr
2348 INTEGER,
DIMENSION(0:lmat) ::
nelem, nlmax, nlmin
2349 INTEGER,
DIMENSION(lmat+1, 7) :: ne
2350 REAL(kind=
dp) :: al, c1, c2, pf
2351 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: sfun
2352 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: bmat
2353 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: omat
2354 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :, :) :: sint
2355 REAL(kind=
dp),
DIMENSION(0:lmat, 10) :: snl
2356 REAL(kind=
dp),
DIMENSION(2) :: sse
2357 REAL(kind=
dp),
DIMENSION(lmat+1, 7) :: sexp
2365 IF (
nelem(l) >= ll)
THEN
2368 ELSE IF (
nelem(l) > 0)
THEN
2369 ne(l + 1, i) =
nelem(l)
2382 IF (ne(l + 1, i) > 0)
THEN
2386 nlmax(l) = max(nlmax(l), nlmin(l) + 1)
2395 sexp(l + 1, i) =
srules(zv, ne, i, l)
2396 IF (ne(l + 1, i - l) > 0)
THEN
2397 sse(1) = max(sse(1), sexp(l + 1, i))
2398 sse(2) = min(sse(2), sexp(l + 1, i))
2402 snl(l, i) = abs(2._dp*sse(1) - 0.5_dp*sse(2))/9._dp*real(i - 1, kind=
dp) + 0.5_dp*min(sse(1), sse(2))
2406 nbas = maxval(basis%nbas)
2407 ALLOCATE (omat(nbas, nbas, 0:
lmat))
2408 nr =
SIZE(basis%bf, 1)
2409 ALLOCATE (sfun(nr), sint(10, 2, nbas, 0:
lmat))
2417 pf = (2._dp*al)**nl*sqrt(2._dp*al/
fac(2*nl))
2418 sfun(1:nr) = pf*basis%grid%rad(1:nr)**(nl - 1)*exp(-al*basis%grid%rad(1:nr))
2419 DO j = 1, basis%nbas(l)
2420 sint(i, 1, j, l) = sum(sfun(1:nr)*basis%bf(1:nr, j, l)*basis%grid%wr(1:nr))
2423 pf = (2._dp*al)**nl*sqrt(2._dp*al/
fac(2*nl))
2424 sfun(1:nr) = pf*basis%grid%rad(1:nr)**(nl - 1)*exp(-al*basis%grid%rad(1:nr))
2425 DO j = 1, basis%nbas(l)
2426 sint(i, 2, j, l) = sum(sfun(1:nr)*basis%bf(1:nr, j, l)*basis%grid%wr(1:nr))
2435 SELECT CASE (basis%basis_type)
2439 CALL sg_overlap(omat(1:n, 1:n, l), l, basis%am(1:n, l), basis%am(1:n, l))
2441 ALLOCATE (bmat(m, m))
2442 CALL sg_overlap(bmat(1:m, 1:m), l, basis%am(1:m, l), basis%am(1:m, l))
2443 CALL contract2(omat(1:n, 1:n, l), bmat(1:m, 1:m), basis%cm(1:m, 1:n, l))
2446 CALL sto_overlap(omat(1:n, 1:n, l), basis%ns(1:n, l), basis%as(1:n, l), &
2447 basis%ns(1:n, l), basis%as(1:n, l))
2454 WRITE (iw,
'(/,A)')
" Basis Set Completeness Estimates"
2458 WRITE (iw,
'(A,I3)')
" L-quantum number: ", l
2459 WRITE (iw,
'(A,T31,A,I2,T61,A,I2)')
" Slater Exponent",
"Completeness n-qm=", nlmin(l), &
2460 "Completeness n-qm=", nlmax(l)
2462 c1 = dot_product(sint(i, 1, 1:n, l), matmul(omat(1:n, 1:n, l), sint(i, 1, 1:n, l)))
2463 c2 = dot_product(sint(i, 2, 1:n, l), matmul(omat(1:n, 1:n, l), sint(i, 2, 1:n, l)))
2464 WRITE (iw,
"(T6,F14.6,T41,F10.6,T71,F10.6)") snl(l, i), c1, c2
2468 DEALLOCATE (omat, sfun, sint)
2480 REAL(kind=
dp),
INTENT(IN) :: rad
2481 REAL(kind=
dp),
INTENT(OUT) :: cnum
2483 INTEGER :: ia, ib,
imax, info, ix, iy, iz, ja, jb, &
2484 ka, kb, l, la, lb, lwork, na, nb, &
2486 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: ibptr
2487 REAL(kind=
dp) :: r1, r2, reps, rmax
2488 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: weig, work
2489 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat
2490 REAL(kind=
dp),
DIMENSION(2*lmat+1, 2*lmat+1) :: sab
2491 REAL(kind=
dp),
DIMENSION(3) :: rab
2492 REAL(kind=
dp),
DIMENSION(:),
POINTER :: zeta, zetb
2499 nbas = nbas + basis%nbas(l)*(2*l + 1)
2502 ALLOCATE (smat(nbas, nbas), ibptr(nbas, 0:
lmat))
2507 DO ia = 1, basis%nbas(l)
2508 ibptr(ia, l) = na + 1
2514 IF (basis%basis_type ==
gto_basis .OR. &
2517 na = basis%nprim(la)
2520 zeta => basis%am(:, la)
2522 nb = basis%nprim(lb)
2525 zetb => basis%am(:, lb)
2528 IF (rad < 0.1_dp)
THEN
2533 rmax = max(2._dp*r1, 2._dp*r2)
2534 imax = int(rmax/rad) + 1
2541 smat(ja:ja + nna - 1, jb:jb + nnb - 1) = smat(ja:ja + nna - 1, jb:jb + nnb - 1) + sab(1:nna, 1:nnb)
2543 DO ka = 1, basis%nbas(la)
2544 DO kb = 1, basis%nbas(lb)
2547 smat(ja:ja + nna - 1, jb:jb + nnb - 1) = smat(ja:ja + nna - 1, jb:jb + nnb - 1) + &
2548 sab(1:nna, 1:nnb)*basis%cm(ia, ka, la)*basis%cm(ib, kb, lb)
2559 CALL overlap_ab_s(la, zeta(ia), lb, zetb(ib), rab, sab)
2563 smat(ja:ja + nna - 1, jb:jb + nnb - 1) = smat(ja:ja + nna - 1, jb:jb + nnb - 1) &
2566 DO ka = 1, basis%nbas(la)
2567 DO kb = 1, basis%nbas(lb)
2570 smat(ja:ja + nna - 1, jb:jb + nnb - 1) = &
2571 smat(ja:ja + nna - 1, jb:jb + nnb - 1) + &
2572 sab(1:nna, 1:nnb)*basis%cm(ia, ka, la)*basis%cm(ib, kb, lb)
2585 cpabort(
"Condition number not available for this basis type")
2589 lwork = max(nbas*nbas, nbas + 100)
2590 ALLOCATE (weig(nbas), work(lwork))
2592 CALL dsyev(
"N",
"U", nbas, smat, nbas, weig, work, lwork, info)
2594 IF (weig(1) < 0.0_dp)
THEN
2597 cnum = abs(weig(nbas)/weig(1))
2601 DEALLOCATE (smat, ibptr, weig, work)
2612 REAL(
dp),
DIMENSION(:, :),
INTENT(INOUT) :: int
2613 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: omat, cm
2615 CHARACTER(len=*),
PARAMETER :: routinen =
'contract2'
2617 INTEGER :: handle, m, n
2619 CALL timeset(routinen, handle)
2624 int(1:n, 1:n) = matmul(transpose(cm(1:m, 1:n)), matmul(omat(1:m, 1:m), cm(1:m, 1:n)))
2626 CALL timestop(handle)
2638 REAL(
dp),
DIMENSION(:, :),
INTENT(INOUT) :: int
2639 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: omat, cm
2641 CHARACTER(len=*),
PARAMETER :: routinen =
'contract2add'
2643 INTEGER :: handle, m, n
2645 CALL timeset(routinen, handle)
2650 int(1:n, 1:n) = int(1:n, 1:n) + matmul(transpose(cm(1:m, 1:n)), matmul(omat(1:m, 1:m), cm(1:m, 1:n)))
2652 CALL timestop(handle)
2664 REAL(
dp),
DIMENSION(:, :),
INTENT(INOUT) ::
eri
2665 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: omat, cm1, cm2
2667 CHARACTER(len=*),
PARAMETER :: routinen =
'contract4'
2669 INTEGER :: handle, i1, i2, m1, m2, mm1, mm2, n1, &
2671 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: amat, atran, bmat, btran, hint
2673 CALL timeset(routinen, handle)
2684 ALLOCATE (amat(m1, m1), atran(n1, n1), bmat(m2, m2), btran(n2, n2))
2685 ALLOCATE (hint(mm1, nn2))
2688 CALL iunpack(bmat(1:m2, 1:m2), omat(i1, 1:mm2), m2)
2689 CALL contract2(btran(1:n2, 1:n2), bmat(1:m2, 1:m2), cm2(1:m2, 1:n2))
2690 CALL ipack(btran(1:n2, 1:n2), hint(i1, 1:nn2), n2)
2694 CALL iunpack(amat(1:m1, 1:m1), hint(1:mm1, i2), m1)
2695 CALL contract2(atran(1:n1, 1:n1), amat(1:m1, 1:m1), cm1(1:m1, 1:n1))
2696 CALL ipack(atran(1:n1, 1:n1),
eri(1:nn1, i2), n1)
2699 DEALLOCATE (amat, atran, bmat, btran)
2702 CALL timestop(handle)
2712 PURE SUBROUTINE ipack(mat, vec, n)
2713 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: mat
2714 REAL(
dp),
DIMENSION(:),
INTENT(INOUT) :: vec
2715 INTEGER,
INTENT(IN) :: n
2727 END SUBROUTINE ipack
2735 PURE SUBROUTINE iunpack(mat, vec, n)
2736 REAL(
dp),
DIMENSION(:, :),
INTENT(INOUT) :: mat
2737 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: vec
2738 INTEGER,
INTENT(IN) :: n
2751 END SUBROUTINE iunpack
static int imax(int x, int y)
Returns the larger of two given integers (missing from the C standard)
subroutine, public sto_overlap(smat, na, pa, nb, pb)
...
subroutine, public sg_overlap(smat, l, pa, pb)
...
Calculation of the overlap integrals over Cartesian Gaussian-type functions.
subroutine, public overlap_ab_s(la, zeta, lb, zetb, rab, sab)
Calculation of the two-center overlap integrals [a|b] over Spherical Gaussian-type functions.
subroutine, public overlap_ab_sp(la, zeta, lb, zetb, alat, sab)
Calculation of the overlap integrals [a|b] over cubic periodic Spherical Gaussian-type functions.
All kind of helpful little routines.
real(kind=dp) function, public exp_radius(l, alpha, threshold, prefactor, epsabs, epsrel, rlow)
The radius of a primitive Gaussian function for a given threshold is calculated. g(r) = prefactor*r**...
Define the atom type and its sub types.
integer, parameter, public num_basis
integer, parameter, public cgto_basis
integer, parameter, public gto_basis
integer, parameter, public sto_basis
integer, parameter, public lmat
Some basic routines for atomic calculations.
subroutine, public slater_density(density1, density2, zcore, state, grid)
Calculate Slater density on a radial grid.
subroutine, public atom_condnumber(basis, crad, iw)
Print condition numbers of the given atomic basis set.
pure subroutine, public atom_denmat(pmat, wfn, nbas, occ, maxl, maxn)
Calculate a density matrix using atomic orbitals.
pure subroutine, public atom_local_potential(locpot, gthpot, rr)
...
subroutine, public contract2(int, omat, cm)
Transform a matrix expressed in terms of a uncontracted basis set to a contracted one.
subroutine, public atom_read_external_vxc(vxc, atom, iw)
ZMP subroutine to read external v_xc in the atomic code.
pure subroutine, public eeri_contract(kmat, erint, pmat, nsize)
Contract exchange Electron Repulsion Integrals.
pure subroutine, public atom_orbital_charge(charge, wfn, rcov, l, basis)
...
pure logical function, public atom_consistent_method(method, multiplicity)
Check that the atomic multiplicity is consistent with the electronic structure method.
subroutine, public atom_core_density(corden, potential, typ, rr)
...
pure integer function, dimension(0:lmat), public get_maxn_occ(occupation)
Return the maximum principal quantum number of occupied orbitals.
subroutine, public exchange_semi_analytic(kmat, state, occ, wfn, basis, hfx_pot)
Calculate the exchange potential semi-analytically.
pure subroutine, public ceri_contract(jmat, erint, pmat, nsize, all_nu)
Contract Coulomb Electron Repulsion Integrals.
subroutine, public coulomb_potential_analytic(cpot, pmat, basis, grid, maxl)
Analytically compute the Coulomb potential on an atomic radial grid.
pure subroutine, public err_matrix(emat, demax, kmat, pmat, umat, upmat, nval, nbs)
Calculate the error matrix for each angular momentum.
subroutine, public atom_density(density, pmat, basis, maxl, typ, rr)
Map the electron density on an atomic radial grid.
pure subroutine, public wigner_slater_functional(rho, vxc)
Calculate the functional derivative of the Wigner (correlation) - Slater (exchange) density functiona...
subroutine, public atom_read_zmp_restart(atom, doguess, iw)
ZMP subroutine to read external restart file.
subroutine, public atom_basis_condnum(basis, rad, cnum)
Calculate the condition number of the given atomic basis set.
subroutine, public contract4(eri, omat, cm1, cm2)
Contract a matrix of Electron Repulsion Integrals (ERI-s).
subroutine, public exchange_numeric(kmat, state, occ, wfn, basis, hfx_pot)
Calculate the exchange potential numerically.
pure real(kind=dp) function, public atom_trace(opmat, pmat)
Compute Trace[opmat * pmat] == Trace[opmat * pmat^T] .
pure subroutine, public atom_orbital_max(rmax, wfn, rcov, l, basis)
...
subroutine, public atom_read_external_density(density, atom, iw)
ZMP subroutine to read external density from linear grid of density matrix.
subroutine, public numpot_matrix(imat, cpot, basis, derivatives)
Calculate a potential matrix by integrating the potential on an atomic radial grid.
subroutine, public atom_solve(hmat, umat, orb, ener, nb, nv, maxl)
Solve the generalised eigenproblem for every angular momentum.
subroutine, public get_rho0(atom, rho0)
Calculate the total electron density at R=0.
subroutine, public atom_completeness(basis, zv, iw)
Estimate completeness of the given atomic basis set.
subroutine, public atom_write_zmp_restart(atom)
ZMP subroutine to write external restart file.
subroutine, public atom_set_occupation(ostring, occupation, wfnocc, multiplicity)
Set occupation of atomic orbitals.
subroutine, public contract2add(int, omat, cm)
Same as contract2(), but add the new contracted matrix to the old one instead of overwriting it.
subroutine, public coulomb_potential_numeric(cpot, density, grid)
Numerically compute the Coulomb potential on an atomic radial grid.
pure subroutine, public atom_orbital_nodes(node, wfn, rcov, l, basis)
...
pure integer function, public get_maxl_occ(occupation)
Return the maximum orbital quantum number of occupied orbitals.
pure subroutine, public atom_wfnr0(value, wfn, basis)
...
pure real(dp) function, public srules(z, ne, n, l)
...
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
integer function, public get_unit_number(file_name)
Returns the first logical unit that is not preconnected.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
sums arrays of real/complex numbers with much reduced round-off as compared to a naive implementation...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
real(kind=dp), dimension(-1:2 *maxfac+1), parameter, public dfac
real(kind=dp), parameter, public rootpi
real(kind=dp), parameter, public fourpi
integer, parameter, public maxfac
real(kind=dp), dimension(0:maxfac), parameter, public fac
Collection of simple mathematical functions and subroutines.
elemental real(kind=dp) function, public binomial_gen(z, k)
The generalized binomial coefficient z over k for 0 <= k <= n is calculated. (z) z*(z-1)*....
subroutine, public invmat_symm(a, potrf, uplo)
returns inverse of real symmetric, positive definite matrix
Provides Cartesian and spherical orbital pointers and indices.
subroutine, public init_orbital_pointers(maxl)
Initialize or update the orbital pointers.
subroutine, public deallocate_orbital_pointers()
Deallocate the orbital pointers.
Periodic Table related data definitions.
type(atom), dimension(0:nelem), public ptable
integer, parameter, public nelem
Definition of physical constants:
real(kind=dp), parameter, public bohr
Simple splines Splines are fully specified by the interpolation points, except that at the ends,...
subroutine, public spline3ders(x, y, xnew, ynew, dynew, d2ynew)
...
Utilities for string manipulations.
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.
Provides all information about a basis set.
Provides all information about a pseudopotential.
Provides info about hartree-fock exchange (For now, we only support potentials that can be represente...
Provides all information on states and occupation.
Provides all information about an atomic kind.