295 LOGICAL,
OPTIONAL :: molecular
298 CHARACTER(len=*),
PARAMETER :: routinen =
'build_qs_neighbor_lists'
300 CHARACTER(LEN=2) :: element_symbol, element_symbol2
301 CHARACTER(LEN=default_string_length) :: print_key_path
302 INTEGER :: handle, hfx_pot, ikind, ingp, iw, jkind, &
303 maxatom, ngp, nkind, zat
304 LOGICAL :: all_potential_present, almo, cneo_potential_present, dftb, do_hfx, dokp, &
305 gth_potential_present, lri_optbas, lrigpw, mic, molecule_only, nddo, paw_atom, &
306 paw_atom_present, rigpw, sgp_potential_present, stable_images, xtb
307 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: all_present, aux_fit_present, aux_present, &
308 cneo_present, core_present, default_present, nonbond1_atom, nonbond2_atom, oce_present, &
309 orb_present, ppl_present, ppnl_present, ri_present, xb1_atom, xb2_atom
310 REAL(
dp) :: almo_rcov, almo_rvdw, eps_schwarz, &
311 omega, pdist, rcut, roperator, subcells
312 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: all_pot_rad, aux_fit_radius, c_radius, calpha, &
313 core_radius, nuc_orb_radius, oce_radius, orb_radius, ppl_radius, ppnl_radius, ri_radius, &
315 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: pair_radius, pair_radius_lb
327 nuc_basis_set, orb_basis_set, &
333 sab_cn, sab_cneo, sab_core, sab_gcp, sab_kp, sab_kp_nosym, sab_lrc, sab_orb, sab_scp, &
334 sab_se, sab_tbe, sab_vdw, sab_xb, sab_xtb_nonbond, sab_xtb_pp, sab_xtbe, sac_ae, sac_lri, &
335 sac_ppl, sap_oce, sap_ppnl, soa_list, soo_list
341 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
347 CALL timeset(routinen, handle)
351 NULLIFY (atomic_kind_set, qs_kind_set, cell, neighbor_list_section, &
352 distribution_1d, distribution_2d, gth_potential, sgp_potential, orb_basis_set, &
353 particle_set, molecule_set, dft_control, ks_env)
368 NULLIFY (sab_xtb_nonbond)
376 NULLIFY (sab_kp_nosym)
381 atomic_kind_set=atomic_kind_set, &
382 qs_kind_set=qs_kind_set, &
385 distribution_2d=distribution_2d, &
386 local_particles=distribution_1d, &
387 particle_set=particle_set, &
388 molecule_set=molecule_set, &
389 dft_control=dft_control)
395 last_qs_neighbor_list_id_nr = last_qs_neighbor_list_id_nr + 1
396 CALL set_ks_env(ks_env=ks_env, neighbor_list_id=last_qs_neighbor_list_id_nr)
412 sab_xtb_pp=sab_xtb_pp, &
413 sab_xtb_nonbond=sab_xtb_nonbond, &
418 sab_kp_nosym=sab_kp_nosym, &
421 dokp = (kpoints%nkp > 0)
422 stable_images = dokp .AND. kpoints%symmetry
423 nddo = dft_control%qs_control%semi_empirical
424 dftb = dft_control%qs_control%dftb
425 xtb = dft_control%qs_control%xtb
426 almo = dft_control%qs_control%do_almo_scf
429 lri_optbas = dft_control%qs_control%lri_optbas
432 molecule_only = .false.
433 IF (
PRESENT(molecular)) molecule_only = molecular
443 pdist = dft_control%qs_control%pairlist_radius
450 gth_potential_present=gth_potential_present, &
451 sgp_potential_present=sgp_potential_present, &
452 all_potential_present=all_potential_present, &
453 cneo_potential_present=cneo_potential_present)
458 nkind =
SIZE(atomic_kind_set)
459 ALLOCATE (orb_present(nkind), aux_fit_present(nkind), aux_present(nkind), &
460 default_present(nkind), core_present(nkind))
461 ALLOCATE (orb_radius(nkind), aux_fit_radius(nkind), c_radius(nkind), &
462 core_radius(nkind), calpha(nkind), zeff(nkind))
463 orb_radius(:) = 0.0_dp
464 aux_fit_radius(:) = 0.0_dp
466 core_radius(:) = 0.0_dp
470 ALLOCATE (pair_radius(nkind, nkind))
471 IF (gth_potential_present .OR. sgp_potential_present)
THEN
472 ALLOCATE (ppl_present(nkind), ppl_radius(nkind))
474 ALLOCATE (ppnl_present(nkind), ppnl_radius(nkind))
477 IF (paw_atom_present)
THEN
478 ALLOCATE (oce_present(nkind), oce_radius(nkind))
481 IF (all_potential_present .OR. sgp_potential_present)
THEN
482 ALLOCATE (all_present(nkind), all_pot_rad(nkind))
485 IF (cneo_potential_present)
THEN
486 ALLOCATE (cneo_present(nkind), nuc_orb_radius(nkind))
487 nuc_orb_radius = 0.0_dp
491 ALLOCATE (atom2d(nkind))
492 CALL atom2d_build(atom2d, distribution_1d, distribution_2d, atomic_kind_set, &
493 molecule_set, molecule_only, particle_set=particle_set)
497 CALL get_atomic_kind(atomic_kind_set(ikind), atom_list=atom2d(ikind)%list)
499 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set, basis_type=
"ORB")
501 CALL get_qs_kind(qs_kind_set(ikind), basis_set=aux_fit_basis_set, basis_type=
"AUX_FIT")
502 CALL get_qs_kind(qs_kind_set(ikind), basis_set=nuc_basis_set, basis_type=
"NUC")
505 paw_proj_set=paw_proj, &
507 all_potential=all_potential, &
508 gth_potential=gth_potential, &
509 sgp_potential=sgp_potential, &
510 cneo_potential=cneo_potential)
515 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_atom)
517 cutoff=orb_radius(ikind), &
518 defined=orb_present(ikind))
520 IF (
ASSOCIATED(orb_basis_set))
THEN
521 orb_present(ikind) = .true.
522 CALL get_gto_basis_set(gto_basis_set=orb_basis_set, kind_radius=orb_radius(ikind))
524 orb_present(ikind) = .false.
529 aux_present(ikind) = .true.
531 aux_present(ikind) = .false.
534 IF (
ASSOCIATED(aux_fit_basis_set))
THEN
535 aux_fit_present(ikind) = .true.
536 CALL get_gto_basis_set(gto_basis_set=aux_fit_basis_set, kind_radius=aux_fit_radius(ikind))
538 aux_fit_present(ikind) = .false.
541 core_present(ikind) = .false.
542 IF (
ASSOCIATED(cneo_potential) .AND.
ASSOCIATED(nuc_basis_set))
THEN
543 cneo_present(ikind) = .true.
544 CALL get_gto_basis_set(gto_basis_set=nuc_basis_set, kind_radius=nuc_orb_radius(ikind))
546 IF (cneo_potential_present) cneo_present(ikind) = .false.
549 alpha_core_charge=calpha(ikind), &
550 core_charge_radius=core_radius(ikind), &
552 IF (zeff(ikind) /= 0._dp .AND. calpha(ikind) /= 0._dp)
THEN
553 core_present(ikind) = .true.
555 core_present(ikind) = .false.
560 IF (gth_potential_present .OR. sgp_potential_present)
THEN
561 IF (
ASSOCIATED(gth_potential))
THEN
563 ppl_present=ppl_present(ikind), &
564 ppl_radius=ppl_radius(ikind), &
565 ppnl_present=ppnl_present(ikind), &
566 ppnl_radius=ppnl_radius(ikind))
567 ELSE IF (
ASSOCIATED(sgp_potential))
THEN
569 ppl_present=ppl_present(ikind), &
570 ppl_radius=ppl_radius(ikind), &
571 ppnl_present=ppnl_present(ikind), &
572 ppnl_radius=ppnl_radius(ikind))
574 ppl_present(ikind) = .false.
575 ppnl_present(ikind) = .false.
580 IF (paw_atom_present)
THEN
582 oce_present(ikind) = .true.
585 oce_present(ikind) = .false.
590 IF (all_potential_present .OR. sgp_potential_present)
THEN
591 all_present(ikind) = .false.
592 all_pot_rad(ikind) = 0.0_dp
593 IF (
ASSOCIATED(all_potential))
THEN
594 all_present(ikind) = .true.
595 CALL get_potential(potential=all_potential, core_charge_radius=all_pot_rad(ikind))
596 ELSE IF (
ASSOCIATED(sgp_potential))
THEN
597 IF (sgp_potential%ecp_local)
THEN
598 all_present(ikind) = .true.
599 CALL get_potential(potential=sgp_potential, core_charge_radius=all_pot_rad(ikind))
607 IF (pdist < 0.0_dp)
THEN
612 CALL pair_radius_setup(orb_present, orb_present, orb_radius, orb_radius, pair_radius, pdist)
614 mic=mic, subcells=subcells, molecular=molecule_only, nlname=
"sab_orb", &
615 stable_images=stable_images)
616 CALL set_ks_env(ks_env=ks_env, sab_orb=sab_orb)
618 "/SAB_ORB",
"sab_orb",
"ORBITAL ORBITAL")
623 IF (.NOT. (nddo .OR. dftb .OR. xtb))
THEN
625 mic=mic, symmetric=.false., subcells=subcells, molecular=molecule_only, &
626 nlname=
"sab_all", stable_images=stable_images)
627 CALL set_ks_env(ks_env=ks_env, sab_all=sab_all)
631 IF (.NOT. (nddo .OR. dftb .OR. xtb))
THEN
632 CALL pair_radius_setup(core_present, core_present, core_radius, core_radius, pair_radius)
633 CALL build_neighbor_lists(sab_core, particle_set, atom2d, cell, pair_radius, subcells=subcells, &
634 operator_type=
"PP", nlname=
"sab_core", stable_images=stable_images)
635 CALL set_ks_env(ks_env=ks_env, sab_core=sab_core)
637 "/SAB_CORE",
"sab_core",
"CORE CORE")
650 SELECT CASE (hfx_pot)
662 cpabort(
"HFX potential not available for K-points (NYI)")
665 IF (dft_control%do_admm)
THEN
666 CALL pair_radius_setup(aux_fit_present, aux_fit_present, aux_fit_radius, aux_fit_radius, &
670 ALLOCATE (pair_radius_lb(nkind, nkind))
671 CALL pair_radius_setup(orb_present, orb_present, orb_radius, orb_radius, pair_radius_lb)
674 IF (pair_radius(ikind, jkind) +
cutoff_screen_factor*roperator <= pair_radius_lb(ikind, jkind))
THEN
675 pair_radius(ikind, jkind) = pair_radius_lb(ikind, jkind) - roperator
680 CALL pair_radius_setup(orb_present, orb_present, orb_radius, orb_radius, pair_radius)
684 CALL pair_radius_setup(orb_present, orb_present, orb_radius, orb_radius, pair_radius)
687 subcells=subcells, nlname=
"sab_kp", stable_images=stable_images)
692 subcells=subcells, nlname=
"sab_kp_nosym", symmetric=.false., &
693 stable_images=stable_images)
694 CALL set_ks_env(ks_env=ks_env, sab_kp_nosym=sab_kp_nosym)
699 IF (gth_potential_present .OR. sgp_potential_present)
THEN
700 IF (any(ppl_present))
THEN
701 CALL pair_radius_setup(orb_present, ppl_present, orb_radius, ppl_radius, pair_radius)
703 subcells=subcells, operator_type=
"ABC", nlname=
"sac_ppl", &
704 stable_images=stable_images)
705 CALL set_ks_env(ks_env=ks_env, sac_ppl=sac_ppl)
707 "/SAC_PPL",
"sac_ppl",
"ORBITAL GTH-PPL")
709 IF (qs_env%lri_env%ppl_ri)
THEN
711 subcells=subcells, symmetric=.false., operator_type=
"PP", &
712 nlname=
"sac_lri", stable_images=stable_images)
713 CALL set_ks_env(ks_env=ks_env, sac_lri=sac_lri)
718 IF (any(ppnl_present))
THEN
719 CALL pair_radius_setup(orb_present, ppnl_present, orb_radius, ppnl_radius, pair_radius)
721 subcells=subcells, operator_type=
"ABBA", nlname=
"sap_ppnl", &
722 stable_images=stable_images)
723 CALL set_ks_env(ks_env=ks_env, sap_ppnl=sap_ppnl)
725 "/SAP_PPNL",
"sap_ppnl",
"ORBITAL GTH-PPNL")
729 IF (paw_atom_present)
THEN
731 IF (any(oce_present))
THEN
732 CALL pair_radius_setup(orb_present, oce_present, orb_radius, oce_radius, pair_radius)
734 subcells=subcells, operator_type=
"ABBA", nlname=
"sap_oce", &
735 stable_images=stable_images)
736 CALL set_ks_env(ks_env=ks_env, sap_oce=sap_oce)
738 "/SAP_OCE",
"sap_oce",
"ORBITAL(A) PAW-PRJ")
743 IF (.NOT. (nddo .OR. dftb .OR. xtb))
THEN
744 IF (all_potential_present .OR. sgp_potential_present)
THEN
745 CALL pair_radius_setup(orb_present, all_present, orb_radius, all_pot_rad, pair_radius)
747 subcells=subcells, operator_type=
"ABC", nlname=
"sac_ae", &
748 stable_images=stable_images)
751 "/SAC_AE",
"sac_ae",
"ORBITAL ERFC POTENTIAL")
756 IF (cneo_potential_present)
THEN
757 CALL pair_radius_setup(cneo_present, core_present, nuc_orb_radius, core_radius, pair_radius)
759 subcells=subcells, symmetric=.false., operator_type=
"PP", nlname=
"sab_cneo")
760 CALL set_ks_env(ks_env=ks_env, sab_cneo=sab_cneo)
762 "/SAB_CNEO",
"sab_cneo",
"NUCLEAR ORBITAL ERFC POTENTIAL")
767 default_present = .true.
768 c_radius = dft_control%qs_control%se_control%cutoff_cou
770 CALL pair_radius_setup(default_present, default_present, c_radius, c_radius, pair_radius)
771 IF (dft_control%qs_control%se_control%do_ewald_gks)
THEN
774 subcells=subcells, nlname=
"sab_se")
777 subcells=subcells, nlname=
"sab_se")
781 "/SAB_SE",
"sab_se",
"HARTREE INTERACTIONS")
784 IF ((dft_control%qs_control%se_control%do_ewald) .AND. &
785 (dft_control%qs_control%se_control%integral_screening /=
do_se_is_slater))
THEN
786 c_radius = dft_control%qs_control%se_control%cutoff_lrc
787 CALL pair_radius_setup(default_present, default_present, c_radius, c_radius, pair_radius)
789 subcells=subcells, nlname=
"sab_lrc")
790 CALL set_ks_env(ks_env=ks_env, sab_lrc=sab_lrc)
792 "/SAB_LRC",
"sab_lrc",
"SE LONG-RANGE CORRECTION")
798 IF (dft_control%qs_control%dftb_control%do_ewald)
THEN
799 CALL get_qs_env(qs_env=qs_env, ewald_env=ewald_env)
802 CALL pair_radius_setup(orb_present, orb_present, c_radius, c_radius, pair_radius)
804 subcells=subcells, nlname=
"sab_tbe")
805 CALL set_ks_env(ks_env=ks_env, sab_tbe=sab_tbe)
809 IF (dft_control%qs_control%dftb_control%dispersion)
THEN
810 IF (dft_control%qs_control%dftb_control%dispersion_type ==
dispersion_uff)
THEN
812 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_atom)
815 default_present = .true.
816 CALL pair_radius_setup(default_present, default_present, c_radius, c_radius, pair_radius)
818 subcells=subcells, nlname=
"sab_vdw")
819 CALL set_ks_env(ks_env=ks_env, sab_vdw=sab_vdw)
824 IF (xtb .AND. (.NOT. dft_control%qs_control%xtb_control%do_tblite))
THEN
826 IF (dft_control%qs_control%xtb_control%do_ewald)
THEN
827 CALL get_qs_env(qs_env=qs_env, ewald_env=ewald_env)
830 CALL pair_radius_setup(orb_present, orb_present, c_radius, c_radius, pair_radius)
832 subcells=subcells, nlname=
"sab_tbe")
833 CALL set_ks_env(ks_env=ks_env, sab_tbe=sab_tbe)
836 pair_radius(1:nkind, 1:nkind) = dft_control%qs_control%xtb_control%rcpair(1:nkind, 1:nkind)
837 default_present = .true.
839 subcells=subcells, nlname=
"sab_xtb_pp")
840 CALL set_ks_env(ks_env=ks_env, sab_xtb_pp=sab_xtb_pp)
843 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom)
846 default_present = .true.
847 CALL pair_radius_setup(default_present, default_present, c_radius, c_radius, pair_radius)
849 subcells=subcells, nlname=
"sab_xtbe")
850 CALL set_ks_env(ks_env=ks_env, sab_xtbe=sab_xtbe)
852 ALLOCATE (xb1_atom(nkind), xb2_atom(nkind))
853 c_radius = 0.5_dp*dft_control%qs_control%xtb_control%xb_radius
856 IF (zat == 17 .OR. zat == 35 .OR. zat == 53 .OR. zat == 85)
THEN
857 xb1_atom(ikind) = .true.
859 xb1_atom(ikind) = .false.
861 IF (zat == 7 .OR. zat == 8 .OR. zat == 15 .OR. zat == 16)
THEN
862 xb2_atom(ikind) = .true.
864 xb2_atom(ikind) = .false.
869 symmetric=.false., subcells=subcells, operator_type=
"PP", nlname=
"sab_xb")
872 "/SAB_XB",
"sab_xb",
"XB bonding")
875 IF (dft_control%qs_control%xtb_control%do_nonbonded &
876 .AND. (.NOT. dft_control%qs_control%xtb_control%do_tblite))
THEN
877 ngp =
SIZE(dft_control%qs_control%xtb_control%nonbonded%pot)
878 ALLOCATE (nonbond1_atom(nkind), nonbond2_atom(nkind))
879 nonbond1_atom = .false.
880 nonbond2_atom = .false.
883 rcut = sqrt(dft_control%qs_control%xtb_control%nonbonded%pot(ingp)%pot%rcutsq)
885 CALL get_atomic_kind(atomic_kind_set(ikind), element_symbol=element_symbol)
887 IF (trim(dft_control%qs_control%xtb_control%nonbonded%pot(ingp)%pot%at1) == trim(element_symbol))
THEN
888 nonbond1_atom(ikind) = .true.
890 CALL get_atomic_kind(atomic_kind_set(jkind), element_symbol=element_symbol2)
892 IF (trim(dft_control%qs_control%xtb_control%nonbonded%pot(ingp)%pot%at2) == trim(element_symbol2))
THEN
893 nonbond2_atom(jkind) = .true.
898 CALL pair_radius_setup(nonbond1_atom, nonbond2_atom, c_radius, c_radius, pair_radius)
900 symmetric=.false., subcells=subcells, operator_type=
"PP", nlname=
"sab_xtb_nonbond")
901 CALL set_ks_env(ks_env=ks_env, sab_xtb_nonbond=sab_xtb_nonbond)
902 CALL write_neighbor_lists(sab_xtb_nonbond, particle_set, cell, para_env, neighbor_list_section, &
903 "/SAB_XTB_NONBOND",
"sab_xtb_nonbond",
"XTB NONBONDED INTERACTIONS")
909 IF (.NOT. dft_control%qs_control%xtb_control%do_tblite)
THEN
910 CALL get_qs_env(qs_env=qs_env, dispersion_env=dispersion_env)
911 sab_vdw => dispersion_env%sab_vdw
912 sab_cn => dispersion_env%sab_cn
915 c_radius(:) = dispersion_env%rc_d4
917 c_radius(:) = dispersion_env%rc_disp
919 default_present = .true.
920 CALL pair_radius_setup(default_present, default_present, c_radius, c_radius, pair_radius)
922 subcells=subcells, operator_type=
"PP", nlname=
"sab_vdw")
923 dispersion_env%sab_vdw => sab_vdw
929 c_radius(ikind) = 4._dp*
ptable(zat)%covalent_radius*
bohr
931 CALL pair_radius_setup(default_present, default_present, c_radius, c_radius, pair_radius)
933 subcells=subcells, operator_type=
"PP", nlname=
"sab_cn")
934 dispersion_env%sab_cn => sab_cn
940 CALL get_qs_env(qs_env=qs_env, gcp_env=gcp_env)
941 IF (
ASSOCIATED(gcp_env))
THEN
942 IF (gcp_env%do_gcp)
THEN
943 sab_gcp => gcp_env%sab_gcp
945 c_radius(ikind) = gcp_env%gcp_kind(ikind)%rcsto
947 CALL pair_radius_setup(orb_present, orb_present, c_radius, c_radius, pair_radius)
949 subcells=subcells, operator_type=
"PP", nlname=
"sab_gcp")
950 gcp_env%sab_gcp => sab_gcp
952 NULLIFY (gcp_env%sab_gcp)
956 IF (lrigpw .OR. lri_optbas)
THEN
958 CALL pair_radius_setup(orb_present, orb_present, orb_radius, orb_radius, pair_radius)
959 soo_list => qs_env%lri_env%soo_list
961 mic=mic, molecular=molecule_only, subcells=subcells, nlname=
"soo_list")
962 qs_env%lri_env%soo_list => soo_list
964 "/SOO_LIST",
"soo_list",
"ORBITAL ORBITAL (RI)")
966 ALLOCATE (ri_present(nkind), ri_radius(nkind))
970 CALL get_qs_kind(qs_kind_set(ikind), basis_set=ri_basis_set, basis_type=
"RI_HXC")
971 IF (
ASSOCIATED(ri_basis_set))
THEN
972 ri_present(ikind) = .true.
975 ri_present(ikind) = .false.
979 CALL pair_radius_setup(orb_present, orb_present, orb_radius, orb_radius, pair_radius)
980 soo_list => qs_env%lri_env%soo_list
982 mic=mic, molecular=molecule_only, subcells=subcells, nlname=
"soo_list")
983 qs_env%lri_env%soo_list => soo_list
985 CALL pair_radius_setup(ri_present, ri_present, ri_radius, ri_radius, pair_radius)
986 saa_list => qs_env%lri_env%saa_list
988 mic=mic, molecular=molecule_only, subcells=subcells, nlname=
"saa_list")
989 qs_env%lri_env%saa_list => saa_list
991 CALL pair_radius_setup(ri_present, orb_present, ri_radius, orb_radius, pair_radius)
992 soa_list => qs_env%lri_env%soa_list
994 mic=mic, symmetric=.false., molecular=molecule_only, &
995 subcells=subcells, operator_type=
"ABC", nlname=
"saa_list")
996 qs_env%lri_env%soa_list => soa_list
1002 CALL get_atomic_kind(atomic_kind_set(ikind), rcov=almo_rcov, rvdw=almo_rvdw)
1004 c_radius(ikind) = max(almo_rcov, almo_rvdw)*
bohr* &
1007 default_present = .true.
1008 CALL pair_radius_setup(default_present, default_present, c_radius, c_radius, pair_radius)
1010 subcells=subcells, operator_type=
"PP", nlname=
"sab_almo")
1011 CALL set_ks_env(ks_env=ks_env, sab_almo=sab_almo)
1015 print_key_path =
"PRINT%DISTRIBUTION"
1020 basis_section=force_env_section, &
1021 print_key_path=print_key_path, &
1023 CALL write_neighbor_distribution(sab_orb, qs_kind_set, iw, para_env)
1026 basis_section=force_env_section, &
1027 print_key_path=print_key_path)
1034 DEALLOCATE (orb_present, default_present, core_present)
1035 DEALLOCATE (orb_radius, aux_fit_radius, c_radius, core_radius)
1036 DEALLOCATE (calpha, zeff)
1037 DEALLOCATE (pair_radius)
1038 IF (gth_potential_present .OR. sgp_potential_present)
THEN
1039 DEALLOCATE (ppl_present, ppl_radius)
1040 DEALLOCATE (ppnl_present, ppnl_radius)
1042 IF (paw_atom_present)
THEN
1043 DEALLOCATE (oce_present, oce_radius)
1045 IF (all_potential_present .OR. sgp_potential_present)
THEN
1046 DEALLOCATE (all_present, all_pot_rad)
1048 IF (cneo_potential_present)
THEN
1049 DEALLOCATE (cneo_present, nuc_orb_radius)
1052 CALL timestop(handle)
1081 mic, symmetric, molecular, subset_of_mol, current_subset, &
1082 operator_type, nlname, atomb_to_keep, stable_images)
1089 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: pair_radius
1090 REAL(
dp),
INTENT(IN) :: subcells
1091 LOGICAL,
INTENT(IN),
OPTIONAL :: mic, symmetric, molecular
1092 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: subset_of_mol
1093 INTEGER,
OPTIONAL :: current_subset
1094 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: operator_type
1095 CHARACTER(LEN=*),
INTENT(IN) :: nlname
1096 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: atomb_to_keep
1097 LOGICAL,
INTENT(IN),
OPTIONAL :: stable_images
1099 CHARACTER(len=*),
PARAMETER :: routinen =
'build_neighbor_lists'
1101 INTEGER :: atom_a, atom_b, handle, i, iab, iatom, iatom_local, iatom_subcell, icell, ikind, &
1102 inode, j, jatom, jatom_local, jcell, jkind, k, kcell, maxat, mol_a, mol_b, natom, nentry, &
1104 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: nlista, nlistb
1105 INTEGER,
DIMENSION(3) :: cell_b, ncell, nsubcell, periodic
1106 INTEGER,
DIMENSION(:),
POINTER :: index_list
1107 LOGICAL :: include_ab, my_mic, my_molecular, &
1108 my_sort_atomb, my_stable_images, &
1110 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: pres_a, pres_b
1111 REAL(
dp) :: deth, rab2, rab2_max, rab_max, rabm, &
1113 REAL(
dp),
DIMENSION(3) :: pd, r, ra, rab, rab_pbc, rb, sab_max, &
1114 sab_max_guard, sb, sb_max, sb_min, &
1116 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: r_pbc
1117 TYPE(local_lists),
DIMENSION(:),
POINTER :: lista, listb
1119 DIMENSION(:),
POINTER :: nl_iterator
1121 DIMENSION(:) :: kind_a
1123 TYPE(
subcell_type),
DIMENSION(:, :, :),
POINTER :: subcell
1125 CALL timeset(routinen//
"_"//trim(nlname), handle)
1129 IF (
PRESENT(mic)) my_mic = mic
1130 my_symmetric = .true.
1131 IF (
PRESENT(symmetric)) my_symmetric = symmetric
1132 my_molecular = .false.
1134 IF (
PRESENT(molecular)) my_molecular = molecular
1135 my_stable_images = .false.
1136 IF (
PRESENT(stable_images)) my_stable_images = stable_images
1138 IF (
PRESENT(operator_type))
THEN
1139 SELECT CASE (operator_type)
1144 cpassert(.NOT. my_molecular)
1145 my_symmetric = .false.
1148 my_symmetric = .false.
1152 CALL cp_abort(__location__, &
1153 "<AB>, <ABC>, <ABBA>, <PP> are supported as the <operator_type> "// &
1154 "for build_neighbor_lists, found unknown option "// &
1155 "<"//trim(operator_type)//
">")
1161 my_sort_atomb = .false.
1162 IF (
PRESENT(atomb_to_keep))
THEN
1163 my_sort_atomb = .true.
1170 ALLOCATE (ab_list(nkind*nkind))
1171 DO iab = 1,
SIZE(ab_list)
1172 NULLIFY (ab_list(iab)%neighbor_list_set)
1173 ab_list(iab)%nl_size = -1
1174 ab_list(iab)%nl_start = -1
1175 ab_list(iab)%nl_end = -1
1176 NULLIFY (ab_list(iab)%nlist_task)
1180 ALLOCATE (pres_a(nkind), pres_b(nkind))
1182 pres_a(ikind) = any(pair_radius(ikind, :) > 0._dp)
1183 pres_b(ikind) = any(pair_radius(:, ikind) > 0._dp)
1187 natom =
SIZE(particle_set)
1188 ALLOCATE (r_pbc(3, natom))
1190 IF (my_stable_images)
THEN
1191 r_pbc(1:3, i) =
pbc_stable(particle_set(i)%r(1:3), cell)
1193 r_pbc(1:3, i) =
pbc(particle_set(i)%r(1:3), cell)
1200 maxat = max(maxat,
SIZE(
atom(ikind)%list))
1202 ALLOCATE (index_list(maxat))
1206 ALLOCATE (lista(nkind), listb(nkind), nlista(nkind), nlistb(nkind))
1210 NULLIFY (lista(ikind)%list, listb(ikind)%list)
1213 IF (
ASSOCIATED(
atom(ikind)%list_local_a_index))
THEN
1214 lista(ikind)%list =>
atom(ikind)%list_local_a_index
1215 nlista(ikind) =
SIZE(lista(ikind)%list)
1217 IF (
ASSOCIATED(
atom(ikind)%list_local_b_index))
THEN
1218 listb(ikind)%list =>
atom(ikind)%list_local_b_index
1219 nlistb(ikind) =
SIZE(listb(ikind)%list)
1222 IF (
ASSOCIATED(
atom(ikind)%list_local_a_index))
THEN
1223 lista(ikind)%list =>
atom(ikind)%list_local_a_index
1224 nlista(ikind) =
SIZE(lista(ikind)%list)
1226 nlistb(ikind) =
SIZE(
atom(ikind)%list)
1227 listb(ikind)%list => index_list
1229 CALL combine_lists(lista(ikind)%list, nlista(ikind), ikind,
atom)
1230 nlistb(ikind) =
SIZE(
atom(ikind)%list)
1231 listb(ikind)%list => index_list
1233 nlista(ikind) =
SIZE(
atom(ikind)%list_1d)
1234 lista(ikind)%list =>
atom(ikind)%list_1d
1235 nlistb(ikind) =
SIZE(
atom(ikind)%list)
1236 listb(ikind)%list => index_list
1238 cpabort(
"Only 1, 2, 3, 4 are supported as otype for the operator")
1245 maxat = max(maxat, nlista(ikind), nlistb(ikind))
1247 ALLOCATE (kind_a(2*maxat))
1250 CALL get_cell(cell=cell, periodic=periodic, deth=deth)
1254 IF (.NOT. pres_a(ikind)) cycle
1257 IF (.NOT. pres_b(jkind)) cycle
1259 iab = ikind + nkind*(jkind - 1)
1262 IF (pair_radius(ikind, jkind) <= 0._dp) cycle
1263 rab_max = pair_radius(ikind, jkind)
1264 IF (otype == 3)
THEN
1268 rabm = maxval(pair_radius(:, jkind))
1272 rab2_max = rabm*rabm
1279 sab_max_guard = 15.0_dp/pd
1282 subcell_scale = ((125.0_dp**3)/deth)**(1.0_dp/6.0_dp)
1286 nsubcell(:) = int(max(1.0_dp, min(0.5_dp*subcells*subcell_scale/sab_max(:), &
1287 0.5_dp*subcells*subcell_scale/sab_max_guard(:))))
1290 ncell(:) = (int(sab_max(:)) + 1)*periodic(:)
1293 symmetric=my_symmetric)
1294 neighbor_list_set => ab_list(iab)%neighbor_list_set
1296 DO iatom_local = 1, nlista(ikind)
1297 iatom = lista(ikind)%list(iatom_local)
1298 atom_a =
atom(ikind)%list(iatom)
1301 neighbor_list=kind_a(iatom_local)%neighbor_list)
1305 DO iatom_local = 1, nlista(ikind)
1306 iatom = lista(ikind)%list(iatom_local)
1307 atom_a =
atom(ikind)%list(iatom)
1308 r = r_pbc(:, atom_a)
1310 subcell(i, j, k)%natom = subcell(i, j, k)%natom + 1
1312 DO k = 1, nsubcell(3)
1313 DO j = 1, nsubcell(2)
1314 DO i = 1, nsubcell(1)
1315 maxat = subcell(i, j, k)%natom + subcell(i, j, k)%natom/10
1316 ALLOCATE (subcell(i, j, k)%atom_list(maxat))
1317 subcell(i, j, k)%natom = 0
1321 DO iatom_local = 1, nlista(ikind)
1322 iatom = lista(ikind)%list(iatom_local)
1323 atom_a =
atom(ikind)%list(iatom)
1324 r = r_pbc(:, atom_a)
1326 subcell(i, j, k)%natom = subcell(i, j, k)%natom + 1
1327 subcell(i, j, k)%atom_list(subcell(i, j, k)%natom) = iatom_local
1330 DO jatom_local = 1, nlistb(jkind)
1331 jatom = listb(jkind)%list(jatom_local)
1332 atom_b =
atom(jkind)%list(jatom)
1333 IF (my_sort_atomb .AND. .NOT. my_symmetric)
THEN
1334 IF (.NOT. any(atomb_to_keep == atom_b)) cycle
1336 IF (my_molecular)
THEN
1337 mol_b =
atom(jkind)%list_b_mol(jatom_local)
1338 IF (
PRESENT(subset_of_mol))
THEN
1339 IF (subset_of_mol(mol_b) /= current_subset) cycle
1342 r = r_pbc(:, atom_b)
1345 loop2_kcell:
DO kcell = -ncell(3), ncell(3)
1346 sb(3) = sb_pbc(3) + real(kcell,
dp)
1347 sb_min(3) = sb(3) - sab_max(3)
1348 sb_max(3) = sb(3) + sab_max(3)
1349 IF (periodic(3) /= 0)
THEN
1350 IF (sb_min(3) >= 0.5_dp)
EXIT loop2_kcell
1351 IF (sb_max(3) < -0.5_dp) cycle loop2_kcell
1355 loop2_jcell:
DO jcell = -ncell(2), ncell(2)
1356 sb(2) = sb_pbc(2) + real(jcell,
dp)
1357 sb_min(2) = sb(2) - sab_max(2)
1358 sb_max(2) = sb(2) + sab_max(2)
1359 IF (periodic(2) /= 0)
THEN
1360 IF (sb_min(2) >= 0.5_dp)
EXIT loop2_jcell
1361 IF (sb_max(2) < -0.5_dp) cycle loop2_jcell
1365 loop2_icell:
DO icell = -ncell(1), ncell(1)
1366 sb(1) = sb_pbc(1) + real(icell,
dp)
1367 sb_min(1) = sb(1) - sab_max(1)
1368 sb_max(1) = sb(1) + sab_max(1)
1369 IF (periodic(1) /= 0)
THEN
1370 IF (sb_min(1) >= 0.5_dp)
EXIT loop2_icell
1371 IF (sb_max(1) < -0.5_dp) cycle loop2_icell
1377 loop_k:
DO k = 1, nsubcell(3)
1378 loop_j:
DO j = 1, nsubcell(2)
1379 loop_i:
DO i = 1, nsubcell(1)
1383 IF (periodic(3) /= 0)
THEN
1384 IF (sb_max(3) < subcell(i, j, k)%s_min(3))
EXIT loop_k
1385 IF (sb_min(3) >= subcell(i, j, k)%s_max(3)) cycle loop_k
1388 IF (periodic(2) /= 0)
THEN
1389 IF (sb_max(2) < subcell(i, j, k)%s_min(2))
EXIT loop_j
1390 IF (sb_min(2) >= subcell(i, j, k)%s_max(2)) cycle loop_j
1393 IF (periodic(1) /= 0)
THEN
1394 IF (sb_max(1) < subcell(i, j, k)%s_min(1))
EXIT loop_i
1395 IF (sb_min(1) >= subcell(i, j, k)%s_max(1)) cycle loop_i
1398 IF (subcell(i, j, k)%natom == 0) cycle loop_i
1400 DO iatom_subcell = 1, subcell(i, j, k)%natom
1401 iatom_local = subcell(i, j, k)%atom_list(iatom_subcell)
1402 iatom = lista(ikind)%list(iatom_local)
1403 atom_a =
atom(ikind)%list(iatom)
1404 IF (my_molecular)
THEN
1405 mol_a =
atom(ikind)%list_a_mol(iatom_local)
1406 IF (mol_a /= mol_b) cycle
1408 IF (my_symmetric)
THEN
1409 IF (atom_a > atom_b)
THEN
1410 include_ab = (
modulo(atom_a + atom_b, 2) /= 0)
1412 include_ab = (
modulo(atom_a + atom_b, 2) == 0)
1414 IF (my_sort_atomb)
THEN
1415 IF ((.NOT. any(atomb_to_keep == atom_b)) .AND. &
1416 (.NOT. any(atomb_to_keep == atom_a)))
THEN
1417 include_ab = .false.
1423 IF (include_ab)
THEN
1424 ra(:) = r_pbc(:, atom_a)
1425 rab(:) = rb(:) - ra(:)
1426 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
1427 IF (rab2 < rab2_max)
THEN
1433 rab_pbc(:) =
pbc(rab(:), cell)
1434 IF (sum((rab_pbc - rab)**2) > epsilon(1.0_dp))
THEN
1435 include_ab = .false.
1438 IF (include_ab)
THEN
1440 neighbor_list=kind_a(iatom_local)%neighbor_list, &
1469 DEALLOCATE (lista(ikind)%list)
1472 cpabort(
"Only 1, 2, 3, 4 are supported as otype for the operator")
1474 DEALLOCATE (kind_a, pres_a, pres_b, lista, listb, nlista, nlistb)
1475 DEALLOCATE (index_list)
1482 IF (inode == 1) nentry = nentry + nnode
1486 ALLOCATE (ab_list(1)%nlist_task(nentry))
1487 ab_list(1)%nl_size = nentry
1488 DO iab = 2,
SIZE(ab_list)
1489 ab_list(iab)%nl_size = nentry
1490 ab_list(iab)%nlist_task => ab_list(1)%nlist_task
1499 iab = (ikind - 1)*nkind + jkind
1500 IF (ab_list(iab)%nl_start < 0) ab_list(iab)%nl_start = nentry
1501 IF (ab_list(iab)%nl_end < 0)
THEN
1502 ab_list(iab)%nl_end = nentry
1504 cpassert(ab_list(iab)%nl_end + 1 == nentry)
1505 ab_list(iab)%nl_end = nentry
1510 CALL timestop(handle)
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.