115 log10_pmax, log10_eps_schwarz, ra, rb, nelements, &
116 neighbor_cells, do_periodic)
118 INTEGER,
INTENT(IN) :: npgfa, npgfb
119 TYPE(
bra_t),
POINTER :: bra
120 REAL(
dp),
INTENT(IN) :: screen1(2), screen2(2)
123 REAL(
dp),
INTENT(IN) :: log10_pmax, log10_eps_schwarz, ra(3), &
125 INTEGER,
INTENT(OUT) :: nelements
127 LOGICAL,
INTENT(IN) :: do_periodic
129 INTEGER :: cell_cnt, cell_idx, element_cnt, &
130 element_idx, element_off, ipgf, jpgf
131 REAL(
dp) :: ab(3), im_b(3), pgf_max, rab2
136 DO cell_idx = 1,
SIZE(neighbor_cells)
140 IF (do_periodic)
THEN
141 im_b = rb + neighbor_cells(cell_idx)%cell_r(:)
146 rab2 = ab(1)**2 + ab(2)**2 + ab(3)**2
148 IF (screen1(1)*rab2 + screen1(2) + screen2(2) + log10_pmax < log10_eps_schwarz) cycle
155 pgf_max = pgf(jpgf, ipgf)%x(1)*rab2 + pgf(jpgf, ipgf)%x(2)
156 IF (pgf_max + screen2(2) + log10_pmax < log10_eps_schwarz) cycle
158 element_idx = element_idx + 1
159 bra%pgf_idx(:, element_idx) = [ipgf, jpgf, cell_idx]
160 bra%pgf_scr(1, element_idx) = pgf_max
161 element_cnt = element_cnt + 1
166 IF (element_cnt == 0) cycle
167 cell_cnt = cell_cnt + 1
168 bra%cell_idx(:, cell_cnt) = [cell_idx, element_cnt, element_off]
169 element_off = element_off + element_cnt
172 bra%cell_cnt = cell_cnt
173 nelements = element_idx
174 bra%pgf_cnt = nelements
193 log10_pmax, log10_eps_schwarz, neighbor_cells, &
194 cell, potential_parameter, m_max, do_periodic)
198 DIMENSION(:),
INTENT(INOUT) :: product_list
199 INTEGER,
INTENT(OUT) :: nproducts
200 REAL(
dp),
INTENT(IN) :: log10_pmax, log10_eps_schwarz
204 INTEGER,
INTENT(IN) :: m_max
205 LOGICAL,
INTENT(IN) :: do_periodic
207 REAL(
dp),
PARAMETER :: r_cutoff_eps = 1.0e-12_dp
209 INTEGER :: i, j, k, k_max, l, nimages1, nimages2, &
211 LOGICAL :: has_r_cutoff
213 min_img_delta, normalization, num, p(3), pgf_max_1, pgf_max_2, pq(3), pq2, prefactor, &
214 q(3), r1, r2, r_cutoff_sq, r_cutoff_sq_guard, ra(3), rb(3), rc(3), rcut_eff, rd(3), rho, &
215 rhoinv, rpq2, s1234, s1234a, s1234b, shift(3), ssss, t, temp(3), temp_cc(3), temp_dd(3), &
216 tmp_d(3), w(3), zeta1, zeta_c, zeta_d, zetapetainv
218 DIMENSION(:) :: tmp_product_list
220 nimages1 = list1%nimages
221 nimages2 = list2%nimages
223 zeta1 = list1%zetapzetb
224 eta = list2%zetapzetb
225 etainv = list2%ZetaInv
231 r_cutoff_sq_guard = 0.0_dp
232 SELECT CASE (potential_parameter%potential_type)
234 has_r_cutoff = .true.
235 rcut_eff = potential_parameter%cutoff_radius
237 has_r_cutoff = .true.
238 rcut_eff = potential_parameter%cutoff_radius*2.0_dp
240 has_r_cutoff = .false.
244 p = list1%image_list(i)%P
245 r1 = list1%image_list(i)%R
246 s1234a = list1%image_list(i)%S1234
247 pgf_max_1 = list1%image_list(i)%pgf_max
248 ra = list1%image_list(i)%ra
249 rb = list1%image_list(i)%rb
251 pgf_max_2 = list2%image_list(j)%pgf_max
252 IF (pgf_max_1 + pgf_max_2 + log10_pmax < log10_eps_schwarz) cycle
253 q = list2%image_list(j)%P
254 r2 = list2%image_list(j)%R
255 s1234b = list2%image_list(j)%S1234
256 rc = list2%image_list(j)%ra
257 rd = list2%image_list(j)%rb
259 IF (has_r_cutoff)
THEN
260 r_cutoff_sq = (r1 + r2 + rcut_eff)**2
261 r_cutoff_sq_guard = r_cutoff_sq*(1.0_dp + r_cutoff_eps)
263 k_max =
SIZE(neighbor_cells)
264 IF (do_periodic)
THEN
267 IF (has_r_cutoff .AND. cell%orthorhombic .AND. all(cell%perd == 1) .AND. k_max >= 1)
THEN
268 IF (all(neighbor_cells(1)%cell_r == 0.0_dp))
THEN
269 pq2 = pq(1)**2 + pq(2)**2 + pq(3)**2
270 IF (pq2 > r_cutoff_sq_guard) cycle
272 IF (min_img_delta >= 0.0_dp .AND. pq2 + min_img_delta > r_cutoff_sq_guard) k_max = 1
280 zetapetainv = zeta1 + eta
281 zetapetainv = 1.0_dp/zetapetainv
282 rho = zeta1*eta*zetapetainv
284 s1234 = exp(s1234a + s1234b)
287 IF (do_periodic)
THEN
288 IF (has_r_cutoff .AND. k_max > 1)
THEN
289 IF ((pq(1) - neighbor_cells(k)%cell_r(1))**2 + &
290 (pq(2) - neighbor_cells(k)%cell_r(2))**2 + &
291 (pq(3) - neighbor_cells(k)%cell_r(3))**2 > r_cutoff_sq_guard) cycle
293 c11 = temp_cc + neighbor_cells(k)%cell_r(:)
294 tmp_d = temp_dd + neighbor_cells(k)%cell_r(:)
299 q = (zeta_c*c11 + zeta_d*tmp_d)*etainv
300 rpq2 = (p(1) - q(1))**2 + (p(2) - q(2))**2 + (p(3) - q(3))**2
301 IF (has_r_cutoff)
THEN
302 IF (rpq2 > r_cutoff_sq) cycle
304 nproducts = nproducts + 1
308 IF (nproducts >
SIZE(product_list))
THEN
314 ALLOCATE (tmp_product_list(
SIZE(product_list)))
315 tmp_product_list(:) = product_list
316 DEALLOCATE (product_list)
317 ALLOCATE (product_list(tmp_i4))
318 product_list(1:
SIZE(tmp_product_list)) = tmp_product_list
319 DEALLOCATE (tmp_product_list)
324 num = list1%zeta*list1%zetb
325 den = list1%zeta + list1%zetb
326 ssss = -num/den*sum((ra - rb)**2)
330 ssss = ssss - num/den*sum((p - rc)**2)
332 g(:) = (list1%zeta*ra(:) + list1%zetb*rb(:) + zeta_c*rc(:))/den
335 ssss = ssss - num/den*sum((g - rd)**2)
337 product_list(nproducts)%Fm(:) = exp(ssss)
339 normalization = 1.0_dp
340 IF (s1234 > epsilon(0.0_dp)) normalization = 1.0_dp/s1234
343 potential_parameter%potential_type, rho, t, fundamentals_work, &
344 omega=potential_parameter%omega, &
345 cutoff_radius=potential_parameter%cutoff_radius, &
346 scale_coulomb=potential_parameter%scale_coulomb, &
347 scale_longrange=potential_parameter%scale_longrange, &
348 scale_gaussian=potential_parameter%scale_gaussian)
351 prefactor = normalization*s1234*sqrt((
pi*zetapetainv)**3)
354 product_list(nproducts)%Fm(l) = product_list(nproducts)%Fm(l)*prefactor
357 w = (zeta1*p + eta*q)*zetapetainv
358 product_list(nproducts)%ra = ra
359 product_list(nproducts)%rb = rb
360 product_list(nproducts)%rc = c11
361 product_list(nproducts)%rd = tmp_d
362 product_list(nproducts)%ZetapEtaInv = zetapetainv
363 product_list(nproducts)%Rho = rho
364 product_list(nproducts)%RhoInv = rhoinv
365 product_list(nproducts)%P = p
366 product_list(nproducts)%Q = q
367 product_list(nproducts)%W = w
368 product_list(nproducts)%AB = ra - rb
369 product_list(nproducts)%CD = c11 - tmp_d
398 log10_pmax, log10_eps_schwarz, ra, rb, nelements, &
399 neighbor_cells, nimages, do_periodic, cell)
400 INTEGER,
INTENT(IN) :: npgfa, npgfb
402 REAL(
dp),
DIMENSION(1:npgfa),
INTENT(IN) :: zeta
403 REAL(
dp),
DIMENSION(1:npgfb),
INTENT(IN) :: zetb
404 REAL(
dp),
INTENT(IN) :: screen1(2), screen2(2)
406 POINTER :: pgf, r_pgf
407 REAL(
dp),
INTENT(IN) :: log10_pmax, log10_eps_schwarz, ra(3), &
409 INTEGER,
INTENT(OUT) :: nelements
411 INTEGER :: nimages(npgfa*npgfb)
412 LOGICAL,
INTENT(IN) :: do_periodic
415 REAL(
dp),
PARAMETER :: min_img_eps = 1.0e-12_dp
417 INTEGER :: element_counter, i, i_max, ipgf, j, jpgf
418 REAL(
dp) :: ab(3), im_b(3), min_img_delta, pgf_max, &
419 rab2, zeta1, zeta_a, zeta_b, zetainv
421 i_max =
SIZE(neighbor_cells)
422 IF (do_periodic)
THEN
423 IF (cell%orthorhombic .AND. screen1(1) <= 0.0_dp .AND. i_max > 1)
THEN
424 IF (all(cell%perd == 1) .AND. all(neighbor_cells(1)%cell_r == 0.0_dp))
THEN
426 rab2 = ab(1)**2 + ab(2)**2 + ab(3)**2
428 IF (min_img_delta >= 0.0_dp)
THEN
429 IF (screen1(1)*rab2 + screen1(2) + screen2(2) + log10_pmax < log10_eps_schwarz)
THEN
433 IF (screen1(1)*(rab2 + min_img_delta)*(1.0_dp - min_img_eps) + &
434 screen1(2) + screen2(2) + log10_pmax < log10_eps_schwarz) i_max = 1
439 i_max = min(i_max, 1)
443 nelements = npgfa*npgfb
445 IF (do_periodic)
THEN
446 im_b = rb + neighbor_cells(i)%cell_r(:)
451 rab2 = ab(1)**2 + ab(2)**2 + ab(3)**2
452 IF (screen1(1)*rab2 + screen1(2) + screen2(2) + log10_pmax < log10_eps_schwarz) cycle
456 element_counter = element_counter + 1
457 pgf_max = pgf(jpgf, ipgf)%x(1)*rab2 + pgf(jpgf, ipgf)%x(2)
458 IF (pgf_max + screen2(2) + log10_pmax < log10_eps_schwarz)
THEN
461 nimages(element_counter) = nimages(element_counter) + 1
462 list(element_counter)%image_list(nimages(element_counter))%pgf_max = pgf_max
463 list(element_counter)%image_list(nimages(element_counter))%ra = ra
464 list(element_counter)%image_list(nimages(element_counter))%rb = im_b
465 list(element_counter)%image_list(nimages(element_counter))%rab2 = rab2
469 zeta1 = zeta_a + zeta_b
470 zetainv = 1.0_dp/zeta1
472 IF (nimages(element_counter) == 1)
THEN
473 list(element_counter)%ipgf = ipgf
474 list(element_counter)%jpgf = jpgf
475 list(element_counter)%zetaInv = zetainv
476 list(element_counter)%zetapzetb = zeta1
477 list(element_counter)%zeta = zeta_a
478 list(element_counter)%zetb = zeta_b
481 list(element_counter)%image_list(nimages(element_counter))%S1234 = (-zeta_a*zeta_b*zetainv*rab2)
482 list(element_counter)%image_list(nimages(element_counter))%P = (zeta_a*ra + zeta_b*im_b)*zetainv
483 list(element_counter)%image_list(nimages(element_counter))%R = &
484 max(0.0_dp, r_pgf(jpgf, ipgf)%x(1)*rab2 + r_pgf(jpgf, ipgf)%x(2))
485 list(element_counter)%image_list(nimages(element_counter))%ra = ra
486 list(element_counter)%image_list(nimages(element_counter))%rb = im_b
487 list(element_counter)%image_list(nimages(element_counter))%rab2 = rab2
488 list(element_counter)%image_list(nimages(element_counter))%bcell = neighbor_cells(i)%cell
491 nelements = max(nelements, element_counter)
494 list(j)%nimages = nimages(j)
500 IF (
list(j)%nimages == 0) cycle
501 element_counter = element_counter + 1
502 list(element_counter)%nimages =
list(j)%nimages
503 list(element_counter)%zetapzetb =
list(j)%zetapzetb
504 list(element_counter)%ZetaInv =
list(j)%ZetaInv
505 list(element_counter)%zeta =
list(j)%zeta
506 list(element_counter)%zetb =
list(j)%zetb
507 list(element_counter)%ipgf =
list(j)%ipgf
508 list(element_counter)%jpgf =
list(j)%jpgf
509 DO i = 1,
list(j)%nimages
510 list(element_counter)%image_list(i) =
list(j)%image_list(i)
514 nelements = element_counter
539 SUBROUTINE build_pair_list(natom, list, set_list, i_start, i_end, j_start, j_end, kind_of, basis_parameter, particle_set, &
540 do_periodic, coeffs_set, coeffs_kind, coeffs_kind_max0, log10_eps_schwarz, cell, &
541 pmax_blocks, atomic_pair_list)
543 INTEGER,
INTENT(IN) :: natom
546 INTENT(OUT) :: set_list
547 INTEGER,
INTENT(IN) :: i_start, i_end, j_start, j_end, &
550 POINTER :: basis_parameter
552 POINTER :: particle_set
553 LOGICAL,
INTENT(IN) :: do_periodic
555 DIMENSION(:, :, :, :),
INTENT(IN),
POINTER :: coeffs_set
557 INTENT(IN) :: coeffs_kind
558 REAL(kind=
dp),
INTENT(IN) :: coeffs_kind_max0, log10_eps_schwarz
560 REAL(
dp),
INTENT(IN) :: pmax_blocks
561 LOGICAL,
DIMENSION(natom, natom),
INTENT(IN) :: atomic_pair_list
563 INTEGER :: iatom, ikind, iset, jatom, jkind, jset, &
564 n_element, nset_ij, nseta, nsetb
565 REAL(kind=
dp) :: rab2
566 REAL(kind=
dp),
DIMENSION(3) :: b11, pbc_b, ra, rb, temp
571 DO iatom = i_start, i_end
572 DO jatom = j_start, j_end
573 IF (atomic_pair_list(jatom, iatom) .EQV. .false.) cycle
575 ikind = kind_of(iatom)
576 nseta = basis_parameter(ikind)%nset
577 ra = particle_set(iatom)%r(:)
579 IF (jatom < iatom) cycle
580 jkind = kind_of(jatom)
581 nsetb = basis_parameter(jkind)%nset
582 rb = particle_set(jatom)%r(:)
584 IF (do_periodic)
THEN
586 pbc_b =
pbc(temp, cell)
588 rab2 = (ra(1) - b11(1))**2 + (ra(2) - b11(2))**2 + (ra(3) - b11(3))**2
590 rab2 = (ra(1) - rb(1))**2 + (ra(2) - rb(2))**2 + (ra(3) - rb(3))**2
593 IF ((coeffs_kind(jkind, ikind)%x(1)*rab2 + &
594 coeffs_kind(jkind, ikind)%x(2)) + coeffs_kind_max0 + pmax_blocks < log10_eps_schwarz) cycle
596 n_element = n_element + 1
597 list%elements(n_element)%pair = [iatom, jatom]
598 list%elements(n_element)%kind_pair = [ikind, jkind]
599 list%elements(n_element)%r1 = ra
600 list%elements(n_element)%r2 = b11
601 list%elements(n_element)%dist2 = rab2
603 list%elements(n_element)%set_bounds(1) = nset_ij + 1
606 IF (coeffs_set(jset, iset, jkind, ikind)%x(1)*rab2 + coeffs_set(jset, iset, jkind, ikind)%x(2) + &
607 coeffs_kind_max0 + pmax_blocks < log10_eps_schwarz) cycle
608 nset_ij = nset_ij + 1
609 set_list(nset_ij)%pair = [iset, jset]
612 list%elements(n_element)%set_bounds(2) = nset_ij
616 list%n_element = n_element
635 do_periodic, coeffs_kind, coeffs_kind_max0, log10_eps_schwarz, cell, &
637 INTEGER,
INTENT(IN) :: natom
638 LOGICAL,
DIMENSION(natom, natom) :: atomic_pair_list
639 INTEGER,
INTENT(IN) :: kind_of(*)
641 POINTER :: basis_parameter
643 POINTER :: particle_set
644 LOGICAL,
INTENT(IN) :: do_periodic
646 INTENT(IN) :: coeffs_kind
647 REAL(kind=
dp),
INTENT(IN) :: coeffs_kind_max0, log10_eps_schwarz
650 INTENT(IN),
POINTER :: blocks
652 INTEGER :: iatom, iatom_end, iatom_start, iblock, &
653 ikind, jatom, jatom_end, jatom_start, &
654 jblock, jkind, nseta, nsetb
655 REAL(kind=
dp) :: rab2
656 REAL(kind=
dp),
DIMENSION(3) :: b11, pbc_b, ra, rb, temp
658 atomic_pair_list = .false.
660 DO iblock = 1,
SIZE(blocks)
661 iatom_start = blocks(iblock)%istart
662 iatom_end = blocks(iblock)%iend
663 DO jblock = 1,
SIZE(blocks)
664 jatom_start = blocks(jblock)%istart
665 jatom_end = blocks(jblock)%iend
667 DO iatom = iatom_start, iatom_end
668 ikind = kind_of(iatom)
669 nseta = basis_parameter(ikind)%nset
670 ra = particle_set(iatom)%r(:)
671 DO jatom = jatom_start, jatom_end
672 IF (jatom < iatom) cycle
673 jkind = kind_of(jatom)
674 nsetb = basis_parameter(jkind)%nset
675 rb = particle_set(jatom)%r(:)
677 IF (do_periodic)
THEN
679 pbc_b =
pbc(temp, cell)
681 rab2 = (ra(1) - b11(1))**2 + (ra(2) - b11(2))**2 + (ra(3) - b11(3))**2
683 rab2 = (ra(1) - rb(1))**2 + (ra(2) - rb(2))**2 + (ra(3) - rb(3))**2
686 IF ((coeffs_kind(jkind, ikind)%x(1)*rab2 + &
687 coeffs_kind(jkind, ikind)%x(2)) + coeffs_kind_max0 < log10_eps_schwarz) cycle
689 atomic_pair_list(jatom, iatom) = .true.
690 atomic_pair_list(iatom, jatom) = .true.
720 SUBROUTINE build_pair_list_mp2(natom, list, set_list, i_start, i_end, j_start, j_end, kind_of, basis_parameter, particle_set, &
721 do_periodic, coeffs_set, coeffs_kind, coeffs_kind_max0, log10_eps_schwarz, cell, &
722 pmax_blocks, atomic_pair_list, skip_atom_symmetry)
724 INTEGER,
INTENT(IN) :: natom
727 INTENT(OUT) :: set_list
728 INTEGER,
INTENT(IN) :: i_start, i_end, j_start, j_end, &
731 POINTER :: basis_parameter
733 POINTER :: particle_set
734 LOGICAL,
INTENT(IN) :: do_periodic
736 DIMENSION(:, :, :, :),
INTENT(IN),
POINTER :: coeffs_set
738 INTENT(IN) :: coeffs_kind
739 REAL(kind=
dp),
INTENT(IN) :: coeffs_kind_max0, log10_eps_schwarz
741 REAL(
dp),
INTENT(IN) :: pmax_blocks
742 LOGICAL,
DIMENSION(natom, natom),
INTENT(IN) :: atomic_pair_list
743 LOGICAL,
INTENT(IN),
OPTIONAL :: skip_atom_symmetry
745 INTEGER :: iatom, ikind, iset, jatom, jkind, jset, &
746 n_element, nset_ij, nseta, nsetb
747 LOGICAL :: my_skip_atom_symmetry
748 REAL(kind=
dp) :: rab2
749 REAL(kind=
dp),
DIMENSION(3) :: b11, pbc_b, ra, rb, temp
754 my_skip_atom_symmetry = .false.
755 IF (
PRESENT(skip_atom_symmetry)) my_skip_atom_symmetry = skip_atom_symmetry
757 DO iatom = i_start, i_end
758 DO jatom = j_start, j_end
759 IF (atomic_pair_list(jatom, iatom) .EQV. .false.) cycle
761 ikind = kind_of(iatom)
762 nseta = basis_parameter(ikind)%nset
763 ra = particle_set(iatom)%r(:)
765 IF (jatom < iatom .AND. (.NOT. my_skip_atom_symmetry)) cycle
766 jkind = kind_of(jatom)
767 nsetb = basis_parameter(jkind)%nset
768 rb = particle_set(jatom)%r(:)
770 IF (do_periodic)
THEN
772 pbc_b =
pbc(temp, cell)
774 rab2 = (ra(1) - b11(1))**2 + (ra(2) - b11(2))**2 + (ra(3) - b11(3))**2
776 rab2 = (ra(1) - rb(1))**2 + (ra(2) - rb(2))**2 + (ra(3) - rb(3))**2
779 IF ((coeffs_kind(jkind, ikind)%x(1)*rab2 + &
780 coeffs_kind(jkind, ikind)%x(2)) + coeffs_kind_max0 + pmax_blocks < log10_eps_schwarz) cycle
782 n_element = n_element + 1
783 list%elements(n_element)%pair = [iatom, jatom]
784 list%elements(n_element)%kind_pair = [ikind, jkind]
785 list%elements(n_element)%r1 = ra
786 list%elements(n_element)%r2 = b11
787 list%elements(n_element)%dist2 = rab2
789 list%elements(n_element)%set_bounds(1) = nset_ij + 1
792 IF (coeffs_set(jset, iset, jkind, ikind)%x(1)*rab2 + coeffs_set(jset, iset, jkind, ikind)%x(2) + &
793 coeffs_kind_max0 + pmax_blocks < log10_eps_schwarz) cycle
794 nset_ij = nset_ij + 1
795 set_list(nset_ij)%pair = [iset, jset]
798 list%elements(n_element)%set_bounds(2) = nset_ij
802 list%n_element = n_element