63 lb_max_set, lb_min_set, npgfb, rpgfb, zetb, &
64 npot_ecp, alpha_ecp, coeffs_ecp, nrpot_ecp, &
65 rpgfc, rab, dab, rac, dac, dbc, vab, pab, force_a, force_b)
67 INTEGER,
INTENT(IN) :: la_max_set, la_min_set, npgfa
68 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa, zeta
69 INTEGER,
INTENT(IN) :: lb_max_set, lb_min_set, npgfb
70 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb, zetb
71 INTEGER,
INTENT(IN) :: npot_ecp
72 REAL(kind=
dp),
DIMENSION(1:npot_ecp),
INTENT(IN) :: alpha_ecp, coeffs_ecp
73 INTEGER,
DIMENSION(1:npot_ecp),
INTENT(IN) :: nrpot_ecp
74 REAL(kind=
dp),
INTENT(IN) :: rpgfc
75 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
76 REAL(kind=
dp),
INTENT(IN) :: dab
77 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rac
78 REAL(kind=
dp),
INTENT(IN) :: dac, dbc
79 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: vab
80 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN), &
82 REAL(kind=
dp),
DIMENSION(3),
INTENT(INOUT), &
83 OPTIONAL :: force_a, force_b
85 INTEGER :: a_offset, a_start, b_offset, b_start, i, &
86 ipgf, j, jpgf, li, lj, ncoa, ncob
87 LOGICAL :: calc_forces
88 REAL(
dp) :: expi, expj, fac_a, fac_b, mindist, &
89 normi, normj, prefi, prefj, zeti, zetj
90 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: tmp, tmpx, tmpy, tmpz
91 REAL(
dp),
DIMENSION(3) :: ra, rb, rc
96 IF (
PRESENT(pab) .AND.
PRESENT(force_a) .AND.
PRESENT(force_b)) calc_forces = .true.
102 CALL cp_warn(__location__, &
103 "ECP gradients calculated with the libgrpp library are, to this date, not numerically stable. "// &
104 "Please use the reference routine 'libgrpp_local_forces_ref' instead.")
114 IF (dab >= mindist .AND. dbc >= mindist .AND. dac >= mindist)
THEN
119 ELSE IF (dab < mindist .AND. dac >= mindist)
THEN
124 ELSE IF (dab >= mindist .AND. dac < mindist)
THEN
129 ELSE IF (dab >= mindist .AND. dbc < mindist)
THEN
135 calc_forces = .false.
144 ALLOCATE (tmp(
nco(la_max_set)*
nco(lb_max_set)))
145 IF (calc_forces)
THEN
146 ALLOCATE (tmpx(
nco(la_max_set)*
nco(lb_max_set)))
147 ALLOCATE (tmpy(
nco(la_max_set)*
nco(lb_max_set)))
148 ALLOCATE (tmpz(
nco(la_max_set)*
nco(lb_max_set)))
152 IF (rpgfa(ipgf) + rpgfc < dac) cycle
154 a_start = (ipgf - 1)*
ncoset(la_max_set)
157 IF (rpgfb(jpgf) + rpgfc < dbc) cycle
158 IF (rpgfa(ipgf) + rpgfb(jpgf) < dab) cycle
160 b_start = (jpgf - 1)*
ncoset(lb_max_set)
162 DO li = la_min_set, la_max_set
163 a_offset = a_start +
ncoset(li - 1)
165 prefi = 2.0_dp**li*(2.0_dp/
pi)**0.75_dp
166 expi = 0.25_dp*real(2*li + 3,
dp)
167 normi = 1.0_dp/(prefi*zeti**expi)
169 DO lj = lb_min_set, lb_max_set
170 b_offset = b_start +
ncoset(lj - 1)
172 prefj = 2.0_dp**lj*(2.0_dp/
pi)**0.75_dp
173 expj = 0.25_dp*real(2*lj + 3,
dp)
174 normj = 1.0_dp/(prefj*zetj**expj)
176 tmp(1:ncoa*ncob) = 0.0_dp
180 rb, lj, 1, [normj], [zetj], &
181 rc, [npot_ecp], nrpot_ecp, &
182 coeffs_ecp, alpha_ecp, tmp)
187 vab(a_offset + i, b_offset + j) = vab(a_offset + i, b_offset + j) + tmp((i - 1)*ncob + j)
191 IF (calc_forces)
THEN
192 tmpx(1:ncoa*ncob) = 0.0_dp
193 tmpy(1:ncoa*ncob) = 0.0_dp
194 tmpz(1:ncoa*ncob) = 0.0_dp
198 rb, lj, 1, [normj], [zetj], &
199 rc, [npot_ecp], nrpot_ecp, &
200 coeffs_ecp, alpha_ecp, ra, &
207 force_a(1) = force_a(1) + fac_a*pab(a_offset + i, b_offset + j)*tmpx((i - 1)*ncob + j)
208 force_a(2) = force_a(2) + fac_a*pab(a_offset + i, b_offset + j)*tmpy((i - 1)*ncob + j)
209 force_a(3) = force_a(3) + fac_a*pab(a_offset + i, b_offset + j)*tmpz((i - 1)*ncob + j)
213 tmpx(1:ncoa*ncob) = 0.0_dp
214 tmpy(1:ncoa*ncob) = 0.0_dp
215 tmpz(1:ncoa*ncob) = 0.0_dp
219 rb, lj, 1, [normj], [zetj], &
220 rc, [npot_ecp], nrpot_ecp, &
221 coeffs_ecp, alpha_ecp, rb, &
228 force_b(1) = force_b(1) + fac_b*pab(a_offset + i, b_offset + j)*tmpx((i - 1)*ncob + j)
229 force_b(2) = force_b(2) + fac_b*pab(a_offset + i, b_offset + j)*tmpy((i - 1)*ncob + j)
230 force_b(3) = force_b(3) + fac_b*pab(a_offset + i, b_offset + j)*tmpz((i - 1)*ncob + j)
271 lb_max_set, lb_min_set, npgfb, rpgfb, zetb, &
272 lmax_ecp, npot_ecp, alpha_ecp, coeffs_ecp, nrpot_ecp, &
273 rpgfc, rab, dab, rac, dac, dbc, vab, pab, force_a, force_b)
275 INTEGER,
INTENT(IN) :: la_max_set, la_min_set, npgfa
276 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa, zeta
277 INTEGER,
INTENT(IN) :: lb_max_set, lb_min_set, npgfb
278 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb, zetb
279 INTEGER,
INTENT(IN) :: lmax_ecp
280 INTEGER,
DIMENSION(0:10),
INTENT(IN) :: npot_ecp
281 REAL(kind=
dp),
DIMENSION(1:15, 0:10),
INTENT(IN) :: alpha_ecp, coeffs_ecp
282 INTEGER,
DIMENSION(1:15, 0:10),
INTENT(IN) :: nrpot_ecp
283 REAL(kind=
dp),
INTENT(IN) :: rpgfc
284 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
285 REAL(kind=
dp),
INTENT(IN) :: dab
286 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rac
287 REAL(kind=
dp),
INTENT(IN) :: dac, dbc
288 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: vab
289 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN), &
291 REAL(kind=
dp),
DIMENSION(3),
INTENT(INOUT), &
292 OPTIONAL :: force_a, force_b
294 INTEGER :: a_offset, a_start, b_offset, b_start, i, &
295 ipgf, j, jpgf, li, lj, lk, ncoa, ncob
296 LOGICAL :: calc_forces
297 REAL(
dp) :: expi, expj, fac_a, fac_b, mindist, &
298 normi, normj, prefi, prefj, zeti, zetj
299 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: tmp, tmpx, tmpy, tmpz
300 REAL(
dp),
DIMENSION(3) :: ra, rb, rc
304 calc_forces = .false.
305 IF (
PRESENT(pab) .AND.
PRESENT(force_a) .AND.
PRESENT(force_b)) calc_forces = .true.
307 IF (calc_forces)
THEN
311 CALL cp_warn(__location__, &
312 "ECP gradients calculated with the libgrpp library are, to this date, not numerically stable. "// &
313 "Please use the reference routine 'libgrpp_semilocal_forces_ref' instead.")
323 IF (dab >= mindist .AND. dbc >= mindist .AND. dac >= mindist)
THEN
328 ELSE IF (dab < mindist .AND. dac >= mindist)
THEN
333 ELSE IF (dab >= mindist .AND. dac < mindist)
THEN
338 ELSE IF (dab >= mindist .AND. dbc < mindist)
THEN
344 calc_forces = .false.
353 ALLOCATE (tmp(
nco(la_max_set)*
nco(lb_max_set)))
354 IF (calc_forces)
THEN
355 ALLOCATE (tmpx(
nco(la_max_set)*
nco(lb_max_set)))
356 ALLOCATE (tmpy(
nco(la_max_set)*
nco(lb_max_set)))
357 ALLOCATE (tmpz(
nco(la_max_set)*
nco(lb_max_set)))
361 IF (rpgfa(ipgf) + rpgfc < dac) cycle
363 a_start = (ipgf - 1)*
ncoset(la_max_set)
366 IF (rpgfb(jpgf) + rpgfc < dbc) cycle
367 IF (rpgfa(ipgf) + rpgfb(jpgf) < dab) cycle
369 b_start = (jpgf - 1)*
ncoset(lb_max_set)
371 DO li = la_min_set, la_max_set
372 a_offset = a_start +
ncoset(li - 1)
374 prefi = 2.0_dp**li*(2.0_dp/
pi)**0.75_dp
375 expi = 0.25_dp*real(2*li + 3,
dp)
376 normi = 1.0_dp/(prefi*zeti**expi)
378 DO lj = lb_min_set, lb_max_set
379 b_offset = b_start +
ncoset(lj - 1)
381 prefj = 2.0_dp**lj*(2.0_dp/
pi)**0.75_dp
382 expj = 0.25_dp*real(2*lj + 3,
dp)
383 normj = 1.0_dp/(prefj*zetj**expj)
387 tmp(1:ncoa*ncob) = 0.0_dp
391 rb, lj, 1, [normj], [zetj], &
392 rc, lk, [npot_ecp(lk)], nrpot_ecp(:, lk), &
393 coeffs_ecp(:, lk), alpha_ecp(:, lk), tmp)
398 vab(a_offset + i, b_offset + j) = vab(a_offset + i, b_offset + j) + tmp((i - 1)*ncob + j)
402 IF (calc_forces)
THEN
404 tmpx(1:ncoa*ncob) = 0.0_dp
405 tmpy(1:ncoa*ncob) = 0.0_dp
406 tmpz(1:ncoa*ncob) = 0.0_dp
410 rb, lj, 1, [normj], [zetj], &
411 rc, lk, [npot_ecp(lk)], nrpot_ecp(:, lk), &
412 coeffs_ecp(:, lk), alpha_ecp(:, lk), ra, &
419 force_a(1) = force_a(1) + fac_a*pab(a_offset + i, b_offset + j)*tmpx((i - 1)*ncob + j)
420 force_a(2) = force_a(2) + fac_a*pab(a_offset + i, b_offset + j)*tmpy((i - 1)*ncob + j)
421 force_a(3) = force_a(3) + fac_a*pab(a_offset + i, b_offset + j)*tmpz((i - 1)*ncob + j)
425 tmpx(1:ncoa*ncob) = 0.0_dp
426 tmpy(1:ncoa*ncob) = 0.0_dp
427 tmpz(1:ncoa*ncob) = 0.0_dp
431 rb, lj, 1, [normj], [zetj], &
432 rc, lk, [npot_ecp(lk)], nrpot_ecp(:, lk), &
433 coeffs_ecp(:, lk), alpha_ecp(:, lk), rb, &
439 force_b(1) = force_b(1) + fac_b*pab(a_offset + i, b_offset + j)*tmpx((i - 1)*ncob + j)
440 force_b(2) = force_b(2) + fac_b*pab(a_offset + i, b_offset + j)*tmpy((i - 1)*ncob + j)
441 force_b(3) = force_b(3) + fac_b*pab(a_offset + i, b_offset + j)*tmpz((i - 1)*ncob + j)
487 lb_max_set, lb_min_set, npgfb, rpgfb, zetb, &
488 npot_ecp, alpha_ecp, coeffs_ecp, nrpot_ecp, &
489 rpgfc, rab, dab, rac, dac, dbc, vab, pab, force_a, force_b)
491 INTEGER,
INTENT(IN) :: la_max_set, la_min_set, npgfa
492 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa, zeta
493 INTEGER,
INTENT(IN) :: lb_max_set, lb_min_set, npgfb
494 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb, zetb
495 INTEGER,
INTENT(IN) :: npot_ecp
496 REAL(kind=
dp),
DIMENSION(1:npot_ecp),
INTENT(IN) :: alpha_ecp, coeffs_ecp
497 INTEGER,
DIMENSION(1:npot_ecp),
INTENT(IN) :: nrpot_ecp
498 REAL(kind=
dp),
INTENT(IN) :: rpgfc
499 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
500 REAL(kind=
dp),
INTENT(IN) :: dab
501 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rac
502 REAL(kind=
dp),
INTENT(IN) :: dac, dbc
503 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: vab
504 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: pab
505 REAL(kind=
dp),
DIMENSION(3),
INTENT(INOUT) :: force_a, force_b
507 INTEGER :: a_offset, a_offset_f, a_start, &
508 a_start_f, b_offset, b_offset_f, &
509 b_start, b_start_f, i, ipgf, j, jpgf, &
511 REAL(
dp) :: expi, expj, normi, normj, prefi, prefj, &
513 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: tmp
514 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: vab_f
515 REAL(
dp),
DIMENSION(3) :: ra, rb, rc
520 ALLOCATE (vab_f(npgfa*
ncoset(la_max_set + 1), npgfb*
ncoset(lb_max_set + 1)))
528 ALLOCATE (tmp(
nco(la_max_set + 1)*
nco(lb_max_set + 1)))
531 IF (rpgfa(ipgf) + rpgfc < dac) cycle
533 a_start = (ipgf - 1)*
ncoset(la_max_set)
534 a_start_f = (ipgf - 1)*
ncoset(la_max_set + 1)
537 IF (rpgfb(jpgf) + rpgfc < dbc) cycle
538 IF (rpgfa(ipgf) + rpgfb(jpgf) < dab) cycle
540 b_start = (jpgf - 1)*
ncoset(lb_max_set)
541 b_start_f = (jpgf - 1)*
ncoset(lb_max_set + 1)
543 DO li = max(0, la_min_set - 1), la_max_set + 1
544 a_offset = a_start +
ncoset(li - 1)
545 a_offset_f = a_start_f +
ncoset(li - 1)
547 prefi = 2.0_dp**li*(2.0_dp/
pi)**0.75_dp
548 expi = 0.25_dp*real(2*li + 3,
dp)
549 normi = 1.0_dp/(prefi*zeti**expi)
551 DO lj = max(0, lb_min_set - 1), lb_max_set + 1
552 b_offset = b_start +
ncoset(lj - 1)
553 b_offset_f = b_start_f +
ncoset(lj - 1)
555 prefj = 2.0_dp**lj*(2.0_dp/
pi)**0.75_dp
556 expj = 0.25_dp*real(2*lj + 3,
dp)
557 normj = 1.0_dp/(prefj*zetj**expj)
559 tmp(1:ncoa*ncob) = 0.0_dp
563 rb, lj, 1, [normj], [zetj], &
564 rc, [npot_ecp], nrpot_ecp, &
565 coeffs_ecp, alpha_ecp, tmp)
570 vab_f(a_offset_f + i, b_offset_f + j) = &
571 vab_f(a_offset_f + i, b_offset_f + j) + tmp((i - 1)*ncob + j)
576 IF (li >= la_min_set .AND. li <= la_max_set .AND. lj >= lb_min_set .AND. lj <= lb_max_set)
THEN
579 vab(a_offset + i, b_offset + j) = vab(a_offset + i, b_offset + j) + tmp((i - 1)*ncob + j)
590 CALL contract_basis_center_forces(la_max_set, npgfa, zeta, lb_max_set, npgfb, zetb, &
591 vab_f, pab, force_a, force_b)
626 lb_max_set, lb_min_set, npgfb, rpgfb, zetb, &
627 lmax_ecp, npot_ecp, alpha_ecp, coeffs_ecp, nrpot_ecp, &
628 rpgfc, rab, dab, rac, dac, dbc, vab, pab, force_a, force_b)
630 INTEGER,
INTENT(IN) :: la_max_set, la_min_set, npgfa
631 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa, zeta
632 INTEGER,
INTENT(IN) :: lb_max_set, lb_min_set, npgfb
633 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb, zetb
634 INTEGER,
INTENT(IN) :: lmax_ecp
635 INTEGER,
DIMENSION(0:10),
INTENT(IN) :: npot_ecp
636 REAL(kind=
dp),
DIMENSION(1:15, 0:10),
INTENT(IN) :: alpha_ecp, coeffs_ecp
637 INTEGER,
DIMENSION(1:15, 0:10),
INTENT(IN) :: nrpot_ecp
638 REAL(kind=
dp),
INTENT(IN) :: rpgfc
639 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
640 REAL(kind=
dp),
INTENT(IN) :: dab
641 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rac
642 REAL(kind=
dp),
INTENT(IN) :: dac, dbc
643 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: vab
644 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: pab
645 REAL(kind=
dp),
DIMENSION(3),
INTENT(INOUT) :: force_a, force_b
647 INTEGER :: a_offset, a_offset_f, a_start, &
648 a_start_f, b_offset, b_offset_f, &
649 b_start, b_start_f, i, ipgf, j, jpgf, &
650 li, lj, lk, ncoa, ncob
651 REAL(
dp) :: expi, expj, normi, normj, prefi, prefj, &
653 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: tmp
654 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: vab_f
655 REAL(
dp),
DIMENSION(3) :: ra, rb, rc
660 ALLOCATE (vab_f(npgfa*
ncoset(la_max_set + 1), npgfb*
ncoset(lb_max_set + 1)))
668 ALLOCATE (tmp(
nco(la_max_set + 1)*
nco(lb_max_set + 1)))
671 IF (rpgfa(ipgf) + rpgfc < dac) cycle
673 a_start = (ipgf - 1)*
ncoset(la_max_set)
674 a_start_f = (ipgf - 1)*
ncoset(la_max_set + 1)
677 IF (rpgfb(jpgf) + rpgfc < dbc) cycle
678 IF (rpgfa(ipgf) + rpgfb(jpgf) < dab) cycle
680 b_start = (jpgf - 1)*
ncoset(lb_max_set)
681 b_start_f = (jpgf - 1)*
ncoset(lb_max_set + 1)
683 DO li = max(0, la_min_set - 1), la_max_set + 1
684 a_offset = a_start +
ncoset(li - 1)
685 a_offset_f = a_start_f +
ncoset(li - 1)
687 prefi = 2.0_dp**li*(2.0_dp/
pi)**0.75_dp
688 expi = 0.25_dp*real(2*li + 3,
dp)
689 normi = 1.0_dp/(prefi*zeti**expi)
691 DO lj = max(0, lb_min_set - 1), lb_max_set + 1
692 b_offset = b_start +
ncoset(lj - 1)
693 b_offset_f = b_start_f +
ncoset(lj - 1)
695 prefj = 2.0_dp**lj*(2.0_dp/
pi)**0.75_dp
696 expj = 0.25_dp*real(2*lj + 3,
dp)
697 normj = 1.0_dp/(prefj*zetj**expj)
701 tmp(1:ncoa*ncob) = 0.0_dp
705 rb, lj, 1, [normj], [zetj], &
706 rc, lk, [npot_ecp(lk)], nrpot_ecp(:, lk), &
707 coeffs_ecp(:, lk), alpha_ecp(:, lk), tmp)
712 vab_f(a_offset_f + i, b_offset_f + j) = &
713 vab_f(a_offset_f + i, b_offset_f + j) + tmp((i - 1)*ncob + j)
718 IF (li >= la_min_set .AND. li <= la_max_set .AND. lj >= lb_min_set .AND. lj <= lb_max_set)
THEN
721 vab(a_offset + i, b_offset + j) = vab(a_offset + i, b_offset + j) + tmp((i - 1)*ncob + j)
734 CALL contract_basis_center_forces(la_max_set, npgfa, zeta, lb_max_set, npgfb, zetb, &
735 vab_f, pab, force_a, force_b)
subroutine, public libgrpp_semilocal_integrals(la_max_set, la_min_set, npgfa, rpgfa, zeta, lb_max_set, lb_min_set, npgfb, rpgfb, zetb, lmax_ecp, npot_ecp, alpha_ecp, coeffs_ecp, nrpot_ecp, rpgfc, rab, dab, rac, dac, dbc, vab, pab, force_a, force_b)
Semi-local ECP integrals using libgrpp.
subroutine, public libgrpp_local_integrals(la_max_set, la_min_set, npgfa, rpgfa, zeta, lb_max_set, lb_min_set, npgfb, rpgfb, zetb, npot_ecp, alpha_ecp, coeffs_ecp, nrpot_ecp, rpgfc, rab, dab, rac, dac, dbc, vab, pab, force_a, force_b)
Local ECP integrals using libgrpp.
subroutine, public libgrpp_local_forces_ref(la_max_set, la_min_set, npgfa, rpgfa, zeta, lb_max_set, lb_min_set, npgfb, rpgfb, zetb, npot_ecp, alpha_ecp, coeffs_ecp, nrpot_ecp, rpgfc, rab, dab, rac, dac, dbc, vab, pab, force_a, force_b)
Reference local ECP force routine using l+-1 integrals. No call is made to the numerically unstable g...
subroutine, public libgrpp_semilocal_forces_ref(la_max_set, la_min_set, npgfa, rpgfa, zeta, lb_max_set, lb_min_set, npgfb, rpgfb, zetb, lmax_ecp, npot_ecp, alpha_ecp, coeffs_ecp, nrpot_ecp, rpgfc, rab, dab, rac, dac, dbc, vab, pab, force_a, force_b)
Reference semi-local ECP forces using l+-1 integrals. No call is made to the numerically unstable gra...