14 USE omp_lib,
ONLY: omp_get_max_threads, &
15 omp_get_num_threads, &
37 dbt_create, dbt_distribution_destroy, dbt_distribution_new, dbt_distribution_type, &
38 dbt_finalize, dbt_pgrid_create, dbt_pgrid_destroy, dbt_pgrid_type, dbt_put_block, &
39 dbt_reserve_blocks, dbt_type
99 USE iso_c_binding,
ONLY: c_loc
100 USE libxs,
ONLY: libxs_matcopy, &
103#include "./base/base_uses.f90"
108 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xas_tdp_integrals'
132 blk_size_3, only_bc_same_center)
134 TYPE(dbt_type),
INTENT(OUT) :: pq_x
136 POINTER :: ab_nl, ac_nl
138 INTEGER,
DIMENSION(:),
INTENT(IN) :: blk_size_1, blk_size_2, blk_size_3
139 LOGICAL,
INTENT(IN),
OPTIONAL :: only_bc_same_center
141 CHARACTER(len=*),
PARAMETER :: routinen =
'create_pqX_tensor'
143 INTEGER :: a, b, group_handle, handle, i, iatom, &
144 ikind, jatom, katom, kkind, nblk, &
145 nblk_3, nblk_per_thread, nkind
146 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: idx1,
idx2,
idx3
147 INTEGER,
DIMENSION(3) :: pdims
148 INTEGER,
DIMENSION(:),
POINTER :: col_dist, row_dist
149 INTEGER,
DIMENSION(:, :),
POINTER :: mat_pgrid
150 LOGICAL :: my_sort_bc, symmetric
151 REAL(
dp),
DIMENSION(3) :: rab, rac, rbc
152 TYPE(dbt_distribution_type) :: t_dist
153 TYPE(dbt_pgrid_type) :: t_pgrid
156 DIMENSION(:),
POINTER :: ab_iter, ac_iter
158 NULLIFY (ab_iter, ac_iter, col_dist, row_dist, mat_pgrid)
160 CALL timeset(routinen, handle)
163 IF (
PRESENT(only_bc_same_center)) my_sort_bc = only_bc_same_center
170 row_dist=row_dist, col_dist=col_dist)
171 CALL group%set_handle(group_handle)
174 pdims(1) =
SIZE(mat_pgrid, 1); pdims(2) =
SIZE(mat_pgrid, 2); pdims(3) = 1
175 CALL dbt_pgrid_create(group, pdims, t_pgrid)
177 nblk_3 =
SIZE(blk_size_3)
178 CALL dbt_distribution_new(t_dist, t_pgrid, nd_dist_1=row_dist, nd_dist_2=col_dist, &
179 nd_dist_3=[(0, i=1, nblk_3)])
182 CALL dbt_create(pq_x, name=
"(pq|X)", dist=t_dist, map1_2d=[1, 2], map2_2d=[3], &
183 blk_size_1=blk_size_1, blk_size_2=blk_size_2, blk_size_3=blk_size_3)
200 rbc(:) = rac(:) - rab(:)
201 IF (.NOT. (all(abs(rbc) <= 1.0e-8_dp) .OR. all(abs(rac) <= 1.0e-8_dp))) cycle
212 ALLOCATE (idx1(nblk),
idx2(nblk),
idx3(nblk))
219 CALL get_iterator_info(ab_iter, ikind=ikind, iatom=iatom, jatom=jatom, nkind=nkind, r=rab)
230 rbc(:) = rac(:) - rab(:)
231 IF (.NOT. (all(abs(rbc) <= 1.0e-8_dp) .OR. all(abs(rac) <= 1.0e-8_dp))) cycle
249 nblk_per_thread = nblk/omp_get_num_threads() + 1
250 a = omp_get_thread_num()*nblk_per_thread + 1
251 b = min(a + nblk_per_thread, nblk)
252 CALL dbt_reserve_blocks(pq_x, idx1(a:b),
idx2(a:b),
idx3(a:b))
254 CALL dbt_finalize(pq_x)
257 CALL dbt_distribution_destroy(t_dist)
258 CALL dbt_pgrid_destroy(t_pgrid)
260 CALL timestop(handle)
280 basis_set_list_c, potential_parameter, qs_env, &
281 only_bc_same_center, eps_screen)
283 TYPE(dbt_type) :: pq_x
285 POINTER :: ab_nl, ac_nl
290 LOGICAL,
INTENT(IN),
OPTIONAL :: only_bc_same_center
291 REAL(
dp),
INTENT(IN),
OPTIONAL :: eps_screen
293 CHARACTER(len=*),
PARAMETER :: routinen =
'fill_pqX_tensor'
295 INTEGER :: egfa, egfb, egfc, handle, i, iatom, ibasis, ikind, ilist,
imax, iset, jatom, &
296 jkind, jset, katom, kkind, kset, m_max, max_nset, maxli, maxlj, maxlk, mepos, nbasis, &
297 ncoa, ncob, ncoc, ni, nj, nk, nseta, nsetb, nsetc, nthread, sgfa, sgfb, sgfc, unit_id
298 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, lb_max, lb_min, lc_max, &
299 lc_min, npgfa, npgfb, npgfc, nsgfa, &
301 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb, first_sgfc
302 LOGICAL :: do_screen, my_sort_bc
303 REAL(
dp) :: dij, dik, djk, my_eps_screen, ri(3), &
304 rij(3), rik(3), rj(3), rjk(3), rk(3), &
305 sabc_ext, screen_radius
306 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: ccp_buffer, cpp_buffer
307 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: max_contr, max_contra, max_contrb, &
309 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: iabc, sabc, work
310 REAL(
dp),
DIMENSION(:),
POINTER :: set_radius_a, set_radius_b, set_radius_c
311 REAL(
dp),
DIMENSION(:, :),
POINTER :: rpgf_a, rpgf_b, rpgf_c, zeta, zetb, zetc
321 NULLIFY (basis_set, basis_set_list, para_env, la_max, la_min)
322 NULLIFY (lb_max, lb_min, lc_max, lc_min, npgfa, npgfb, npgfc, nsgfa, nsgfb, nsgfc)
323 NULLIFY (first_sgfa, first_sgfb, first_sgfc, set_radius_a, set_radius_b, set_radius_c)
324 NULLIFY (rpgf_a, rpgf_b, rpgf_c, zeta, zetb, zetc)
325 NULLIFY (basis_set_a, basis_set_b, basis_set_c, tspa, spb, spc)
327 CALL timeset(routinen, handle)
330 nbasis =
SIZE(basis_set_list_a)
333 DO ibasis = 1, nbasis
335 maxl=
imax, nset=iset, nsgf_set=nsgfa)
336 maxli = max(maxli,
imax)
337 max_nset = max(max_nset, iset)
340 DO ibasis = 1, nbasis
342 maxl=
imax, nset=iset, nsgf_set=nsgfb, npgf=npgfb)
343 maxlj = max(maxlj,
imax)
344 max_nset = max(max_nset, iset)
347 DO ibasis = 1, nbasis
349 maxl=
imax, nset=iset, npgf=npgfc)
350 maxlk = max(maxlk,
imax)
351 max_nset = max(max_nset, iset)
353 m_max = maxli + maxlj + maxlk
357 IF (
PRESENT(eps_screen))
THEN
359 my_eps_screen = eps_screen
361 screen_radius = 0.0_dp
368 screen_radius = 1000000.0_dp
375 ALLOCATE (max_contr(max_nset, nbasis), max_contra(max_nset, nbasis), &
376 max_contrb(max_nset, nbasis), max_contrc(max_nset, nbasis))
381 IF (ilist == 1) basis_set_list => basis_set_list_a
382 IF (ilist == 2) basis_set_list => basis_set_list_b
383 IF (ilist == 3) basis_set_list => basis_set_list_c
387 DO ibasis = 1, nbasis
388 basis_set => basis_set_list(ibasis)%gto_basis_set
390 DO iset = 1, basis_set%nset
392 ncoa = basis_set%npgf(iset)*
ncoset(basis_set%lmax(iset))
393 sgfa = basis_set%first_sgf(1, iset)
394 egfa = sgfa + basis_set%nsgf_set(iset) - 1
396 max_contr(iset, ibasis) = &
397 maxval([(sum(abs(basis_set%sphi(1:ncoa, i))), i=sgfa, egfa)])
402 IF (ilist == 1) max_contra(:, :) = max_contr(:, :)
403 IF (ilist == 2) max_contrb(:, :) = max_contr(:, :)
404 IF (ilist == 3) max_contrc(:, :) = max_contr(:, :)
406 DEALLOCATE (max_contr)
411 ALLOCATE (tspa(max_nset, nbasis), spb(max_nset, nbasis), spc(max_nset, nbasis))
412 DO ibasis = 1, nbasis
413 DO iset = 1, max_nset
414 NULLIFY (tspa(iset, ibasis)%array)
415 NULLIFY (spb(iset, ibasis)%array)
416 NULLIFY (spc(iset, ibasis)%array)
422 DO ibasis = 1, nbasis
423 IF (ilist == 1) basis_set => basis_set_list_a(ibasis)%gto_basis_set
424 IF (ilist == 2) basis_set => basis_set_list_b(ibasis)%gto_basis_set
425 IF (ilist == 3) basis_set => basis_set_list_c(ibasis)%gto_basis_set
427 DO iset = 1, basis_set%nset
429 ncoa = basis_set%npgf(iset)*
ncoset(basis_set%lmax(iset))
430 sgfa = basis_set%first_sgf(1, iset)
431 egfa = sgfa + basis_set%nsgf_set(iset) - 1
434 ALLOCATE (tspa(iset, ibasis)%array(basis_set%nsgf_set(iset), ncoa))
436 CALL libxs_otrans(c_loc(tspa(iset, ibasis)%array), &
437 c_loc(basis_set%sphi(1, sgfa)), &
438 8, ncoa, egfa - sgfa + 1, &
439 SIZE(basis_set%sphi, 1), &
440 basis_set%nsgf_set(iset))
442 tspa(iset, ibasis)%array(:, :) = transpose(basis_set%sphi(1:ncoa, sgfa:egfa))
444 ELSE IF (ilist == 2)
THEN
445 ALLOCATE (spb(iset, ibasis)%array(ncoa, basis_set%nsgf_set(iset)))
447 CALL libxs_matcopy(c_loc(spb(iset, ibasis)%array), &
448 c_loc(basis_set%sphi(1, sgfa)), &
449 8, ncoa, egfa - sgfa + 1, &
450 SIZE(basis_set%sphi, 1), ncoa)
452 spb(iset, ibasis)%array(:, :) = basis_set%sphi(1:ncoa, sgfa:egfa)
455 ALLOCATE (spc(iset, ibasis)%array(ncoa, basis_set%nsgf_set(iset)))
457 CALL libxs_matcopy(c_loc(spc(iset, ibasis)%array), &
458 c_loc(basis_set%sphi(1, sgfa)), &
459 8, ncoa, egfa - sgfa + 1, &
460 SIZE(basis_set%sphi, 1), ncoa)
462 spc(iset, ibasis)%array(:, :) = basis_set%sphi(1:ncoa, sgfa:egfa)
471 IF (
PRESENT(only_bc_same_center)) my_sort_bc = only_bc_same_center
479 IF (para_env%mepos == 0)
THEN
480 CALL open_file(unit_number=unit_id, file_name=potential_parameter%filename)
482 CALL init(m_max, unit_id, para_env%mepos, para_env)
483 IF (para_env%mepos == 0)
THEN
499 CALL init_o3c_container(o3c, 1, basis_set_list_a, basis_set_list_b, basis_set_list_c, &
500 ab_nl, ac_nl, only_bc_same_center=my_sort_bc)
521 DO WHILE (
o3c_iterate(o3c_iterator, mepos=mepos) == 0)
523 iatom=iatom, jatom=jatom, katom=katom, rij=rij, rik=rik)
526 basis_set_a => basis_set_list_a(ikind)%gto_basis_set
527 first_sgfa => basis_set_a%first_sgf
528 la_max => basis_set_a%lmax
529 la_min => basis_set_a%lmin
530 npgfa => basis_set_a%npgf
531 nseta = basis_set_a%nset
532 nsgfa => basis_set_a%nsgf_set
533 zeta => basis_set_a%zet
534 rpgf_a => basis_set_a%pgf_radius
535 set_radius_a => basis_set_a%set_radius
538 basis_set_b => basis_set_list_b(jkind)%gto_basis_set
539 first_sgfb => basis_set_b%first_sgf
540 lb_max => basis_set_b%lmax
541 lb_min => basis_set_b%lmin
542 npgfb => basis_set_b%npgf
543 nsetb = basis_set_b%nset
544 nsgfb => basis_set_b%nsgf_set
545 zetb => basis_set_b%zet
546 rpgf_b => basis_set_b%pgf_radius
547 set_radius_b => basis_set_b%set_radius
550 basis_set_c => basis_set_list_c(kkind)%gto_basis_set
551 first_sgfc => basis_set_c%first_sgf
552 lc_max => basis_set_c%lmax
553 lc_min => basis_set_c%lmin
554 npgfc => basis_set_c%npgf
555 nsetc = basis_set_c%nset
556 nsgfc => basis_set_c%nsgf_set
557 zetc => basis_set_c%zet
558 rpgf_c => basis_set_c%pgf_radius
559 set_radius_c => basis_set_c%set_radius
573 ALLOCATE (iabc(ni, nj, nk))
574 iabc(:, :, :) = 0.0_dp
577 ncoa = npgfa(iset)*
ncoset(la_max(iset))
578 sgfa = first_sgfa(1, iset)
579 egfa = sgfa + nsgfa(iset) - 1
582 ncob = npgfb(jset)*
ncoset(lb_max(jset))
583 sgfb = first_sgfb(1, jset)
584 egfb = sgfb + nsgfb(jset) - 1
587 IF (set_radius_a(iset) + set_radius_b(jset) < dij) cycle
590 ncoc = npgfc(kset)*
ncoset(lc_max(kset))
591 sgfc = first_sgfc(1, kset)
592 egfc = sgfc + nsgfc(kset) - 1
595 IF (set_radius_a(iset) + set_radius_c(kset) + screen_radius < dik) cycle
596 IF (set_radius_b(jset) + set_radius_c(kset) + screen_radius < djk) cycle
599 ALLOCATE (sabc(ncoa, ncob, ncoc))
600 sabc(:, :, :) = 0.0_dp
603 CALL eri_3center(sabc, la_min(iset), la_max(iset), npgfa(iset), zeta(:, iset), &
604 rpgf_a(:, iset), ri, lb_min(jset), lb_max(jset), npgfb(jset), &
605 zetb(:, jset), rpgf_b(:, jset), rj, lc_min(kset), lc_max(kset), &
606 npgfc(kset), zetc(:, kset), rpgf_c(:, kset), rk, dij, dik, &
607 djk, lib, potential_parameter, int_abc_ext=sabc_ext)
608 IF (my_eps_screen > sabc_ext*(max_contra(iset, ikind)* &
609 max_contrb(jset, jkind)* &
610 max_contrc(kset, kkind)))
THEN
615 CALL eri_3center(sabc, la_min(iset), la_max(iset), npgfa(iset), zeta(:, iset), &
616 rpgf_a(:, iset), ri, lb_min(jset), lb_max(jset), npgfb(jset), &
617 zetb(:, jset), rpgf_b(:, jset), rj, lc_min(kset), lc_max(kset), &
618 npgfc(kset), zetc(:, kset), rpgf_c(:, kset), rk, dij, dik, &
619 djk, lib, potential_parameter)
622 ALLOCATE (work(nsgfa(iset), nsgfb(jset), nsgfc(kset)))
624 CALL abc_contract_xsmm(work, sabc, tspa(iset, ikind)%array, spb(jset, jkind)%array, &
625 spc(kset, kkind)%array, ncoa, ncob, ncoc, nsgfa(iset), &
626 nsgfb(jset), nsgfc(kset), cpp_buffer, ccp_buffer)
628 iabc(sgfa:egfa, sgfb:egfb, sgfc:egfc) = work(:, :, :)
629 DEALLOCATE (sabc, work)
637 CALL dbt_put_block(pq_x, [iatom, jatom, katom], shape(iabc), iabc, summation=.true.)
643 IF (
ALLOCATED(ccp_buffer))
DEALLOCATE (ccp_buffer)
644 IF (
ALLOCATED(cpp_buffer))
DEALLOCATE (cpp_buffer)
653 DO iset = 1, max_nset
654 DO ibasis = 1, nbasis
655 IF (
ASSOCIATED(tspa(iset, ibasis)%array))
DEALLOCATE (tspa(iset, ibasis)%array)
656 IF (
ASSOCIATED(spb(iset, ibasis)%array))
DEALLOCATE (spb(iset, ibasis)%array)
657 IF (
ASSOCIATED(spc(iset, ibasis)%array))
DEALLOCATE (spc(iset, ibasis)%array)
660 DEALLOCATE (tspa, spb, spc)
662 CALL timestop(handle)
683 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: excited_atoms
686 INTEGER :: ikind, nkind
687 LOGICAL :: my_restrictb
688 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: a_present, b_present
690 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: a_radius, b_radius
691 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: pair_radius
700 NULLIFY (atomic_kind_set, distribution_1d, distribution_2d, molecule_set, particle_set, cell)
706 my_restrictb = .false.
707 IF (
PRESENT(excited_atoms))
THEN
708 my_restrictb = .true.
711 ALLOCATE (a_present(nkind), b_present(nkind))
714 ALLOCATE (a_radius(nkind), b_radius(nkind))
720 IF (
ASSOCIATED(basis_a(ikind)%gto_basis_set))
THEN
721 a_present(ikind) = .true.
722 CALL get_gto_basis_set(basis_a(ikind)%gto_basis_set, kind_radius=a_radius(ikind))
725 IF (
ASSOCIATED(basis_b(ikind)%gto_basis_set))
THEN
726 b_present(ikind) = .true.
727 CALL get_gto_basis_set(basis_b(ikind)%gto_basis_set, kind_radius=b_radius(ikind))
731 ALLOCATE (pair_radius(nkind, nkind))
736 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, cell=cell, &
737 distribution_2d=distribution_2d, local_particles=distribution_1d, &
738 particle_set=particle_set, molecule_set=molecule_set)
741 IF (
PRESENT(ext_dist2d)) distribution_2d => ext_dist2d
743 ALLOCATE (atom2d(nkind))
744 CALL atom2d_build(atom2d, distribution_1d, distribution_2d, atomic_kind_set, &
745 molecule_set, .false., particle_set)
747 IF (my_restrictb)
THEN
750 atomb_to_keep=excited_atoms, nlname=
"XAS_TDP_ovlp_nl")
755 nlname=
"XAS_TDP_ovlp_nl")
782 INTEGER,
INTENT(IN) :: op_type
784 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: excited_atoms
785 REAL(
dp),
INTENT(IN),
OPTIONAL :: x_range
788 INTEGER :: ikind, nkind
789 LOGICAL :: sort_atoms
790 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: a_present, c_present
792 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: a_radius, c_radius
793 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: pair_radius
802 NULLIFY (atomic_kind_set, distribution_1d, distribution_2d, molecule_set, particle_set, cell)
808 IF ((
PRESENT(excited_atoms))) sort_atoms = .true.
810 ALLOCATE (a_present(nkind), c_present(nkind))
813 ALLOCATE (a_radius(nkind), c_radius(nkind))
823 IF (
ASSOCIATED(basis_a(ikind)%gto_basis_set))
THEN
824 a_present(ikind) = .true.
825 CALL get_gto_basis_set(basis_a(ikind)%gto_basis_set, kind_radius=a_radius(ikind))
828 IF (
ASSOCIATED(basis_c(ikind)%gto_basis_set))
THEN
829 c_present(ikind) = .true.
830 CALL get_gto_basis_set(basis_c(ikind)%gto_basis_set, kind_radius=c_radius(ikind))
838 IF (
ASSOCIATED(basis_c(ikind)%gto_basis_set))
THEN
839 c_present(ikind) = .true.
840 c_radius(ikind) = 1000000.0_dp
842 IF (
ASSOCIATED(basis_a(ikind)%gto_basis_set)) a_present(ikind) = .true.
849 IF (
ASSOCIATED(basis_a(ikind)%gto_basis_set))
THEN
850 a_present(ikind) = .true.
851 CALL get_gto_basis_set(basis_a(ikind)%gto_basis_set, kind_radius=a_radius(ikind))
853 IF (
ASSOCIATED(basis_c(ikind)%gto_basis_set))
THEN
854 c_present(ikind) = .true.
855 CALL get_gto_basis_set(basis_c(ikind)%gto_basis_set, kind_radius=c_radius(ikind))
856 c_radius(ikind) = c_radius(ikind) + x_range
861 cpabort(
"Operator not known")
864 ALLOCATE (pair_radius(nkind, nkind))
869 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, cell=cell, &
870 distribution_2d=distribution_2d, local_particles=distribution_1d, &
871 particle_set=particle_set, molecule_set=molecule_set)
874 IF (
PRESENT(ext_dist2d)) distribution_2d => ext_dist2d
876 ALLOCATE (atom2d(nkind))
877 CALL atom2d_build(atom2d, distribution_1d, distribution_2d, atomic_kind_set, &
878 molecule_set, .false., particle_set)
882 operator_type=
"ABC", atomb_to_keep=excited_atoms, &
883 nlname=
"XAS_TDP_3c_nl")
886 operator_type=
"ABC", nlname=
"XAS_TDP_3c_nl")
907 basis_set_c, qs_env, only_bc_same_center)
911 POINTER :: ab_list, ac_list
914 LOGICAL,
INTENT(IN),
OPTIONAL :: only_bc_same_center
916 CHARACTER(len=*),
PARAMETER :: routinen =
'get_opt_3c_dist2d'
918 INTEGER :: handle, i, iatom, ikind, ip, jatom, &
919 jkind, kkind, mypcol, myprow, n, &
920 natom, nkind, npcol, nprow, nsgfa, &
922 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: nparticle_local_col, nparticle_local_row
923 INTEGER,
DIMENSION(:, :),
POINTER :: col_dist, row_dist
924 LOGICAL :: my_sort_bc
925 REAL(
dp) :: cost, rab(3), rac(3), rbc(3)
926 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: col_cost, col_proc_cost, row_cost, &
928 TYPE(
cp_1d_i_p_type),
DIMENSION(:),
POINTER :: local_particle_col, local_particle_row
932 DIMENSION(:),
POINTER :: ab_iter, ac_iter
934 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
936 NULLIFY (para_env, col_dist, row_dist, blacs_env, qs_kind_set, particle_set)
937 NULLIFY (local_particle_col, local_particle_row, ab_iter, ac_iter)
939 CALL timeset(routinen, handle)
946 IF (
PRESENT(only_bc_same_center)) my_sort_bc = only_bc_same_center
948 CALL get_qs_env(qs_env, natom=natom, para_env=para_env, blacs_env=blacs_env, &
949 qs_kind_set=qs_kind_set, particle_set=particle_set, nkind=nkind)
951 myprow = blacs_env%mepos(1) + 1
952 mypcol = blacs_env%mepos(2) + 1
953 nprow = blacs_env%num_pe(1)
954 npcol = blacs_env%num_pe(2)
956 ALLOCATE (col_cost(natom), row_cost(natom))
957 col_cost = 0.0_dp; row_cost = 0.0_dp
959 ALLOCATE (row_dist(natom, 2), col_dist(natom, 2))
960 row_dist = 1; col_dist = 1
965 CALL get_iterator_info(ab_iter, ikind=ikind, jkind=jkind, iatom=iatom, jatom=jatom, r=rab)
975 rbc(:) = rac(:) - rab(:)
976 IF (.NOT. (all(abs(rbc) <= 1.0e-8_dp) .OR. all(abs(rac) <= 1.0e-8_dp))) cycle
981 nsgfa = basis_set_a(ikind)%gto_basis_set%nsgf
982 nsgfb = basis_set_b(jkind)%gto_basis_set%nsgf
983 nsgfc = basis_set_c(kkind)%gto_basis_set%nsgf
985 cost = real(nsgfa*nsgfb*nsgfc,
dp)
987 row_cost(iatom) = row_cost(iatom) + cost
988 col_cost(jatom) = col_cost(jatom) + cost
996 CALL para_env%sum(row_cost)
997 CALL para_env%sum(col_cost)
1000 ALLOCATE (col_proc_cost(npcol), row_proc_cost(nprow))
1001 col_proc_cost = 0.0_dp; row_proc_cost = 0.0_dp
1003 iatom = maxloc(row_cost, 1)
1004 ip = minloc(row_proc_cost, 1)
1005 row_proc_cost(ip) = row_proc_cost(ip) + row_cost(iatom)
1006 row_dist(iatom, 1) = ip
1007 row_cost(iatom) = 0.0_dp
1009 iatom = maxloc(col_cost, 1)
1010 ip = minloc(col_proc_cost, 1)
1011 col_proc_cost(ip) = col_proc_cost(ip) + col_cost(iatom)
1012 col_dist(iatom, 1) = ip
1013 col_cost(iatom) = 0.0_dp
1017 ALLOCATE (local_particle_col(nkind), local_particle_row(nkind))
1018 ALLOCATE (nparticle_local_row(nkind), nparticle_local_col(nkind))
1019 nparticle_local_row = 0; nparticle_local_col = 0
1022 ikind = particle_set(iatom)%atomic_kind%kind_number
1024 IF (row_dist(iatom, 1) == myprow) nparticle_local_row(ikind) = nparticle_local_row(ikind) + 1
1025 IF (col_dist(iatom, 1) == mypcol) nparticle_local_col(ikind) = nparticle_local_col(ikind) + 1
1029 n = nparticle_local_row(ikind)
1030 ALLOCATE (local_particle_row(ikind)%array(n))
1032 n = nparticle_local_col(ikind)
1033 ALLOCATE (local_particle_col(ikind)%array(n))
1036 nparticle_local_row = 0; nparticle_local_col = 0
1038 ikind = particle_set(iatom)%atomic_kind%kind_number
1040 IF (row_dist(iatom, 1) == myprow)
THEN
1041 nparticle_local_row(ikind) = nparticle_local_row(ikind) + 1
1042 local_particle_row(ikind)%array(nparticle_local_row(ikind)) = iatom
1044 IF (col_dist(iatom, 1) == mypcol)
THEN
1045 nparticle_local_col(ikind) = nparticle_local_col(ikind) + 1
1046 local_particle_col(ikind)%array(nparticle_local_col(ikind)) = iatom
1051 row_dist(:, 1) = row_dist(:, 1) - 1
1052 col_dist(:, 1) = col_dist(:, 1) - 1
1054 col_distribution_ptr=col_dist, local_rows_ptr=local_particle_row, &
1055 local_cols_ptr=local_particle_col, blacs_env=blacs_env)
1057 CALL timestop(handle)
1073 INTEGER,
DIMENSION(:),
INTENT(IN) :: ex_atoms
1078 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_ri_3c_exchange'
1080 INTEGER :: handle, natom, nkind
1081 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: blk_size_orb, blk_size_ri
1086 POINTER :: ab_list, ac_list
1088 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1090 NULLIFY (basis_set_ri, basis_set_orb, ac_list, ab_list, qs_kind_set, para_env, particle_set)
1092 CALL timeset(routinen, handle)
1095 CALL get_qs_env(qs_env, nkind=nkind, qs_kind_set=qs_kind_set, para_env=para_env, &
1096 natom=natom, particle_set=particle_set)
1099 ALLOCATE (basis_set_ri(nkind))
1100 ALLOCATE (basis_set_orb(nkind))
1107 xas_tdp_control%ri_m_potential%potential_type, qs_env, &
1108 excited_atoms=ex_atoms, x_range=xas_tdp_control%ri_m_potential%cutoff_radius)
1110 CALL get_opt_3c_dist2d(xas_tdp_env%opt_dist2d_ex, ab_list, ac_list, basis_set_orb, &
1111 basis_set_orb, basis_set_ri, qs_env)
1117 ext_dist2d=xas_tdp_env%opt_dist2d_ex)
1119 xas_tdp_control%ri_m_potential%potential_type, qs_env, &
1120 excited_atoms=ex_atoms, x_range=xas_tdp_control%ri_m_potential%cutoff_radius, &
1121 ext_dist2d=xas_tdp_env%opt_dist2d_ex)
1124 ALLOCATE (blk_size_orb(natom), blk_size_ri(natom))
1126 CALL get_particle_set(particle_set, qs_kind_set, nsgf=blk_size_orb, basis=basis_set_orb)
1127 CALL get_particle_set(particle_set, qs_kind_set, nsgf=blk_size_ri, basis=basis_set_ri)
1129 ALLOCATE (xas_tdp_env%ri_3c_ex)
1130 CALL create_pqx_tensor(xas_tdp_env%ri_3c_ex, ab_list, ac_list, opt_dbcsr_dist, blk_size_orb, &
1131 blk_size_orb, blk_size_ri)
1132 CALL fill_pqx_tensor(xas_tdp_env%ri_3c_ex, ab_list, ac_list, basis_set_orb, basis_set_orb, &
1133 basis_set_ri, xas_tdp_control%ri_m_potential, qs_env, &
1134 eps_screen=xas_tdp_control%eps_screen)
1140 DEALLOCATE (basis_set_ri, basis_set_orb)
1144 CALL para_env%sync()
1146 CALL timestop(handle)
1163 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_ri_3c_coulomb'
1165 INTEGER :: handle, natom, nkind
1166 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: blk_size_orb, blk_size_ri
1172 POINTER :: ab_list, ac_list
1174 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1176 NULLIFY (basis_set_ri, basis_set_orb, ac_list, ab_list, qs_kind_set, para_env, particle_set)
1178 CALL timeset(routinen, handle)
1181 CALL get_qs_env(qs_env, nkind=nkind, qs_kind_set=qs_kind_set, para_env=para_env, &
1182 natom=natom, particle_set=particle_set)
1185 ALLOCATE (basis_set_ri(nkind))
1186 ALLOCATE (basis_set_orb(nkind))
1192 excited_atoms=xas_tdp_env%ex_atom_indices)
1194 qs_env, excited_atoms=xas_tdp_env%ex_atom_indices)
1195 CALL get_opt_3c_dist2d(xas_tdp_env%opt_dist2d_coul, ab_list, ac_list, basis_set_orb, &
1196 basis_set_orb, basis_set_ri, qs_env, only_bc_same_center=.true.)
1204 excited_atoms=xas_tdp_env%ex_atom_indices, &
1205 ext_dist2d=xas_tdp_env%opt_dist2d_coul)
1210 qs_env, excited_atoms=xas_tdp_env%ex_atom_indices, &
1211 ext_dist2d=xas_tdp_env%opt_dist2d_coul)
1214 ALLOCATE (blk_size_orb(natom), blk_size_ri(natom))
1216 CALL get_particle_set(particle_set, qs_kind_set, nsgf=blk_size_orb, basis=basis_set_orb)
1217 CALL get_particle_set(particle_set, qs_kind_set, nsgf=blk_size_ri, basis=basis_set_ri)
1220 ALLOCATE (xas_tdp_env%ri_3c_coul)
1221 CALL create_pqx_tensor(xas_tdp_env%ri_3c_coul, ab_list, ac_list, opt_dbcsr_dist, blk_size_orb, &
1222 blk_size_orb, blk_size_ri, only_bc_same_center=.true.)
1223 CALL fill_pqx_tensor(xas_tdp_env%ri_3c_coul, ab_list, ac_list, basis_set_orb, basis_set_orb, &
1224 basis_set_ri, pot, qs_env, only_bc_same_center=.true.)
1230 DEALLOCATE (basis_set_ri, basis_set_orb)
1234 CALL para_env%sync()
1236 CALL timestop(handle)
1255 INTEGER,
INTENT(IN) :: ex_kind
1260 INTEGER :: egfp, egfq, maxl, ncop, ncoq, nset, &
1261 nsgf, pset, qset, sgfp, sgfq, unit_id
1262 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf_set, nsgf_set
1263 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgf
1265 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: metric, pq, work
1266 REAL(
dp),
DIMENSION(:, :),
POINTER :: rpgf, sphi, zet
1270 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1272 NULLIFY (ri_basis, qs_kind_set, para_env, lmin, lmax, npgf_set, zet, rpgf, first_sgf)
1273 NULLIFY (sphi, nsgf_set)
1276 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, para_env=para_env)
1277 IF (
ASSOCIATED(xas_tdp_env%ri_inv_ex))
THEN
1278 DEALLOCATE (xas_tdp_env%ri_inv_ex)
1282 CALL get_qs_kind(qs_kind_set(ex_kind), basis_set=ri_basis, basis_type=
"RI_XAS")
1283 CALL get_gto_basis_set(ri_basis, nsgf=nsgf, maxl=maxl, npgf=npgf_set, lmin=lmin, &
1284 lmax=lmax, zet=zet, pgf_radius=rpgf, first_sgf=first_sgf, &
1285 nsgf_set=nsgf_set, sphi=sphi, nset=nset)
1286 ALLOCATE (metric(nsgf, nsgf))
1299 IF (para_env%mepos == 0)
THEN
1300 CALL open_file(unit_number=unit_id, file_name=xas_tdp_control%ri_m_potential%filename)
1302 CALL init(2*maxl + 1, unit_id, para_env%mepos, para_env)
1303 IF (para_env%mepos == 0)
THEN
1311 ncop = npgf_set(pset)*
ncoset(lmax(pset))
1312 sgfp = first_sgf(1, pset)
1313 egfp = sgfp + nsgf_set(pset) - 1
1316 ncoq = npgf_set(qset)*
ncoset(lmax(qset))
1317 sgfq = first_sgf(1, qset)
1318 egfq = sgfq + nsgf_set(qset) - 1
1320 ALLOCATE (work(ncop, ncoq))
1323 CALL eri_2center(work, lmin(pset), lmax(pset), npgf_set(pset), zet(:, pset), rpgf(:, pset), &
1324 r, lmin(qset), lmax(qset), npgf_set(qset), zet(:, qset), rpgf(:, qset), &
1325 r, 0.0_dp, lib, xas_tdp_control%ri_m_potential)
1327 CALL ab_contract(metric(sgfp:egfp, sgfq:egfq), work, sphi(:, sgfp:), sphi(:, sgfq:), &
1328 ncop, ncoq, nsgf_set(pset), nsgf_set(qset))
1337 IF (.NOT. xas_tdp_control%do_ri_metric)
THEN
1340 ALLOCATE (xas_tdp_env%ri_inv_ex(nsgf, nsgf))
1341 xas_tdp_env%ri_inv_ex(:, :) = metric(:, :)
1351 IF (para_env%mepos == 0)
THEN
1352 CALL open_file(unit_number=unit_id, file_name=xas_tdp_control%x_potential%filename)
1354 CALL init(2*maxl + 1, unit_id, para_env%mepos, para_env)
1355 IF (para_env%mepos == 0)
THEN
1362 ALLOCATE (pq(nsgf, nsgf))
1366 ncop = npgf_set(pset)*
ncoset(lmax(pset))
1367 sgfp = first_sgf(1, pset)
1368 egfp = sgfp + nsgf_set(pset) - 1
1371 ncoq = npgf_set(qset)*
ncoset(lmax(qset))
1372 sgfq = first_sgf(1, qset)
1373 egfq = sgfq + nsgf_set(qset) - 1
1375 ALLOCATE (work(ncop, ncoq))
1378 CALL eri_2center(work, lmin(pset), lmax(pset), npgf_set(pset), zet(:, pset), rpgf(:, pset), &
1379 r, lmin(qset), lmax(qset), npgf_set(qset), zet(:, qset), rpgf(:, qset), &
1380 r, 0.0_dp, lib, xas_tdp_control%x_potential)
1382 CALL ab_contract(pq(sgfp:egfp, sgfq:egfq), work, sphi(:, sgfp:), sphi(:, sgfq:), &
1383 ncop, ncoq, nsgf_set(pset), nsgf_set(qset))
1390 ALLOCATE (xas_tdp_env%ri_inv_ex(nsgf, nsgf))
1391 xas_tdp_env%ri_inv_ex = 0.0_dp
1393 CALL dgemm(
'N',
'N', nsgf, nsgf, nsgf, 1.0_dp, metric, nsgf, pq, nsgf, &
1394 0.0_dp, xas_tdp_env%ri_inv_ex, nsgf)
1395 CALL dgemm(
'N',
'N', nsgf, nsgf, nsgf, 1.0_dp, xas_tdp_env%ri_inv_ex, nsgf, metric, nsgf, &
1397 xas_tdp_env%ri_inv_ex(:, :) = pq(:, :)
1414 INTEGER,
INTENT(IN) :: ex_kind
1421 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1423 NULLIFY (ri_basis, qs_kind_set)
1426 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
1427 IF (
ASSOCIATED(xas_tdp_env%ri_inv_coul))
THEN
1428 DEALLOCATE (xas_tdp_env%ri_inv_coul)
1432 CALL get_qs_kind(qs_kind_set(ex_kind), basis_set=ri_basis, basis_type=
"RI_XAS")
1434 ALLOCATE (xas_tdp_env%ri_inv_coul(nsgf, nsgf))
1435 xas_tdp_env%ri_inv_coul = 0.0_dp
1437 IF (.NOT. xas_tdp_control%is_periodic)
THEN
1439 rab=[0.0_dp, 0.0_dp, 0.0_dp], fba=ri_basis, fbb=ri_basis, &
1440 calculate_forces=.false.)
1441 cpassert(
ASSOCIATED(xas_tdp_control))
1443 CALL periodic_ri_coulomb2(xas_tdp_env%ri_inv_coul, ri_basis, qs_env)
1457 SUBROUTINE periodic_ri_coulomb2(ri_coul2, ri_basis, qs_env)
1459 REAL(
dp),
DIMENSION(:, :),
INTENT(INOUT) :: ri_coul2
1463 INTEGER :: maxco, ncop, ncoq, nset, op, oq, ppgf, &
1464 pset, qpgf, qset, sgfp, sgfq
1465 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf, nsgf
1466 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgf
1468 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: hpq
1469 REAL(
dp),
DIMENSION(:, :),
POINTER :: sphi, zet
1473 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1475 NULLIFY (cell, qs_kind_set, lmin, lmax, nsgf, npgf, zet, sphi, first_sgf)
1480 CALL get_qs_env(qs_env, cell=cell, qs_kind_set=qs_kind_set, para_env=para_env)
1482 CALL eri_mme_init(mme_param%par, n_minimax=20, cutoff=300.0_dp, do_calib_cutoff=.true., &
1483 cutoff_min=10.0_dp, cutoff_max=10000.0_dp, cutoff_eps=0.01_dp, &
1484 cutoff_delta=0.9_dp, sum_precision=1.0e-12_dp, debug=.false., &
1485 debug_delta=1.0e-6_dp, debug_nsum=1000000, unit_nr=0, print_calib=.false., &
1486 do_error_est=.false.)
1487 mme_param%do_calib = .true.
1491 CALL get_gto_basis_set(ri_basis, lmax=lmax, npgf=npgf, zet=zet, lmin=lmin, nset=nset, &
1492 nsgf_set=nsgf, sphi=sphi, first_sgf=first_sgf, maxco=maxco)
1495 ALLOCATE (hpq(nset*maxco, nset*maxco))
1499 ncop = npgf(pset)*
ncoset(lmax(pset))
1500 sgfp = first_sgf(1, pset)
1503 ncoq = npgf(qset)*
ncoset(lmax(qset))
1504 sgfq = first_sgf(1, qset)
1506 DO ppgf = 1, npgf(pset)
1507 op = (pset - 1)*maxco + (ppgf - 1)*
ncoset(lmax(pset))
1508 DO qpgf = 1, npgf(qset)
1509 oq = (qset - 1)*maxco + (qpgf - 1)*
ncoset(lmax(qset))
1512 lmax(qset), zet(ppgf, pset), zet(qpgf, qset), r, hpq, &
1519 op = (pset - 1)*maxco + 1
1520 oq = (qset - 1)*maxco + 1
1522 CALL ab_contract(ri_coul2(sgfp:sgfp + nsgf(pset) - 1, sgfq:sgfq + nsgf(qset) - 1), &
1523 hpq(op:op + ncop - 1, oq:oq + ncoq - 1), sphi(:, sgfp:), sphi(:, sgfq:), &
1524 ncop, ncoq, nsgf(pset), nsgf(qset))
1532 END SUBROUTINE periodic_ri_coulomb2
static int imax(int x, int y)
Returns the larger of two given integers (missing from the C standard)
static void dgemm(const char transa, const char transb, const int m, const int n, const int k, const double alpha, const double *a, const int lda, const double *b, const int ldb, const double beta, double *c, const int ldc)
Convenient wrapper to hide Fortran nature of dgemm_, swapping a and b.
Contraction of integrals over primitive Cartesian Gaussians based on the contraction matrix sphi whic...
subroutine, public abc_contract_xsmm(abcint, sabc, sphi_a, sphi_b, sphi_c, ncoa, ncob, ncoc, nsgfa, nsgfb, nsgfc, cpp_buffer, ccp_buffer, prefac, pstfac)
3-center contraction routine from primitive cartesian Gaussians to spherical Gaussian functions using...
subroutine, public ab_contract(abint, sab, sphi_a, sphi_b, ncoa, ncob, nsgfa, nsgfb)
contract overlap integrals (a,b) and transfer to spherical Gaussians
Define the atomic kind types and their sub types.
subroutine, public get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius, npgf_seg_sum, ccon)
...
Handles all functions related to the CELL.
constants for the different operators of the 2c-integrals
integer, parameter, public operator_coulomb
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
methods related to the blacs parallel environment
subroutine, public dbcsr_distribution_release(dist)
...
subroutine, public dbcsr_distribution_get(dist, row_dist, col_dist, nrows, ncols, has_threads, group, mynode, numnodes, nprows, npcols, myprow, mypcol, pgrid, subgroups_defined, prow_group, pcol_group)
...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_dist2d_to_dist(dist2d, dist)
Creates a DBCSR distribution from a distribution_2d.
Interface to Minimax-Ewald method for periodic ERI's to be used in CP2K.
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
This is the start of a dbt_api, all publically needed functions are exported here....
stores a lists of integer that are local to a processor. The idea is that these integers represent ob...
stores a mapping of 2D info (e.g. matrix) on a 2D processor distribution (i.e. blacs grid) where cpus...
subroutine, public distribution_2d_create(distribution_2d, blacs_env, local_rows_ptr, n_local_rows, local_cols_ptr, row_distribution_ptr, col_distribution_ptr, n_local_cols, n_row_distribution, n_col_distribution)
initializes the distribution_2d
Minimax-Ewald (MME) method for calculating 2-center and 3-center electron repulsion integrals (ERI) o...
subroutine, public eri_mme_2c_integrate(param, la_min, la_max, lb_min, lb_max, zeta, zetb, rab, hab, o1, o2, g_count, r_count, normalize, potential, pot_par)
Low-level integration routine for 2-center ERIs.
Types and initialization / release routines for Minimax-Ewald method for electron repulsion integrals...
subroutine, public eri_mme_release(param)
...
subroutine, public eri_mme_init(param, n_minimax, cutoff, do_calib_cutoff, do_error_est, cutoff_min, cutoff_max, cutoff_eps, cutoff_delta, sum_precision, debug, debug_delta, debug_nsum, unit_nr, print_calib)
...
Calculation of the incomplete Gamma function F_n(t) for multi-center integrals over Cartesian Gaussia...
subroutine, public init_md_ftable(nmax)
Initialize a table of F_n(t) values in the range 0 <= t <= 12 with a stepsize of 0....
Calculation of contracted, spherical Gaussian integrals using the (OS) integral scheme....
subroutine, public int_operators_r12_ab_os(r12_operator, vab, dvab, rab, fba, fbb, omega, r_cutoff, calculate_forces)
Calcululates the two-center integrals of the type (a|O(r12)|b) using the OS scheme.
Defines the basic variable types.
integer, parameter, public dp
2- and 3-center electron repulsion integral routines based on libint2 Currently available operators: ...
subroutine, public eri_2center(int_ab, la_min, la_max, npgfa, zeta, rpgfa, ra, lb_min, lb_max, npgfb, zetb, rpgfb, rb, dab, lib, potential_parameter)
Computes the 2-center electron repulsion integrals (a|b) for a given set of cartesian gaussian orbita...
subroutine, public eri_3center(int_abc, la_min, la_max, npgfa, zeta, rpgfa, ra, lb_min, lb_max, npgfb, zetb, rpgfb, rb, lc_min, lc_max, npgfc, zetc, rpgfc, rc, dab, dac, dbc, lib, potential_parameter, int_abc_ext)
Computes the 3-center electron repulsion integrals (ab|c) for a given set of cartesian gaussian orbit...
real(kind=dp), parameter, public cutoff_screen_factor
Interface to the Libint-Library or a c++ wrapper.
subroutine, public cp_libint_init_2eri(lib, max_am)
subroutine, public cp_libint_init_3eri(lib, max_am)
subroutine, public cp_libint_cleanup_3eri(lib)
subroutine, public cp_libint_set_contrdepth(lib, contrdepth)
subroutine, public cp_libint_cleanup_2eri(lib)
Collection of simple mathematical functions and subroutines.
subroutine, public invmat_symm(a, potrf, uplo)
returns inverse of real symmetric, positive definite matrix
Interface to the message passing library MPI.
Define the data structure for the molecule information.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public ncoset
Define methods related to particle_type.
subroutine, public get_particle_set(particle_set, qs_kind_set, first_sgf, last_sgf, nsgf, nmao, basis, ncgf)
Get the components of a particle set.
Define the data structure for the particle information.
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, 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.
Some utility functions for the calculation of integrals.
subroutine, public basis_set_list_setup(basis_set_list, basis_type, qs_kind_set)
Set up an easy accessible list of the basis sets for all kinds.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
Define the neighbor list data types and the corresponding functionality.
subroutine, public release_neighbor_list_sets(nlists)
releases an array of neighbor_list_sets
subroutine, public neighbor_list_iterator_create(iterator_set, nl, search, nthread)
Neighbor list iterator functions.
subroutine, public nl_set_sub_iterator(iterator_set, ikind, jkind, iatom, mepos)
...
subroutine, public neighbor_list_iterator_release(iterator_set)
...
subroutine, public get_neighbor_list_set_p(neighbor_list_sets, nlist, symmetric)
Return the components of the first neighbor list set.
integer function, public neighbor_list_iterate(iterator_set, mepos)
...
subroutine, public get_iterator_info(iterator_set, mepos, ikind, jkind, nkind, ilist, nlist, inode, nnode, iatom, jatom, r, cell)
...
Generate the atomic neighbor lists.
subroutine, public atom2d_cleanup(atom2d)
free the internals of atom2d
subroutine, public pair_radius_setup(present_a, present_b, radius_a, radius_b, pair_radius, prmin)
...
subroutine, public build_neighbor_lists(ab_list, particle_set, atom, cell, pair_radius, subcells, mic, symmetric, molecular, subset_of_mol, current_subset, operator_type, nlname, atomb_to_keep)
Build simple pair neighbor lists.
subroutine, public atom2d_build(atom2d, distribution_1d, distribution_2d, atomic_kind_set, molecule_set, molecule_only, particle_set)
Build some distribution structure of atoms, refactored from build_qs_neighbor_lists.
3-center overlap type integrals containers
subroutine, public get_o3c_iterator_info(o3c_iterator, mepos, iatom, jatom, katom, ikind, jkind, kkind, rij, rik, cellj, cellk, integral, tvec, force_i, force_j, force_k)
...
subroutine, public o3c_iterator_create(o3c, o3c_iterator, nthread)
...
subroutine, public release_o3c_container(o3c_container)
...
subroutine, public o3c_iterator_release(o3c_iterator)
...
integer function, public o3c_iterate(o3c_iterator, mepos)
...
subroutine, public init_o3c_container(o3c, nspin, basis_set_list_a, basis_set_list_b, basis_set_list_c, sab_nl, sac_nl, only_bc_same_center)
...
This module computes the basic integrals for the truncated coulomb operator.
subroutine, public init(nder, iunit, mepos, group)
...
integer function, public get_lmax_init()
Returns the value of nderiv_init so that one can check if opening the potential file is worhtwhile.
3-center integrals machinery for the XAS_TDP method
subroutine, public build_xas_tdp_3c_nl(ac_list, basis_a, basis_c, op_type, qs_env, excited_atoms, x_range, ext_dist2d)
Builds a neighbor lists set taylored for 3-center integral within XAS TDP, such that only excited ato...
subroutine, public compute_ri_coulomb2_int(ex_kind, xas_tdp_env, xas_tdp_control, qs_env)
Computes the two-center Coulomb integral needed for the RI in kernel calculation. Stores the integral...
subroutine, public build_xas_tdp_ovlp_nl(ab_list, basis_a, basis_b, qs_env, excited_atoms, ext_dist2d)
Builds a neighbor lists set for overlaping 2-center S_ab, where b is restricted on a a given list of ...
subroutine, public fill_pqx_tensor(pq_x, ab_nl, ac_nl, basis_set_list_a, basis_set_list_b, basis_set_list_c, potential_parameter, qs_env, only_bc_same_center, eps_screen)
Fills the given 3 dimensional (pq|X) tensor with integrals.
subroutine, public compute_ri_3c_coulomb(xas_tdp_env, qs_env)
Computes the RI Coulomb 3-center integrals (ab|c), where c is from the RI_XAS basis and centered on t...
subroutine, public compute_ri_exchange2_int(ex_kind, xas_tdp_env, xas_tdp_control, qs_env)
Computes the two-center Exchange integral needed for the RI in kernel calculation....
subroutine, public create_pqx_tensor(pq_x, ab_nl, ac_nl, matrix_dist, blk_size_1, blk_size_2, blk_size_3, only_bc_same_center)
Prepares a tensor to hold 3-center integrals (pq|X), where p,q are distributed according to the given...
subroutine, public get_opt_3c_dist2d(opt_3c_dist2d, ab_list, ac_list, basis_set_a, basis_set_b, basis_set_c, qs_env, only_bc_same_center)
Returns an optimized distribution_2d for the given neighbor lists based on an evaluation of the cost ...
subroutine, public compute_ri_3c_exchange(ex_atoms, xas_tdp_env, xas_tdp_control, qs_env)
Computes the RI exchange 3-center integrals (ab|c), where c is from the RI_XAS basis and centered on ...
Define XAS TDP control type and associated create, release, etc subroutines, as well as XAS TDP envir...
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
represent a pointer to a 1d array
represent a pointer to a 2d array
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
structure to store local (to a processor) ordered lists of integers.
distributes pairs on a 2d grid of processors
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.
Type containing control information for TDP XAS calculations.
Type containing informations such as inputs and results for TDP XAS calculations.