379 n_a, n_b, n_c, n_d, &
380 ncoa, ncob, ncoc, ncod, &
381 nsgfa, nsgfb, nsgfc, nsgfd, &
382 primitives, max_contraction, tmp_max_all, &
383 eps_schwarz, neris, &
384 Zeta_A, Zeta_B, Zeta_C, Zeta_D, ZetaInv, EtaInv, &
385 s_offset_a, s_offset_b, s_offset_c, s_offset_d, &
386 nl_a, nl_b, nl_c, nl_d, nsoa, nsob, nsoc, nsod, &
387 sphi_a, sphi_b, sphi_c, sphi_d, &
388 work, work2, work_forces, buffer1, buffer2, primitives_tmp, &
389 use_virial, work_virial, work2_virial, primitives_tmp_virial, &
390 primitives_virial, cell, tmp_max_all_virial)
393 INTEGER,
INTENT(IN) :: nproducts
395 INTEGER,
INTENT(IN) :: n_a, n_b, n_c, n_d, ncoa, ncob, ncoc, &
396 ncod, nsgfa, nsgfb, nsgfc, nsgfd
398 DIMENSION(nsgfa, nsgfb, nsgfc, nsgfd, 12) :: primitives
399 REAL(
dp) :: max_contraction, tmp_max_all, eps_schwarz
400 INTEGER(int_8) :: neris
401 REAL(
dp),
INTENT(IN) :: zeta_a, zeta_b, zeta_c, zeta_d, zetainv, &
403 INTEGER :: s_offset_a, s_offset_b, s_offset_c, &
404 s_offset_d, nl_a, nl_b, nl_c, nl_d, &
405 nsoa, nsob, nsoc, nsod
406 REAL(
dp),
DIMENSION(ncoa, nsoa*nl_a) :: sphi_a
407 REAL(
dp),
DIMENSION(ncob, nsob*nl_b) :: sphi_b
408 REAL(
dp),
DIMENSION(ncoc, nsoc*nl_c) :: sphi_c
409 REAL(
dp),
DIMENSION(ncod, nsod*nl_d) :: sphi_d
410 REAL(
dp) :: work(ncoa*ncob*ncoc*ncod, 12), work2(ncoa, ncob, ncoc, ncod, 12), &
411 work_forces(ncoa*ncob*ncoc*ncod, 12)
412 REAL(
dp),
DIMENSION(ncoa*ncob*ncoc*ncod) :: buffer1, buffer2
413 REAL(
dp),
DIMENSION(nsoa*nl_a, nsob*nl_b, nsoc*&
nl_c, nsod*nl_d) :: primitives_tmp
414 LOGICAL,
INTENT(IN) :: use_virial
415 REAL(
dp) :: work_virial(ncoa*ncob*ncoc*ncod, 12, 3), &
416 work2_virial(ncoa, ncob, ncoc, ncod, 12, 3)
417 REAL(
dp),
DIMENSION(nsoa*nl_a, nsob*nl_b, nsoc*&
nl_c, nsod*nl_d) :: primitives_tmp_virial
419 DIMENSION(nsgfa, nsgfb, nsgfc, nsgfd, 12, 3) :: primitives_virial
421 REAL(
dp) :: tmp_max_all_virial
423 INTEGER :: a_mysize(1), i, j, k, l, m, m_max, &
424 mysize, n, p1, p2, p3, p4, perm_case
425 REAL(
dp) :: a(3), ab(3), b(3), c(3), cd(3), d(3), &
426 p(3), q(3), rho, rhoinv, scoord(12), &
427 tmp_max, tmp_max_virial, w(3), &
430 m_max = n_a + n_b + n_c + n_d
432 mysize = ncoa*ncob*ncoc*ncod
440 work2_virial = 0.0_dp
445 perm_case = perm_case + 1
448 perm_case = perm_case + 2
450 IF (n_a + n_b > n_c + n_d)
THEN
451 perm_case = perm_case + 4
454 SELECT CASE (perm_case)
457 a = pgf_product_list(i)%ra
458 b = pgf_product_list(i)%rb
459 c = pgf_product_list(i)%rc
460 d = pgf_product_list(i)%rd
461 rho = pgf_product_list(i)%Rho
462 rhoinv = pgf_product_list(i)%RhoInv
463 p = pgf_product_list(i)%P
464 q = pgf_product_list(i)%Q
465 w = pgf_product_list(i)%W
466 ab = pgf_product_list(i)%AB
467 cd = pgf_product_list(i)%CD
468 zetapetainv = pgf_product_list(i)%ZetapEtaInv
470 CALL build_deriv_data(deriv, a, b, c, d, &
471 zeta_a, zeta_b, zeta_c, zeta_d, &
472 zetainv, etainv, zetapetainv, rho, rhoinv, &
473 p, q, w, m_max, pgf_product_list(i)%Fm)
477 work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
478 work_forces(j, k + 3) + &
479 work_forces(j, k + 6))
484 work(j, k) = work(j, k) + work_forces(j, k)
487 neris = neris + 12*mysize
496 work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(int((k - 1)/3)*3 + m)
506 tmp_max = max(tmp_max, abs(work(i, n)))
508 tmp_max = tmp_max*max_contraction
509 tmp_max_all = max(tmp_max_all, tmp_max)
514 p2 = (p1 + j - 1)*ncoc
516 p3 = (p2 + k - 1)*ncod
519 work2(i, j, k, l, full_perm1(n)) = work(p4, n)
527 tmp_max_virial = 0.0_dp
529 tmp_max_virial = max(tmp_max_virial, &
530 abs(work_virial(i, n, 1)), abs(work_virial(i, n, 2)), abs(work_virial(i, n, 3)))
532 tmp_max_virial = tmp_max_virial*max_contraction
533 tmp_max_all_virial = max(tmp_max_all_virial, tmp_max_virial)
538 p2 = (p1 + j - 1)*ncoc
540 p3 = (p2 + k - 1)*ncod
543 work2_virial(i, j, k, l, full_perm1(n), 1:3) = work_virial(p4, n, 1:3)
552 a = pgf_product_list(i)%ra
553 b = pgf_product_list(i)%rb
554 c = pgf_product_list(i)%rc
555 d = pgf_product_list(i)%rd
556 rho = pgf_product_list(i)%Rho
557 rhoinv = pgf_product_list(i)%RhoInv
558 p = pgf_product_list(i)%P
559 q = pgf_product_list(i)%Q
560 w = pgf_product_list(i)%W
561 ab = pgf_product_list(i)%AB
562 cd = pgf_product_list(i)%CD
563 zetapetainv = pgf_product_list(i)%ZetapEtaInv
565 CALL build_deriv_data(deriv, b, a, c, d, &
566 zeta_b, zeta_a, zeta_c, zeta_d, &
567 zetainv, etainv, zetapetainv, rho, rhoinv, &
568 p, q, w, m_max, pgf_product_list(i)%Fm)
572 work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
573 work_forces(j, k + 3) + &
574 work_forces(j, k + 6))
579 work(j, k) = work(j, k) + work_forces(j, k)
582 neris = neris + 12*mysize
591 work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(int((k - 1)/3)*3 + m)
601 tmp_max = max(tmp_max, abs(work(i, n)))
603 tmp_max = tmp_max*max_contraction
604 tmp_max_all = max(tmp_max_all, tmp_max)
609 p2 = (p1 + i - 1)*ncoc
611 p3 = (p2 + k - 1)*ncod
614 work2(i, j, k, l, full_perm2(n)) = work(p4, n)
622 tmp_max_virial = 0.0_dp
624 tmp_max_virial = max(tmp_max_virial, &
625 abs(work_virial(i, n, 1)), abs(work_virial(i, n, 2)), abs(work_virial(i, n, 3)))
627 tmp_max_virial = tmp_max_virial*max_contraction
628 tmp_max_all_virial = max(tmp_max_all_virial, tmp_max_virial)
633 p2 = (p1 + i - 1)*ncoc
635 p3 = (p2 + k - 1)*ncod
638 work2_virial(i, j, k, l, full_perm2(n), 1:3) = work_virial(p4, n, 1:3)
647 a = pgf_product_list(i)%ra
648 b = pgf_product_list(i)%rb
649 c = pgf_product_list(i)%rc
650 d = pgf_product_list(i)%rd
651 rho = pgf_product_list(i)%Rho
652 rhoinv = pgf_product_list(i)%RhoInv
653 p = pgf_product_list(i)%P
654 q = pgf_product_list(i)%Q
655 w = pgf_product_list(i)%W
656 ab = pgf_product_list(i)%AB
657 cd = pgf_product_list(i)%CD
658 zetapetainv = pgf_product_list(i)%ZetapEtaInv
660 CALL build_deriv_data(deriv, a, b, d, c, &
661 zeta_a, zeta_b, zeta_d, zeta_c, &
662 zetainv, etainv, zetapetainv, rho, rhoinv, &
663 p, q, w, m_max, pgf_product_list(i)%Fm)
667 work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
668 work_forces(j, k + 3) + &
669 work_forces(j, k + 6))
674 work(j, k) = work(j, k) + work_forces(j, k)
677 neris = neris + 12*mysize
686 work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(int((k - 1)/3)*3 + m)
696 tmp_max = max(tmp_max, abs(work(i, n)))
698 tmp_max = tmp_max*max_contraction
699 tmp_max_all = max(tmp_max_all, tmp_max)
704 p2 = (p1 + j - 1)*ncod
706 p3 = (p2 + l - 1)*ncoc
709 work2(i, j, k, l, full_perm3(n)) = work(p4, n)
717 tmp_max_virial = 0.0_dp
719 tmp_max_virial = max(tmp_max_virial, &
720 abs(work_virial(i, n, 1)), abs(work_virial(i, n, 2)), abs(work_virial(i, n, 3)))
722 tmp_max_virial = tmp_max_virial*max_contraction
723 tmp_max_all_virial = max(tmp_max_all_virial, tmp_max_virial)
728 p2 = (p1 + j - 1)*ncod
730 p3 = (p2 + l - 1)*ncoc
733 work2_virial(i, j, k, l, full_perm3(n), 1:3) = work_virial(p4, n, 1:3)
742 a = pgf_product_list(i)%ra
743 b = pgf_product_list(i)%rb
744 c = pgf_product_list(i)%rc
745 d = pgf_product_list(i)%rd
746 rho = pgf_product_list(i)%Rho
747 rhoinv = pgf_product_list(i)%RhoInv
748 p = pgf_product_list(i)%P
749 q = pgf_product_list(i)%Q
750 w = pgf_product_list(i)%W
751 ab = pgf_product_list(i)%AB
752 cd = pgf_product_list(i)%CD
753 zetapetainv = pgf_product_list(i)%ZetapEtaInv
754 CALL build_deriv_data(deriv, b, a, d, c, &
755 zeta_b, zeta_a, zeta_d, zeta_c, &
756 zetainv, etainv, zetapetainv, rho, rhoinv, &
757 p, q, w, m_max, pgf_product_list(i)%Fm)
761 work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
762 work_forces(j, k + 3) + &
763 work_forces(j, k + 6))
768 work(j, k) = work(j, k) + work_forces(j, k)
771 neris = neris + 12*mysize
780 work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(int((k - 1)/3)*3 + m)
790 tmp_max = max(tmp_max, abs(work(i, n)))
792 tmp_max = tmp_max*max_contraction
793 tmp_max_all = max(tmp_max_all, tmp_max)
798 p2 = (p1 + i - 1)*ncod
800 p3 = (p2 + l - 1)*ncoc
803 work2(i, j, k, l, full_perm4(n)) = work(p4, n)
811 tmp_max_virial = 0.0_dp
813 tmp_max_virial = max(tmp_max_virial, &
814 abs(work_virial(i, n, 1)), abs(work_virial(i, n, 2)), abs(work_virial(i, n, 3)))
816 tmp_max_virial = tmp_max_virial*max_contraction
817 tmp_max_all_virial = max(tmp_max_all_virial, tmp_max_virial)
822 p2 = (p1 + i - 1)*ncod
824 p3 = (p2 + l - 1)*ncoc
827 work2_virial(i, j, k, l, full_perm4(n), 1:3) = work_virial(p4, n, 1:3)
836 a = pgf_product_list(i)%ra
837 b = pgf_product_list(i)%rb
838 c = pgf_product_list(i)%rc
839 d = pgf_product_list(i)%rd
840 rho = pgf_product_list(i)%Rho
841 rhoinv = pgf_product_list(i)%RhoInv
842 p = pgf_product_list(i)%P
843 q = pgf_product_list(i)%Q
844 w = pgf_product_list(i)%W
845 ab = pgf_product_list(i)%AB
846 cd = pgf_product_list(i)%CD
847 zetapetainv = pgf_product_list(i)%ZetapEtaInv
848 CALL build_deriv_data(deriv, c, d, a, b, &
849 zeta_c, zeta_d, zeta_a, zeta_b, &
850 etainv, zetainv, zetapetainv, rho, rhoinv, &
851 q, p, w, m_max, pgf_product_list(i)%Fm)
855 work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
856 work_forces(j, k + 3) + &
857 work_forces(j, k + 6))
862 work(j, k) = work(j, k) + work_forces(j, k)
865 neris = neris + 12*mysize
874 work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(int((k - 1)/3)*3 + m)
884 tmp_max = max(tmp_max, abs(work(i, n)))
886 tmp_max = tmp_max*max_contraction
887 tmp_max_all = max(tmp_max_all, tmp_max)
892 p2 = (p1 + l - 1)*ncoa
894 p3 = (p2 + i - 1)*ncob
897 work2(i, j, k, l, full_perm5(n)) = work(p4, n)
905 tmp_max_virial = 0.0_dp
907 tmp_max_virial = max(tmp_max_virial, &
908 abs(work_virial(i, n, 1)), abs(work_virial(i, n, 2)), abs(work_virial(i, n, 3)))
910 tmp_max_virial = tmp_max_virial*max_contraction
911 tmp_max_all_virial = max(tmp_max_all_virial, tmp_max_virial)
916 p2 = (p1 + l - 1)*ncoa
918 p3 = (p2 + i - 1)*ncob
921 work2_virial(i, j, k, l, full_perm5(n), 1:3) = work_virial(p4, n, 1:3)
930 a = pgf_product_list(i)%ra
931 b = pgf_product_list(i)%rb
932 c = pgf_product_list(i)%rc
933 d = pgf_product_list(i)%rd
934 rho = pgf_product_list(i)%Rho
935 rhoinv = pgf_product_list(i)%RhoInv
936 p = pgf_product_list(i)%P
937 q = pgf_product_list(i)%Q
938 w = pgf_product_list(i)%W
939 ab = pgf_product_list(i)%AB
940 cd = pgf_product_list(i)%CD
941 zetapetainv = pgf_product_list(i)%ZetapEtaInv
943 CALL build_deriv_data(deriv, c, d, b, a, &
944 zeta_c, zeta_d, zeta_b, zeta_a, &
945 etainv, zetainv, zetapetainv, rho, rhoinv, &
946 q, p, w, m_max, pgf_product_list(i)%Fm)
950 work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
951 work_forces(j, k + 3) + &
952 work_forces(j, k + 6))
957 work(j, k) = work(j, k) + work_forces(j, k)
960 neris = neris + 12*mysize
969 work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(int((k - 1)/3)*3 + m)
979 tmp_max = max(tmp_max, abs(work(i, n)))
981 tmp_max = tmp_max*max_contraction
982 tmp_max_all = max(tmp_max_all, tmp_max)
987 p2 = (p1 + l - 1)*ncob
989 p3 = (p2 + j - 1)*ncoa
992 work2(i, j, k, l, full_perm6(n)) = work(p4, n)
1000 tmp_max_virial = 0.0_dp
1002 tmp_max_virial = max(tmp_max_virial, &
1003 abs(work_virial(i, n, 1)), abs(work_virial(i, n, 2)), abs(work_virial(i, n, 3)))
1005 tmp_max_virial = tmp_max_virial*max_contraction
1006 tmp_max_all_virial = max(tmp_max_all_virial, tmp_max_virial)
1011 p2 = (p1 + l - 1)*ncob
1013 p3 = (p2 + j - 1)*ncoa
1016 work2_virial(i, j, k, l, full_perm6(n), 1:3) = work_virial(p4, n, 1:3)
1025 a = pgf_product_list(i)%ra
1026 b = pgf_product_list(i)%rb
1027 c = pgf_product_list(i)%rc
1028 d = pgf_product_list(i)%rd
1029 rho = pgf_product_list(i)%Rho
1030 rhoinv = pgf_product_list(i)%RhoInv
1031 p = pgf_product_list(i)%P
1032 q = pgf_product_list(i)%Q
1033 w = pgf_product_list(i)%W
1034 ab = pgf_product_list(i)%AB
1035 cd = pgf_product_list(i)%CD
1036 zetapetainv = pgf_product_list(i)%ZetapEtaInv
1038 CALL build_deriv_data(deriv, d, c, a, b, &
1039 zeta_d, zeta_c, zeta_a, zeta_b, &
1040 etainv, zetainv, zetapetainv, rho, rhoinv, &
1041 q, p, w, m_max, pgf_product_list(i)%Fm)
1045 work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
1046 work_forces(j, k + 3) + &
1047 work_forces(j, k + 6))
1052 work(j, k) = work(j, k) + work_forces(j, k)
1055 neris = neris + 12*mysize
1056 IF (use_virial)
THEN
1064 work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(int((k - 1)/3)*3 + m)
1074 tmp_max = max(tmp_max, abs(work(i, n)))
1076 tmp_max = tmp_max*max_contraction
1077 tmp_max_all = max(tmp_max_all, tmp_max)
1082 p2 = (p1 + k - 1)*ncoa
1084 p3 = (p2 + i - 1)*ncob
1087 work2(i, j, k, l, full_perm7(n)) = work(p4, n)
1093 IF (use_virial)
THEN
1095 tmp_max_virial = 0.0_dp
1097 tmp_max_virial = max(tmp_max_virial, &
1098 abs(work_virial(i, n, 1)), abs(work_virial(i, n, 2)), abs(work_virial(i, n, 3)))
1100 tmp_max_virial = tmp_max_virial*max_contraction
1101 tmp_max_all_virial = max(tmp_max_all_virial, tmp_max_virial)
1106 p2 = (p1 + k - 1)*ncoa
1108 p3 = (p2 + i - 1)*ncob
1111 work2_virial(i, j, k, l, full_perm7(n), 1:3) = work_virial(p4, n, 1:3)
1120 a = pgf_product_list(i)%ra
1121 b = pgf_product_list(i)%rb
1122 c = pgf_product_list(i)%rc
1123 d = pgf_product_list(i)%rd
1124 rho = pgf_product_list(i)%Rho
1125 rhoinv = pgf_product_list(i)%RhoInv
1126 p = pgf_product_list(i)%P
1127 q = pgf_product_list(i)%Q
1128 w = pgf_product_list(i)%W
1129 ab = pgf_product_list(i)%AB
1130 cd = pgf_product_list(i)%CD
1131 zetapetainv = pgf_product_list(i)%ZetapEtaInv
1133 CALL build_deriv_data(deriv, d, c, b, a, &
1134 zeta_d, zeta_c, zeta_b, zeta_a, &
1135 etainv, zetainv, zetapetainv, rho, rhoinv, &
1136 q, p, w, m_max, pgf_product_list(i)%Fm)
1140 work_forces(j, k) = -1.0_dp*(work_forces(j, k - 3) + &
1141 work_forces(j, k + 3) + &
1142 work_forces(j, k + 6))
1147 work(j, k) = work(j, k) + work_forces(j, k)
1150 neris = neris + 12*mysize
1151 IF (use_virial)
THEN
1159 work_virial(j, k, m) = work_virial(j, k, m) + work_forces(j, k)*scoord(int((k - 1)/3)*3 + m)
1169 tmp_max = max(tmp_max, abs(work(i, n)))
1171 tmp_max = tmp_max*max_contraction
1172 tmp_max_all = max(tmp_max_all, tmp_max)
1177 p2 = (p1 + k - 1)*ncob
1179 p3 = (p2 + j - 1)*ncoa
1182 work2(i, j, k, l, full_perm8(n)) = work(p4, n)
1188 IF (use_virial)
THEN
1190 tmp_max_virial = 0.0_dp
1192 tmp_max_virial = max(tmp_max_virial, &
1193 abs(work_virial(i, n, 1)), abs(work_virial(i, n, 2)), abs(work_virial(i, n, 3)))
1195 tmp_max_virial = tmp_max_virial*max_contraction
1196 tmp_max_all_virial = max(tmp_max_all_virial, tmp_max_virial)
1201 p2 = (p1 + k - 1)*ncob
1203 p3 = (p2 + j - 1)*ncoa
1206 work2_virial(i, j, k, l, full_perm8(n), 1:3) = work_virial(p4, n, 1:3)
1215 IF (.NOT. use_virial)
THEN
1216 IF (tmp_max_all < eps_schwarz)
RETURN
1219 IF (tmp_max_all >= eps_schwarz)
THEN
1221 primitives_tmp(:, :, :, :) = 0.0_dp
1222 CALL contract(ncoa, ncob, ncoc, ncod, nsoa, nsob, nsoc, nsod, &
1223 n_a, n_b, n_c, n_d, nl_a, nl_b, nl_c, nl_d, work2(1, 1, 1, 1, i), &
1228 primitives_tmp(1, 1, 1, 1), &
1231 primitives(s_offset_a + 1:s_offset_a + nsoa*nl_a, &
1232 s_offset_b + 1:s_offset_b + nsob*nl_b, &
1233 s_offset_c + 1:s_offset_c + nsoc*nl_c, &
1234 s_offset_d + 1:s_offset_d + nsod*nl_d, i) = &
1235 primitives(s_offset_a + 1:s_offset_a + nsoa*nl_a, &
1236 s_offset_b + 1:s_offset_b + nsob*nl_b, &
1237 s_offset_c + 1:s_offset_c + nsoc*nl_c, &
1238 s_offset_d + 1:s_offset_d + nsod*nl_d, i) + primitives_tmp(:, :, :, :)
1242 IF (use_virial .AND. tmp_max_all_virial >= eps_schwarz)
THEN
1245 primitives_tmp_virial(:, :, :, :) = 0.0_dp
1246 CALL contract(ncoa, ncob, ncoc, ncod, nsoa, nsob, nsoc, nsod, &
1247 n_a, n_b, n_c, n_d, nl_a, nl_b, nl_c, nl_d, work2_virial(1, 1, 1, 1, i, m), &
1252 primitives_tmp_virial(1, 1, 1, 1), &
1255 primitives_virial(s_offset_a + 1:s_offset_a + nsoa*nl_a, &
1256 s_offset_b + 1:s_offset_b + nsob*nl_b, &
1257 s_offset_c + 1:s_offset_c + nsoc*nl_c, &
1258 s_offset_d + 1:s_offset_d + nsod*nl_d, i, m) = &
1259 primitives_virial(s_offset_a + 1:s_offset_a + nsoa*nl_a, &
1260 s_offset_b + 1:s_offset_b + nsob*nl_b, &
1261 s_offset_c + 1:s_offset_c + nsoc*nl_c, &
1262 s_offset_d + 1:s_offset_d + nsod*nl_d, i, m) + primitives_tmp_virial(:, :, :, :)
1453 ncoa, ncob, ncoc, ncod, &
1454 nsgfa, nsgfb, nsgfc, nsgfd, &
1455 primitives, max_contraction, tmp_max, &
1456 eps_schwarz, neris, &
1458 s_offset_a, s_offset_b, s_offset_c, s_offset_d, &
1459 nl_a, nl_b, nl_c, nl_d, nsoa, nsob, nsoc, nsod, &
1460 sphi_a, sphi_b, sphi_c, sphi_d, work, work2, buffer1, buffer2, &
1461 primitives_tmp, p_work)
1464 INTEGER,
INTENT(IN) :: nproducts
1466 INTEGER,
INTENT(IN) :: n_a, n_b, n_c, n_d, ncoa, ncob, ncoc, &
1467 ncod, nsgfa, nsgfb, nsgfc, nsgfd
1468 REAL(
dp),
DIMENSION(nsgfa, nsgfb, nsgfc, nsgfd) :: primitives
1469 REAL(
dp) :: max_contraction, tmp_max, eps_schwarz
1470 INTEGER(int_8) :: neris
1471 REAL(
dp),
INTENT(IN) :: zetainv, etainv
1472 INTEGER :: s_offset_a, s_offset_b, s_offset_c, &
1473 s_offset_d, nl_a, nl_b, nl_c, nl_d, &
1474 nsoa, nsob, nsoc, nsod
1475 REAL(
dp),
DIMENSION(ncoa, nsoa*nl_a),
INTENT(IN) :: sphi_a
1476 REAL(
dp),
DIMENSION(ncob, nsob*nl_b),
INTENT(IN) :: sphi_b
1477 REAL(
dp),
DIMENSION(ncoc, nsoc*nl_c),
INTENT(IN) :: sphi_c
1478 REAL(
dp),
DIMENSION(ncod, nsod*nl_d),
INTENT(IN) :: sphi_d
1479 REAL(
dp) :: work(ncoa*ncob*ncoc*ncod), &
1480 work2(ncoa, ncob, ncoc, ncod)
1481 REAL(
dp),
DIMENSION(ncoa*ncob*ncoc*ncod) :: buffer1, buffer2
1482 REAL(
dp),
DIMENSION(nsoa*nl_a, nsob*nl_b, nsoc*&
nl_c, nsod*nl_d) :: primitives_tmp
1483 REAL(
dp),
DIMENSION(:),
POINTER :: p_work
1485 INTEGER :: a_mysize(1), i, j, k, l, m_max, mysize, &
1486 p1, p2, p3, p4, perm_case
1487 REAL(
dp) :: a(3), ab(3), b(3), c(3), cd(3), d(3), &
1488 p(3), q(3), rho, rhoinv, w(3), &
1490 REAL(kind=
dp),
DIMENSION(prim_data_f_size) :: f
1492 m_max = n_a + n_b + n_c + n_d
1493 mysize = ncoa*ncob*ncoc*ncod
1497 IF (m_max /= 0)
THEN
1500 perm_case = perm_case + 1
1503 perm_case = perm_case + 2
1505 IF (n_a + n_b > n_c + n_d)
THEN
1506 perm_case = perm_case + 4
1508 SELECT CASE (perm_case)
1511 a = pgf_product_list(i)%ra
1512 b = pgf_product_list(i)%rb
1513 c = pgf_product_list(i)%rc
1514 d = pgf_product_list(i)%rd
1515 rho = pgf_product_list(i)%Rho
1516 rhoinv = pgf_product_list(i)%RhoInv
1517 p = pgf_product_list(i)%P
1518 q = pgf_product_list(i)%Q
1519 w = pgf_product_list(i)%W
1520 ab = pgf_product_list(i)%AB
1521 cd = pgf_product_list(i)%CD
1522 zetapetainv = pgf_product_list(i)%ZetapEtaInv
1523 f(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
1525 CALL build_quartet_data(libint, a, b, c, d, zetainv, etainv, zetapetainv, rho, &
1528 work(1:mysize) = work(1:mysize) + p_work(1:mysize)
1529 neris = neris + mysize
1532 tmp_max = max(tmp_max, abs(work(i)))
1534 tmp_max = tmp_max*max_contraction
1535 IF (tmp_max < eps_schwarz)
THEN
1542 p2 = (p1 + j - 1)*ncoc
1544 p3 = (p2 + k - 1)*ncod
1547 work2(i, j, k, l) = work(p4)
1554 a = pgf_product_list(i)%ra
1555 b = pgf_product_list(i)%rb
1556 c = pgf_product_list(i)%rc
1557 d = pgf_product_list(i)%rd
1558 rho = pgf_product_list(i)%Rho
1559 rhoinv = pgf_product_list(i)%RhoInv
1560 p = pgf_product_list(i)%P
1561 q = pgf_product_list(i)%Q
1562 w = pgf_product_list(i)%W
1563 ab = pgf_product_list(i)%AB
1564 cd = pgf_product_list(i)%CD
1565 zetapetainv = pgf_product_list(i)%ZetapEtaInv
1566 f(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
1568 CALL build_quartet_data(libint, b, a, c, d, &
1569 zetainv, etainv, zetapetainv, rho, &
1573 work(1:mysize) = work(1:mysize) + p_work(1:mysize)
1574 neris = neris + mysize
1577 tmp_max = max(tmp_max, abs(work(i)))
1579 tmp_max = tmp_max*max_contraction
1580 IF (tmp_max < eps_schwarz)
THEN
1587 p2 = (p1 + i - 1)*ncoc
1589 p3 = (p2 + k - 1)*ncod
1592 work2(i, j, k, l) = work(p4)
1599 a = pgf_product_list(i)%ra
1600 b = pgf_product_list(i)%rb
1601 c = pgf_product_list(i)%rc
1602 d = pgf_product_list(i)%rd
1603 rho = pgf_product_list(i)%Rho
1604 rhoinv = pgf_product_list(i)%RhoInv
1605 p = pgf_product_list(i)%P
1606 q = pgf_product_list(i)%Q
1607 w = pgf_product_list(i)%W
1608 ab = pgf_product_list(i)%AB
1609 cd = pgf_product_list(i)%CD
1610 zetapetainv = pgf_product_list(i)%ZetapEtaInv
1611 f(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
1613 CALL build_quartet_data(libint, a, b, d, c, &
1614 zetainv, etainv, zetapetainv, rho, &
1618 work(1:mysize) = work(1:mysize) + p_work(1:mysize)
1619 neris = neris + mysize
1622 tmp_max = max(tmp_max, abs(work(i)))
1624 tmp_max = tmp_max*max_contraction
1625 IF (tmp_max < eps_schwarz)
THEN
1632 p2 = (p1 + j - 1)*ncod
1634 p3 = (p2 + l - 1)*ncoc
1637 work2(i, j, k, l) = work(p4)
1644 a = pgf_product_list(i)%ra
1645 b = pgf_product_list(i)%rb
1646 c = pgf_product_list(i)%rc
1647 d = pgf_product_list(i)%rd
1648 rho = pgf_product_list(i)%Rho
1649 rhoinv = pgf_product_list(i)%RhoInv
1650 p = pgf_product_list(i)%P
1651 q = pgf_product_list(i)%Q
1652 w = pgf_product_list(i)%W
1653 ab = pgf_product_list(i)%AB
1654 cd = pgf_product_list(i)%CD
1655 zetapetainv = pgf_product_list(i)%ZetapEtaInv
1656 f(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
1658 CALL build_quartet_data(libint, b, a, d, c, &
1659 zetainv, etainv, zetapetainv, rho, &
1663 work(1:mysize) = work(1:mysize) + p_work(1:mysize)
1664 neris = neris + mysize
1667 tmp_max = max(tmp_max, abs(work(i)))
1669 tmp_max = tmp_max*max_contraction
1670 IF (tmp_max < eps_schwarz)
THEN
1677 p2 = (p1 + i - 1)*ncod
1679 p3 = (p2 + l - 1)*ncoc
1682 work2(i, j, k, l) = work(p4)
1689 a = pgf_product_list(i)%ra
1690 b = pgf_product_list(i)%rb
1691 c = pgf_product_list(i)%rc
1692 d = pgf_product_list(i)%rd
1693 rho = pgf_product_list(i)%Rho
1694 rhoinv = pgf_product_list(i)%RhoInv
1695 p = pgf_product_list(i)%P
1696 q = pgf_product_list(i)%Q
1697 w = pgf_product_list(i)%W
1698 ab = pgf_product_list(i)%AB
1699 cd = pgf_product_list(i)%CD
1700 zetapetainv = pgf_product_list(i)%ZetapEtaInv
1701 f(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
1703 CALL build_quartet_data(libint, c, d, a, b, &
1704 etainv, zetainv, zetapetainv, rho, &
1708 work(1:mysize) = work(1:mysize) + p_work(1:mysize)
1709 neris = neris + mysize
1712 tmp_max = max(tmp_max, abs(work(i)))
1714 tmp_max = tmp_max*max_contraction
1715 IF (tmp_max < eps_schwarz)
THEN
1722 p2 = (p1 + l - 1)*ncoa
1724 p3 = (p2 + i - 1)*ncob
1727 work2(i, j, k, l) = work(p4)
1734 a = pgf_product_list(i)%ra
1735 b = pgf_product_list(i)%rb
1736 c = pgf_product_list(i)%rc
1737 d = pgf_product_list(i)%rd
1738 rho = pgf_product_list(i)%Rho
1739 rhoinv = pgf_product_list(i)%RhoInv
1740 p = pgf_product_list(i)%P
1741 q = pgf_product_list(i)%Q
1742 w = pgf_product_list(i)%W
1743 ab = pgf_product_list(i)%AB
1744 cd = pgf_product_list(i)%CD
1745 zetapetainv = pgf_product_list(i)%ZetapEtaInv
1746 f(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
1748 CALL build_quartet_data(libint, c, d, b, a, &
1749 etainv, zetainv, zetapetainv, rho, &
1753 work(1:mysize) = work(1:mysize) + p_work(1:mysize)
1754 neris = neris + mysize
1757 tmp_max = max(tmp_max, abs(work(i)))
1759 tmp_max = tmp_max*max_contraction
1760 IF (tmp_max < eps_schwarz)
THEN
1767 p2 = (p1 + l - 1)*ncob
1769 p3 = (p2 + j - 1)*ncoa
1772 work2(i, j, k, l) = work(p4)
1779 a = pgf_product_list(i)%ra
1780 b = pgf_product_list(i)%rb
1781 c = pgf_product_list(i)%rc
1782 d = pgf_product_list(i)%rd
1783 rho = pgf_product_list(i)%Rho
1784 rhoinv = pgf_product_list(i)%RhoInv
1785 p = pgf_product_list(i)%P
1786 q = pgf_product_list(i)%Q
1787 w = pgf_product_list(i)%W
1788 ab = pgf_product_list(i)%AB
1789 cd = pgf_product_list(i)%CD
1790 zetapetainv = pgf_product_list(i)%ZetapEtaInv
1791 f(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
1793 CALL build_quartet_data(libint, d, c, a, b, &
1794 etainv, zetainv, zetapetainv, rho, &
1798 work(1:mysize) = work(1:mysize) + p_work(1:mysize)
1799 neris = neris + mysize
1802 tmp_max = max(tmp_max, abs(work(i)))
1804 tmp_max = tmp_max*max_contraction
1805 IF (tmp_max < eps_schwarz)
THEN
1812 p2 = (p1 + k - 1)*ncoa
1814 p3 = (p2 + i - 1)*ncob
1817 work2(i, j, k, l) = work(p4)
1824 a = pgf_product_list(i)%ra
1825 b = pgf_product_list(i)%rb
1826 c = pgf_product_list(i)%rc
1827 d = pgf_product_list(i)%rd
1828 rho = pgf_product_list(i)%Rho
1829 rhoinv = pgf_product_list(i)%RhoInv
1830 p = pgf_product_list(i)%P
1831 q = pgf_product_list(i)%Q
1832 w = pgf_product_list(i)%W
1833 ab = pgf_product_list(i)%AB
1834 cd = pgf_product_list(i)%CD
1835 zetapetainv = pgf_product_list(i)%ZetapEtaInv
1836 f(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
1838 CALL build_quartet_data(libint, d, c, b, a, &
1839 etainv, zetainv, zetapetainv, rho, &
1843 work(1:mysize) = work(1:mysize) + p_work(1:mysize)
1844 neris = neris + mysize
1847 tmp_max = max(tmp_max, abs(work(i)))
1849 tmp_max = tmp_max*max_contraction
1850 IF (tmp_max < eps_schwarz)
THEN
1857 p2 = (p1 + k - 1)*ncob
1859 p3 = (p2 + j - 1)*ncoa
1862 work2(i, j, k, l) = work(p4)
1870 a = pgf_product_list(i)%ra
1871 b = pgf_product_list(i)%rb
1872 c = pgf_product_list(i)%rc
1873 d = pgf_product_list(i)%rd
1874 rho = pgf_product_list(i)%Rho
1875 rhoinv = pgf_product_list(i)%RhoInv
1876 p = pgf_product_list(i)%P
1877 q = pgf_product_list(i)%Q
1878 w = pgf_product_list(i)%W
1879 zetapetainv = pgf_product_list(i)%ZetapEtaInv
1880 f(1:m_max + 1) = pgf_product_list(i)%Fm(1:m_max + 1)
1882 CALL build_quartet_data(libint, a, b, c, d, &
1883 zetainv, etainv, zetapetainv, rho, &
1885 work(1) = work(1) + f(1)
1886 neris = neris + mysize
1888 work2(1, 1, 1, 1) = work(1)
1889 tmp_max = max_contraction*abs(work(1))
1890 IF (tmp_max < eps_schwarz)
RETURN
1893 IF (tmp_max < eps_schwarz)
RETURN
1894 primitives_tmp = 0.0_dp
1896 CALL contract(ncoa, ncob, ncoc, ncod, nsoa, nsob, nsoc, nsod, &
1897 n_a, n_b, n_c, n_d, nl_a, nl_b, nl_c, nl_d, work2, &
1905 primitives(s_offset_a + 1:s_offset_a + nsoa*nl_a, &
1906 s_offset_b + 1:s_offset_b + nsob*nl_b, &
1907 s_offset_c + 1:s_offset_c + nsoc*nl_c, &
1908 s_offset_d + 1:s_offset_d + nsod*nl_d) = &
1909 primitives(s_offset_a + 1:s_offset_a + nsoa*nl_a, &
1910 s_offset_b + 1:s_offset_b + nsob*nl_b, &
1911 s_offset_c + 1:s_offset_c + nsoc*nl_c, &
1912 s_offset_d + 1:s_offset_d + nsod*nl_d) + primitives_tmp(:, :, :, :)