71 SUBROUTINE overlap(la_max_set, la_min_set, npgfa, rpgfa, zeta, &
72 lb_max_set, lb_min_set, npgfb, rpgfb, zetb, &
73 rab, dab, sab, da_max_set, return_derivatives, s, lds)
74 INTEGER,
INTENT(IN) :: la_max_set, la_min_set, npgfa
75 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa, zeta
76 INTEGER,
INTENT(IN) :: lb_max_set, lb_min_set, npgfb
77 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb, zetb
78 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
79 REAL(kind=
dp),
INTENT(IN) :: dab
80 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: sab
81 INTEGER,
INTENT(IN) :: da_max_set
82 LOGICAL,
INTENT(IN) :: return_derivatives
83 INTEGER,
INTENT(IN) :: lds
84 REAL(kind=
dp),
DIMENSION(lds, lds, *), &
87 INTEGER :: ax, axis, ay, az, bx, by, bz, cda, cdax, cday, cdaz, coa, cob, da, da_max, dax, &
88 day, daz, first, first_b, i, ipgf, j, jk, jpgf, jstart, k, la_max, la_start, last, &
89 last_b, lb_max, lb_start, ldrr, na, nb
90 INTEGER,
ALLOCATABLE :: derivative_map(:, :, :)
91 REAL(kind=
dp) :: f0, zetp
92 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rr
93 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
96 la_max = la_max_set + da_max_set
99 ldrr = max(la_max, lb_max) + 1
100 ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
102 ALLOCATE (derivative_map(4,
ncoset(la_max - 1), 3))
119 IF (rpgfa(ipgf) + rpgfb(jpgf) < dab)
THEN
120 DO j = nb + 1, nb +
ncoset(lb_max_set)
121 DO i = na + 1, na +
ncoset(la_max_set)
125 IF (return_derivatives)
THEN
126 DO k = 2,
ncoset(da_max_set)
127 jstart = (k - 1)*
SIZE(sab, 1)
128 DO j = jstart + nb + 1, jstart + nb +
ncoset(lb_max_set)
129 DO i = na + 1, na +
ncoset(la_max_set)
135 nb = nb +
ncoset(lb_max_set)
141 zetp = 1.0_dp/(zeta(ipgf) + zetb(jpgf))
143 f0 = sqrt((
pi*zetp)**3)*exp(-zeta(ipgf)*zetb(jpgf)*zetp*dab*dab)
144 rap(:) = zetb(jpgf)*zetp*rab(:)
145 rbp(:) = -zeta(ipgf)*zetp*rab(:)
147 CALL os_rr_ovlp(rap, la_max, rbp, lb_max, 1.0_dp/zetp, ldrr, rr)
149 DO cob = 1,
ncoset(lb_max)
153 DO coa = 1,
ncoset(la_max)
157 s(coa, cob, 1) = f0*rr(ax, bx, 1)*rr(ay, by, 2)*rr(az, bz, 3)
163 DO j = 1,
ncoset(lb_max_set)
164 DO i = 1,
ncoset(la_max_set)
165 sab(na + i, nb + j) = s(i, j, 1)
172 IF (return_derivatives)
THEN
176 la_start = la_min_set
177 lb_start = lb_min_set
180 first =
ncoset(la_start - 1) + 1
181 first_b =
ncoset(lb_start - 1) + 1
182 last_b =
ncoset(lb_max_set)
183 DO da = 0, da_max - 1
184 last =
ncoset(la_max - da - 1)
188 cda =
coset(dax, day, daz)
189 cdax =
coset(dax + 1, day, daz)
190 cday =
coset(dax, day + 1, daz)
191 cdaz =
coset(dax, day, daz + 1)
192 CALL cartesian_ladder(s(:, first_b:last_b, cda), s(first:last, first_b:last_b, cdax), &
193 derivative_map(:, first:last, 1), .true., zeta(ipgf), 0.0_dp, .false.)
194 CALL cartesian_ladder(s(:, first_b:last_b, cda), s(first:last, first_b:last_b, cday), &
195 derivative_map(:, first:last, 2), .true., zeta(ipgf), 0.0_dp, .false.)
196 CALL cartesian_ladder(s(:, first_b:last_b, cda), s(first:last, first_b:last_b, cdaz), &
197 derivative_map(:, first:last, 3), .true., zeta(ipgf), 0.0_dp, .false.)
205 IF (return_derivatives)
THEN
206 DO k = 2,
ncoset(da_max_set)
207 jstart = (k - 1)*
SIZE(sab, 1)
208 DO j = 1,
ncoset(lb_max_set)
210 DO i = 1,
ncoset(la_max_set)
211 sab(na + i, nb + jk) = s(i, j, k)
217 nb = nb +
ncoset(lb_max_set)
221 na = na +
ncoset(la_max_set)
250 lb_max, lb_min, npgfb, rpgfb, zetb, &
251 rab, sab, dab, ddab, rr_work)
252 INTEGER,
INTENT(IN) :: la_max, la_min, npgfa
253 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa, zeta
254 INTEGER,
INTENT(IN) :: lb_max, lb_min, npgfb
255 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb, zetb
256 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
257 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT), &
259 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT), &
260 OPTIONAL :: dab, ddab
261 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT), &
262 OPTIONAL,
TARGET :: rr_work
264 INTEGER,
PARAMETER :: pairs(2, 6) = reshape([1, 1, 1, 2, 1, 3, 2, 2, 2, 3, 3, 3], [2, 6])
266 INTEGER :: avec(3), bvec(3), coa, cob, ia, ib, &
267 icomp, idir, ipgf, jdir, jpgf, kdir, &
268 ldrr, lma, lmb, ma, mb, na, nb, ofa, &
270 REAL(kind=
dp) :: a, b, f0, factor(3), rab2, sval(3), tab, &
272 REAL(kind=
dp),
ALLOCATABLE :: drr_a(:, :, :), drr_ab(:, :, :)
273 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
274 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: rr
278 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
282 cpassert(
PRESENT(sab) .OR.
PRESENT(dab) .OR.
PRESENT(ddab))
283 IF (
PRESENT(sab))
THEN
287 IF (
PRESENT(dab))
THEN
291 IF (
PRESENT(ddab))
THEN
295 ldrr = max(lma, lmb) + 1
299 IF (
PRESENT(rr_work))
THEN
300 cpassert(
SIZE(rr_work) >= ldrr*ldrr*3)
301 rr(0:ldrr - 1, 0:ldrr - 1, 1:3) => rr_work(1:ldrr*ldrr*3)
303 ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
306 IF (
PRESENT(dab) .OR.
PRESENT(ddab))
ALLOCATE (drr_a(0:ldrr - 1, 0:ldrr - 1, 3))
307 IF (
PRESENT(ddab))
ALLOCATE (drr_ab(0:ldrr - 1, 0:ldrr - 1, 3))
314 IF (
PRESENT(sab))
THEN
315 cpassert((
SIZE(sab, 1) >= na*npgfa))
316 cpassert((
SIZE(sab, 2) >= nb*npgfb))
318 IF (
PRESENT(dab))
THEN
319 cpassert((
SIZE(dab, 1) >= na*npgfa))
320 cpassert((
SIZE(dab, 2) >= nb*npgfb))
321 cpassert((
SIZE(dab, 3) >= 3))
323 IF (
PRESENT(ddab))
THEN
324 cpassert((
SIZE(ddab, 1) >= na*npgfa))
325 cpassert((
SIZE(ddab, 2) >= nb*npgfb))
326 cpassert((
SIZE(ddab, 3) >= 6))
335 IF (rpgfa(ipgf) + rpgfb(jpgf) < tab)
THEN
336 IF (
PRESENT(sab)) sab(ma + 1:ma + na, mb + 1:mb + nb) = 0.0_dp
337 IF (
PRESENT(dab)) dab(ma + 1:ma + na, mb + 1:mb + nb, 1:3) = 0.0_dp
338 IF (
PRESENT(ddab)) ddab(ma + 1:ma + na, mb + 1:mb + nb, 1:6) = 0.0_dp
352 f0 = (
pi/zet)**(1.5_dp)*exp(-xhi*rab2)
355 CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
356 IF (
PRESENT(dab) .OR.
PRESENT(ddab))
THEN
357 CALL apply_cartesian_1d(rr, drr_a, la_max, lmb, .false., .true., a, [0.0_dp, 0.0_dp, 0.0_dp])
359 IF (
PRESENT(ddab))
THEN
360 CALL apply_cartesian_1d(drr_a, drr_ab, la_max, lb_max, .true., .true., b, [0.0_dp, 0.0_dp, 0.0_dp])
363 DO cob = ofb + 1,
ncoset(lb_max)
366 DO coa = ofa + 1,
ncoset(la_max)
369 sval = [(rr(avec(idir), bvec(idir), idir), idir=1, 3)]
371 IF (
PRESENT(sab))
THEN
372 sab(ia, ib) = f0*sval(1)*sval(2)*sval(3)
375 IF (
PRESENT(dab))
THEN
377 jdir = mod(idir, 3) + 1
378 kdir = mod(idir + 1, 3) + 1
379 dab(ia, ib, idir) = f0*drr_a(avec(idir), bvec(idir), idir)*sval(jdir)*sval(kdir)
383 IF (
PRESENT(ddab))
THEN
385 idir = pairs(1, icomp)
386 jdir = pairs(2, icomp)
388 IF (idir == jdir)
THEN
389 factor(idir) = -drr_ab(avec(idir), bvec(idir), idir)
391 factor(idir) = drr_a(avec(idir), bvec(idir), idir)
392 factor(jdir) = drr_a(avec(jdir), bvec(jdir), jdir)
394 ddab(ia, ib, icomp) = f0*factor(1)*factor(2)*factor(3)
406 IF (.NOT.
PRESENT(rr_work))
DEALLOCATE (rr)
438 la2_max, la2_min, npgfa2, rpgfa2, zeta2, &
439 lb_max, lb_min, npgfb, rpgfb, zetb, &
440 rab, saab, daab, saba, daba)
441 INTEGER,
INTENT(IN) :: la1_max, la1_min, npgfa1
442 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa1, zeta1
443 INTEGER,
INTENT(IN) :: la2_max, la2_min, npgfa2
444 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa2, zeta2
445 INTEGER,
INTENT(IN) :: lb_max, lb_min, npgfb
446 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb, zetb
447 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
448 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT), &
450 REAL(kind=
dp),
DIMENSION(:, :, :, :), &
451 INTENT(INOUT),
OPTIONAL :: daab
452 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT), &
454 REAL(kind=
dp),
DIMENSION(:, :, :, :), &
455 INTENT(INOUT),
OPTIONAL :: daba
457 INTEGER :: coa1, coa2, cob, i1pgf, i2pgf, ia1, ia2, &
458 ib, jpgf, ldrr, lma, lmb, ma1, ma2, &
459 mb, na1, na2, nb, ofa1, ofa2, ofb
460 INTEGER,
DIMENSION(3) :: a2vec, avec, bvec
461 REAL(kind=
dp) :: a, b, dum(3), f0, rab2, rpgfa, tab, &
463 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: drr, rr
464 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
468 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
472 cpassert(
PRESENT(saab) .OR.
PRESENT(daab) .OR.
PRESENT(saba) .OR.
PRESENT(daba))
473 IF (
PRESENT(saab) .OR.
PRESENT(saba))
THEN
474 lma = la1_max + la2_max
477 IF (
PRESENT(daab) .OR.
PRESENT(daba))
THEN
478 lma = la1_max + la2_max + 1
481 ldrr = max(lma, lmb) + 1
484 ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
485 IF (
PRESENT(daab) .OR.
PRESENT(daba))
ALLOCATE (drr(0:lma - 1, 0:lmb, 3))
488 ofa1 =
ncoset(la1_min - 1)
489 ofa2 =
ncoset(la2_min - 1)
491 na1 =
ncoset(la1_max) - ofa1
492 na2 =
ncoset(la2_max) - ofa2
494 IF (
PRESENT(saab))
THEN
495 cpassert((
SIZE(saab, 1) >= na1*npgfa1))
496 cpassert((
SIZE(saab, 2) >= na2*npgfa2))
497 cpassert((
SIZE(saab, 3) >= nb*npgfb))
499 IF (
PRESENT(daab))
THEN
500 cpassert((
SIZE(daab, 1) >= na1*npgfa1))
501 cpassert((
SIZE(daab, 2) >= na2*npgfa2))
502 cpassert((
SIZE(daab, 3) >= nb*npgfb))
503 cpassert((
SIZE(daab, 4) >= 3))
505 IF (
PRESENT(saba))
THEN
506 cpassert((
SIZE(saba, 1) >= na1*npgfa1))
507 cpassert((
SIZE(saba, 2) >= nb*npgfb))
508 cpassert((
SIZE(saba, 3) >= na2*npgfa2))
510 IF (
PRESENT(daba))
THEN
511 cpassert((
SIZE(daba, 1) >= na1*npgfa1))
512 cpassert((
SIZE(daba, 2) >= nb*npgfb))
513 cpassert((
SIZE(daba, 3) >= na2*npgfa2))
514 cpassert((
SIZE(daba, 4) >= 3))
522 rpgfa = min(rpgfa1(i1pgf), rpgfa2(i2pgf))
526 IF (rpgfa + rpgfb(jpgf) < tab)
THEN
527 IF (
PRESENT(saab)) saab(ma1 + 1:ma1 + na1, ma2 + 1:ma2 + na2, mb + 1:mb + nb) = 0.0_dp
528 IF (
PRESENT(daab)) daab(ma1 + 1:ma1 + na1, ma2 + 1:ma2 + na2, mb + 1:mb + nb, 1:3) = 0.0_dp
529 IF (
PRESENT(saba)) saba(ma1 + 1:ma1 + na1, mb + 1:mb + nb, ma2 + 1:ma2 + na2) = 0.0_dp
530 IF (
PRESENT(daba)) daba(ma1 + 1:ma1 + na1, mb + 1:mb + nb, ma2 + 1:ma2 + na2, 1:3) = 0.0_dp
536 a = zeta1(i1pgf) + zeta2(i2pgf)
544 f0 = (
pi/zet)**(1.5_dp)*exp(-xhi*rab2)
547 CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
548 IF (
PRESENT(daab) .OR.
PRESENT(daba))
THEN
550 [0.0_dp, 0.0_dp, 0.0_dp])
553 DO cob = ofb + 1,
ncoset(lb_max)
556 DO coa2 = ofa2 + 1,
ncoset(la2_max)
557 a2vec =
indco(:, coa2)
558 ia2 = ma2 + coa2 - ofa2
559 DO coa1 = ofa1 + 1,
ncoset(la1_max)
560 avec =
indco(:, coa1) + a2vec
561 ia1 = ma1 + coa1 - ofa1
563 IF (
PRESENT(saab) .OR.
PRESENT(saba))
THEN
564 value = f0*rr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
565 IF (
PRESENT(saab)) saab(ia1, ia2, ib) =
value
566 IF (
PRESENT(saba)) saba(ia1, ib, ia2) =
value
569 IF (
PRESENT(daab) .OR.
PRESENT(daba))
THEN
570 dum(1) = f0*drr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
571 dum(2) = f0*rr(avec(1), bvec(1), 1)*drr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
572 dum(3) = f0*rr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*drr(avec(3), bvec(3), 3)
573 IF (
PRESENT(daab)) daab(ia1, ia2, ib, 1:3) = dum
574 IF (
PRESENT(daba)) daba(ia1, ib, ia2, 1:3) = dum
616 lb1_max, lb1_min, npgfb1, rpgfb1, zetb1, &
617 lb2_max, lb2_min, npgfb2, rpgfb2, zetb2, &
619 INTEGER,
INTENT(IN) :: la_max, la_min, npgfa
620 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa, zeta
621 INTEGER,
INTENT(IN) :: lb1_max, lb1_min, npgfb1
622 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb1, zetb1
623 INTEGER,
INTENT(IN) :: lb2_max, lb2_min, npgfb2
624 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb2, zetb2
625 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
626 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT), &
628 REAL(kind=
dp),
DIMENSION(:, :, :, :), &
629 INTENT(INOUT),
OPTIONAL :: dabb
631 INTEGER :: coa, cob1, cob2, ia, ib1, ib2, ipgf, &
632 j1pgf, j2pgf, ldrr, lma, lmb, ma, mb1, &
633 mb2, na, nb1, nb2, ofa, ofb1, ofb2
634 INTEGER,
DIMENSION(3) :: avec, b2vec, bvec
635 REAL(kind=
dp) :: a, b, f0, rab2, rpgfb, tab, xhi, zet
636 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: drr, rr
637 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
641 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
645 cpassert(
PRESENT(sabb) .OR.
PRESENT(dabb))
646 IF (
PRESENT(sabb))
THEN
648 lmb = lb1_max + lb2_max
650 IF (
PRESENT(dabb))
THEN
652 lmb = lb1_max + lb2_max
654 ldrr = max(lma, lmb) + 1
657 ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
658 IF (
PRESENT(dabb))
ALLOCATE (drr(0:lma - 1, 0:lmb, 3))
662 ofb1 =
ncoset(lb1_min - 1)
663 ofb2 =
ncoset(lb2_min - 1)
665 nb1 =
ncoset(lb1_max) - ofb1
666 nb2 =
ncoset(lb2_max) - ofb2
667 IF (
PRESENT(sabb))
THEN
668 cpassert((
SIZE(sabb, 1) >= na*npgfa))
669 cpassert((
SIZE(sabb, 2) >= nb1*npgfb1))
670 cpassert((
SIZE(sabb, 3) >= nb2*npgfb2))
672 IF (
PRESENT(dabb))
THEN
673 cpassert((
SIZE(dabb, 1) >= na*npgfa))
674 cpassert((
SIZE(dabb, 2) >= nb1*npgfb1))
675 cpassert((
SIZE(dabb, 3) >= nb2*npgfb2))
676 cpassert((
SIZE(dabb, 4) >= 3))
687 rpgfb = min(rpgfb1(j1pgf), rpgfb2(j2pgf))
688 IF (rpgfa(ipgf) + rpgfb < tab)
THEN
689 IF (
PRESENT(sabb)) sabb(ma + 1:ma + na, mb1 + 1:mb1 + nb1, mb2 + 1:mb2 + nb2) = 0.0_dp
690 IF (
PRESENT(dabb)) dabb(ma + 1:ma + na, mb1 + 1:mb1 + nb1, mb2 + 1:mb2 + nb2, 1:3) = 0.0_dp
697 b = zetb1(j1pgf) + zetb2(j2pgf)
704 f0 = (
pi/zet)**(1.5_dp)*exp(-xhi*rab2)
707 CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
708 IF (
PRESENT(dabb))
THEN
710 [0.0_dp, 0.0_dp, 0.0_dp])
713 DO cob2 = ofb2 + 1,
ncoset(lb2_max)
714 b2vec =
indco(:, cob2)
715 ib2 = mb2 + cob2 - ofb2
716 DO cob1 = ofb1 + 1,
ncoset(lb1_max)
717 bvec =
indco(:, cob1) + b2vec
718 ib1 = mb1 + cob1 - ofb1
719 DO coa = ofa + 1,
ncoset(la_max)
723 IF (
PRESENT(sabb))
THEN
724 sabb(ia, ib1, ib2) = f0*rr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
727 IF (
PRESENT(dabb))
THEN
728 dabb(ia, ib1, ib2, 1) = f0*drr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
729 dabb(ia, ib1, ib2, 2) = f0*rr(avec(1), bvec(1), 1)*drr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
730 dabb(ia, ib1, ib2, 3) = f0*rr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*drr(avec(3), bvec(3), 3)
810 INTEGER,
INTENT(IN) :: la
811 REAL(kind=
dp),
INTENT(IN) :: zeta
812 INTEGER,
INTENT(IN) :: lb
813 REAL(kind=
dp),
INTENT(IN) :: zetb, alat
814 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: sab
816 COMPLEX(KIND=dp) :: zfg
817 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: fun, gun
818 INTEGER :: ax, ay, az, bx, by, bz, i, ia, ib, l, &
819 l1, l2, na, nb, nca, ncb, nmax, nsa, &
821 REAL(kind=
dp) :: oa, ob, ovol, zm
822 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: fexp, gexp, gval
823 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: cab
824 REAL(kind=
dp),
DIMENSION(0:3, 0:3) :: fgsum
825 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: c2sa, c2sb
829 ALLOCATE (cab(nca, ncb))
835 nmax = nint(1.81_dp*alat*sqrt(zm) + 1.0_dp)
836 ALLOCATE (fun(-nmax:nmax, 0:la), gun(-nmax:nmax, 0:lb), &
837 fexp(-nmax:nmax), gexp(-nmax:nmax), gval(-nmax:nmax))
842 gval(i) =
twopi/alat*real(i, kind=
dp)
843 fexp(i) = sqrt(oa*
pi)*exp(-0.25_dp*oa*gval(i)**2)
844 gexp(i) = sqrt(ob*
pi)*exp(-0.25_dp*ob*gval(i)**2)
849 ELSE IF (l == 1)
THEN
850 fun(:, l) = cmplx(0.0_dp, 0.5_dp*oa*gval(:), kind=
dp)
851 ELSE IF (l == 2)
THEN
852 fun(:, l) = cmplx(-(0.5_dp*oa*gval(:))**2, 0.0_dp, kind=
dp)
853 fun(:, l) = fun(:, l) + cmplx(0.5_dp*oa, 0.0_dp, kind=
dp)
854 ELSE IF (l == 3)
THEN
855 fun(:, l) = cmplx(0.0_dp, -(0.5_dp*oa*gval(:))**3, kind=
dp)
856 fun(:, l) = fun(:, l) + cmplx(0.0_dp, 0.75_dp*oa*oa*gval(:), kind=
dp)
858 cpabort(
"l value too high")
864 ELSE IF (l == 1)
THEN
865 gun(:, l) = cmplx(0.0_dp, 0.5_dp*ob*gval(:), kind=
dp)
866 ELSE IF (l == 2)
THEN
867 gun(:, l) = cmplx(-(0.5_dp*ob*gval(:))**2, 0.0_dp, kind=
dp)
868 gun(:, l) = gun(:, l) + cmplx(0.5_dp*ob, 0.0_dp, kind=
dp)
869 ELSE IF (l == 3)
THEN
870 gun(:, l) = cmplx(0.0_dp, -(0.5_dp*ob*gval(:))**3, kind=
dp)
871 gun(:, l) = gun(:, l) + cmplx(0.0_dp, 0.75_dp*ob*ob*gval(:), kind=
dp)
873 cpabort(
"l value too high")
880 zfg = sum(conjg(fun(:, l1))*fexp(:)*gun(:, l2)*gexp(:))
881 fgsum(l1, l2) = real(zfg, kind=
dp)
890 ia =
coset(ax, ay, az) - na
894 ib =
coset(bx, by, bz) - nb
895 cab(ia, ib) = fgsum(ax, bx)*fgsum(ay, by)*fgsum(az, bz)
903 sab(1:nsa, 1:nsb) = matmul(c2sa(1:nsa, 1:nca), &
904 matmul(cab(1:nca, 1:ncb), transpose(c2sb(1:nsb, 1:ncb))))
905 ovol = 1._dp/(alat**3)
906 sab(1:nsa, 1:nsb) = ovol*sab(1:nsa, 1:nsb)
908 DEALLOCATE (cab, fun, gun, fexp, gexp, gval)
subroutine, public overlap(la_max_set, la_min_set, npgfa, rpgfa, zeta, lb_max_set, lb_min_set, npgfb, rpgfb, zetb, rab, dab, sab, da_max_set, return_derivatives, s, lds)
Purpose: Calculation of the two-center overlap integrals [a|b] over Cartesian Gaussian-type functions...
subroutine, public overlap_ab(la_max, la_min, npgfa, rpgfa, zeta, lb_max, lb_min, npgfb, rpgfb, zetb, rab, sab, dab, ddab, rr_work)
Calculation of the two-center overlap integrals [a|b] over Cartesian Gaussian-type functions....
subroutine, public overlap_aab(la1_max, la1_min, npgfa1, rpgfa1, zeta1, la2_max, la2_min, npgfa2, rpgfa2, zeta2, lb_max, lb_min, npgfb, rpgfb, zetb, rab, saab, daab, saba, daba)
Calculation of the two-center overlap integrals [aa|b] over Cartesian Gaussian-type functions.
subroutine, public overlap_abb(la_max, la_min, npgfa, rpgfa, zeta, lb1_max, lb1_min, npgfb1, rpgfb1, zetb1, lb2_max, lb2_min, npgfb2, rpgfb2, zetb2, rab, sabb, dabb)
Calculation of the two-center overlap integrals [a|bb] over Cartesian Gaussian-type functions.