37 dbcsr_type_no_symmetry, dbcsr_type_symmetric
42 USE dbt_api,
ONLY: dbt_destroy,&
44 dbt_iterator_blocks_left,&
45 dbt_iterator_next_block,&
133#include "./base/base_uses.f90"
139 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xas_tdp_atom'
165 LOGICAL,
OPTIONAL :: ltddfpt
167 CHARACTER(len=*),
PARAMETER :: routinen =
'init_xas_atom_env'
169 INTEGER :: handle, ikind, natom, nex_atoms, &
170 nex_kinds, nkind, nspins
173 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
175 NULLIFY (qs_kind_set, particle_set)
177 CALL timeset(routinen, handle)
180 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, natom=natom, particle_set=particle_set)
182 nkind =
SIZE(qs_kind_set)
183 nex_kinds = xas_tdp_env%nex_kinds
184 nex_atoms = xas_tdp_env%nex_atoms
185 do_xc = xas_tdp_control%do_xc
186 IF (
PRESENT(ltddfpt))
THEN
187 IF (ltddfpt) do_xc = .false.
189 nspins = 1;
IF (xas_tdp_control%do_uks .OR. xas_tdp_control%do_roks) nspins = 2
191 xas_atom_env%nspins = nspins
192 xas_atom_env%ri_radius = xas_tdp_control%ri_radius
193 ALLOCATE (xas_atom_env%grid_atom_set(nkind))
194 ALLOCATE (xas_atom_env%harmonics_atom_set(nkind))
195 ALLOCATE (xas_atom_env%ri_sphi_so(nkind))
196 ALLOCATE (xas_atom_env%orb_sphi_so(nkind))
198 ALLOCATE (xas_atom_env%gr(nkind))
199 ALLOCATE (xas_atom_env%ga(nkind))
200 ALLOCATE (xas_atom_env%dgr1(nkind))
201 ALLOCATE (xas_atom_env%dgr2(nkind))
202 ALLOCATE (xas_atom_env%dga1(nkind))
203 ALLOCATE (xas_atom_env%dga2(nkind))
206 xas_atom_env%excited_atoms => xas_tdp_env%ex_atom_indices
207 xas_atom_env%excited_kinds => xas_tdp_env%ex_kind_indices
214 NULLIFY (xas_atom_env%orb_sphi_so(ikind)%array, xas_atom_env%ri_sphi_so(ikind)%array)
215 CALL compute_sphi_so(ikind,
"ORB", xas_atom_env%orb_sphi_so(ikind)%array, qs_env)
216 IF (any(xas_atom_env%excited_kinds == ikind))
THEN
217 CALL compute_sphi_so(ikind,
"RI_XAS", xas_atom_env%ri_sphi_so(ikind)%array, qs_env)
222 IF (do_xc .AND. (.NOT. xas_tdp_control%xps_only))
THEN
226 CALL timestop(handle)
242 CHARACTER(len=default_string_length), &
243 DIMENSION(:, :),
POINTER :: grid_info
244 LOGICAL,
INTENT(IN) :: do_xc
247 CHARACTER(LEN=default_string_length) :: kind_name
248 INTEGER :: igrid, ikind, il, iso, iso1, iso2, l1, l1l2, l2, la, lc1, lc2, lcleb, ll, llmax, &
249 lp, m1, m2, max_s_harm, max_s_set, maxl, maxlgto, maxs, mm, mp, na, nr, quadrature, stat
250 REAL(
dp) :: kind_radius
251 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rga
252 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: my_cg
258 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
260 NULLIFY (my_cg, qs_kind_set, tmp_basis, grid_atom, harmonics, qs_control, dft_control)
263 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, dft_control=dft_control)
265 CALL get_qs_kind_set(qs_kind_set, maxlgto=maxlgto, basis_type=
"RI_XAS")
269 qs_control => dft_control%qs_control
273 max_s_harm =
nsoset(llmax)
274 max_s_set =
nsoset(maxlgto)
279 CALL reallocate(my_cg, 1, max_s_set, 1, max_s_set, 1, max_s_harm)
281 ALLOCATE (rga(lcleb, 2))
291 IF (l1 + l2 > llmax)
THEN
298 IF (m1*m2 < 0 .OR. (m1*m2 == 0 .AND. (m1 < 0 .OR. m2 < 0)))
THEN
305 DO lp = mod(l1 + l2, 2), l1l2, 2
307 IF (abs(mp) <= lp)
THEN
309 iso =
nsoset(lp - 1) + lp + 1 + mp
311 iso =
nsoset(lp - 1) + lp + 1 - abs(mp)
313 my_cg(iso1, iso2, iso) = rga(il, 1)
315 IF (mp /= mm .AND. abs(mm) <= lp)
THEN
317 iso =
nsoset(lp - 1) + lp + 1 + mm
319 iso =
nsoset(lp - 1) + lp + 1 - abs(mm)
321 my_cg(iso1, iso2, iso) = rga(il, 2)
333 quadrature = qs_control%gapw_control%quadrature
335 DO ikind = 1,
SIZE(xas_atom_env%grid_atom_set)
338 NULLIFY (xas_atom_env%grid_atom_set(ikind)%grid_atom)
339 NULLIFY (xas_atom_env%harmonics_atom_set(ikind)%harmonics_atom)
343 NULLIFY (grid_atom, harmonics)
344 grid_atom => xas_atom_env%grid_atom_set(ikind)%grid_atom
345 harmonics => xas_atom_env%harmonics_atom_set(ikind)%harmonics_atom
348 CALL get_qs_kind(qs_kind_set(ikind), ngrid_rad=nr, ngrid_ang=na, name=kind_name)
351 IF (any(grid_info == kind_name))
THEN
352 DO igrid = 1,
SIZE(grid_info, 1)
353 IF (grid_info(igrid, 1) == kind_name)
THEN
356 READ (grid_info(igrid, 2), *, iostat=stat) na
357 IF (stat .NE. 0) cpabort(
"The 'na' value for the GRID keyword must be an integer")
358 READ (grid_info(igrid, 3), *, iostat=stat) nr
359 IF (stat .NE. 0) cpabort(
"The 'nr' value for the GRID keyword must be an integer")
363 ELSE IF (do_xc .AND. any(xas_atom_env%excited_kinds == ikind))
THEN
365 cpwarn(
"The default (and possibly small) GAPW grid is being used for one excited KIND")
371 grid_atom%ng_sphere = na
375 IF (any(xas_atom_env%excited_kinds == ikind) .AND. do_xc)
THEN
376 CALL get_qs_kind(qs_kind_set(ikind), basis_set=tmp_basis, basis_type=
"RI_XAS")
378 CALL get_qs_kind(qs_kind_set(ikind), basis_set=tmp_basis, basis_type=
"ORB")
380 CALL get_gto_basis_set(gto_basis_set=tmp_basis, maxl=maxl, kind_radius=kind_radius)
387 my_cg, na, llmax, maxs, max_s_harm, ll, grid_atom%wa, &
388 grid_atom%azi, grid_atom%pol)
389 CALL get_maxl_cg(harmonics, tmp_basis, llmax, max_s_harm)
408 REAL(
dp),
INTENT(IN) :: max_radius
410 INTEGER :: first_ir, ir, llmax_p1, na, new_nr, nr
413 na = grid_atom%ng_sphere
414 llmax_p1 =
SIZE(grid_atom%rad2l, 2) - 1
418 IF (grid_atom%rad(ir) < max_radius)
THEN
423 new_nr = nr - first_ir + 1
426 grid_atom%nr = new_nr
428 grid_atom%rad(1:new_nr) = grid_atom%rad(first_ir:nr)
429 grid_atom%rad2(1:new_nr) = grid_atom%rad2(first_ir:nr)
430 grid_atom%wr(1:new_nr) = grid_atom%wr(first_ir:nr)
431 grid_atom%weight(:, 1:new_nr) = grid_atom%weight(:, first_ir:nr)
432 grid_atom%rad2l(1:new_nr, :) = grid_atom%rad2l(first_ir:nr, :)
433 grid_atom%oorad2l(1:new_nr, :) = grid_atom%oorad2l(first_ir:nr, :)
438 CALL reallocate(grid_atom%weight, 1, na, 1, new_nr)
439 CALL reallocate(grid_atom%rad2l, 1, new_nr, 0, llmax_p1)
440 CALL reallocate(grid_atom%oorad2l, 1, new_nr, 0, llmax_p1)
454 INTEGER,
INTENT(IN) :: ikind
455 CHARACTER(len=*),
INTENT(IN) :: basis_type
456 REAL(
dp),
DIMENSION(:, :),
POINTER :: sphi_so
459 INTEGER :: ico, ipgf, iset, iso, l, lx, ly, lz, &
460 maxso, nset, sgfi, start_c, start_s
461 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf, nsgf_set
462 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgf
464 REAL(
dp),
DIMENSION(:, :),
POINTER :: sphi
466 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
468 NULLIFY (basis, lmax, lmin, npgf, nsgf_set, qs_kind_set, first_sgf, sphi)
470 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
471 CALL get_qs_kind(qs_kind_set(ikind), basis_set=basis, basis_type=basis_type)
472 CALL get_gto_basis_set(basis, lmax=lmax, nset=nset, npgf=npgf, maxso=maxso, lmin=lmin, &
473 nsgf_set=nsgf_set, sphi=sphi, first_sgf=first_sgf)
475 ALLOCATE (sphi_so(maxso, sum(nsgf_set)))
479 sgfi = first_sgf(1, iset)
480 DO ipgf = 1, npgf(iset)
481 start_s = (ipgf - 1)*
nsoset(lmax(iset))
482 start_c = (ipgf - 1)*
ncoset(lmax(iset))
483 DO l = lmin(iset), lmax(iset)
492 sphi_so(start_s +
nsoset(l - 1) + iso, sgfi:sgfi + nsgf_set(iset) - 1) = &
493 sphi_so(start_s +
nsoset(l - 1) + iso, sgfi:sgfi + nsgf_set(iset) - 1) + &
494 factor*sphi(start_c +
ncoset(l - 1) + ico, sgfi:sgfi + nsgf_set(iset) - 1)
515 SUBROUTINE find_neighbors(base_atoms, mat_s, radius, qs_env, all_neighbors, neighbor_set)
517 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: base_atoms
521 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: all_neighbors
523 POINTER :: neighbor_set
525 INTEGER :: i, iat, ibase, iblk, jblk, mepos, natom, &
527 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: blk_to_base, inb, who_is_there
528 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: n_neighbors
529 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: is_base_atom
530 REAL(
dp) :: dist2, rad2, ri(3), rij(3), rj(3)
537 NULLIFY (particle_set, para_env, my_neighbor_set, cell)
540 CALL get_qs_env(qs_env, para_env=para_env, natom=natom, particle_set=particle_set, cell=cell)
541 mepos = para_env%mepos
542 nbase =
SIZE(base_atoms)
544 ALLOCATE (my_neighbor_set(nbase))
547 ALLOCATE (blk_to_base(natom), is_base_atom(natom))
548 blk_to_base = 0; is_base_atom = .false.
550 blk_to_base(base_atoms(ibase)) = ibase
551 is_base_atom(base_atoms(ibase)) = .true.
555 ALLOCATE (n_neighbors(nbase, 0:para_env%num_pe - 1))
564 IF (iblk == jblk) cycle
567 ri =
pbc(particle_set(iblk)%r, cell)
568 rj =
pbc(particle_set(jblk)%r, cell)
569 rij =
pbc(ri, rj, cell)
571 IF (dist2 > rad2) cycle
573 IF (is_base_atom(iblk))
THEN
574 ibase = blk_to_base(iblk)
575 n_neighbors(ibase, mepos) = n_neighbors(ibase, mepos) + 1
577 IF (is_base_atom(jblk))
THEN
578 ibase = blk_to_base(jblk)
579 n_neighbors(ibase, mepos) = n_neighbors(ibase, mepos) + 1
584 CALL para_env%sum(n_neighbors)
588 ALLOCATE (my_neighbor_set(ibase)%array(sum(n_neighbors(ibase, :))))
589 my_neighbor_set(ibase)%array = 0
594 ALLOCATE (inb(nbase))
599 IF (iblk == jblk) cycle
602 ri =
pbc(particle_set(iblk)%r, cell)
603 rj =
pbc(particle_set(jblk)%r, cell)
604 rij =
pbc(ri, rj, cell)
606 IF (dist2 > rad2) cycle
608 IF (is_base_atom(iblk))
THEN
609 ibase = blk_to_base(iblk)
610 my_neighbor_set(ibase)%array(sum(n_neighbors(ibase, 0:mepos - 1)) + inb(ibase)) = jblk
611 inb(ibase) = inb(ibase) + 1
613 IF (is_base_atom(jblk))
THEN
614 ibase = blk_to_base(jblk)
615 my_neighbor_set(ibase)%array(sum(n_neighbors(ibase, 0:mepos - 1)) + inb(ibase)) = iblk
616 inb(ibase) = inb(ibase) + 1
624 CALL para_env%sum(my_neighbor_set(ibase)%array)
628 IF (
PRESENT(all_neighbors))
THEN
629 ALLOCATE (who_is_there(natom))
633 who_is_there(base_atoms(ibase)) = 1
634 DO nb = 1,
SIZE(my_neighbor_set(ibase)%array)
635 who_is_there(my_neighbor_set(ibase)%array(nb)) = 1
639 ALLOCATE (all_neighbors(natom))
642 IF (who_is_there(iat) == 1)
THEN
644 all_neighbors(i) = iat
651 IF (
PRESENT(neighbor_set))
THEN
652 neighbor_set => my_neighbor_set
655 DEALLOCATE (my_neighbor_set(ibase)%array)
657 DEALLOCATE (my_neighbor_set)
660 END SUBROUTINE find_neighbors
674 SUBROUTINE get_exat_ri_sinv(ri_sinv, whole_s, neighbors, idx_to_nb, basis_set_ri, qs_env)
677 INTEGER,
DIMENSION(:),
INTENT(IN) :: neighbors, idx_to_nb
681 CHARACTER(len=*),
PARAMETER :: routinen =
'get_exat_ri_sinv'
683 INTEGER :: blk, dest, group_handle, handle, iat, &
684 ikind, inb, ir, is, jat, jnb, natom, &
685 nnb, npcols, nprows, source, tag
686 INTEGER,
DIMENSION(:),
POINTER :: col_dist, nsgf, row_dist
687 INTEGER,
DIMENSION(:, :),
POINTER :: pgrid
688 LOGICAL :: found_risinv, found_whole
689 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: is_neighbor
690 REAL(
dp) :: ri(3), rij(3), rj(3)
691 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: radius
692 REAL(
dp),
DIMENSION(:, :),
POINTER :: block_risinv, block_whole
694 TYPE(
cp_2d_r_p_type),
ALLOCATABLE,
DIMENSION(:) :: recv_buff, send_buff
704 NULLIFY (pgrid, dbcsr_dist, row_dist, col_dist, nsgf, particle_set, block_whole, block_risinv)
705 NULLIFY (cell, para_env, blacs_env)
707 CALL timeset(routinen, handle)
709 CALL get_qs_env(qs_env, dbcsr_dist=dbcsr_dist, particle_set=particle_set, natom=natom, &
710 para_env=para_env, blacs_env=blacs_env, cell=cell)
711 nnb =
SIZE(neighbors)
712 ALLOCATE (nsgf(nnb), is_neighbor(natom), radius(nnb))
713 is_neighbor = .false.
716 ikind = particle_set(iat)%atomic_kind%kind_number
717 CALL get_gto_basis_set(basis_set_ri(ikind)%gto_basis_set, nsgf=nsgf(inb), kind_radius=radius(inb))
718 is_neighbor(iat) = .true.
723 CALL group%set_handle(group_handle)
725 ALLOCATE (row_dist(nnb), col_dist(nnb))
727 row_dist(inb) =
modulo(nprows - inb, nprows)
728 col_dist(inb) =
modulo(npcols - inb, npcols)
734 CALL dbcsr_create(matrix=ri_sinv, name=
"RI_SINV", matrix_type=dbcsr_type_symmetric, &
735 dist=sinv_dist, row_blk_size=nsgf, col_blk_size=nsgf)
738 ri =
pbc(particle_set(neighbors(inb))%r, cell)
742 rj =
pbc(particle_set(neighbors(jnb))%r, cell)
743 rij =
pbc(ri, rj, cell)
744 IF (sum(rij**2) > (radius(inb) + radius(jnb))**2) cycle
747 IF (para_env%mepos == blk)
THEN
748 ALLOCATE (block_risinv(nsgf(inb), nsgf(jnb)))
749 block_risinv = 0.0_dp
751 DEALLOCATE (block_risinv)
758 DEALLOCATE (row_dist, col_dist)
762 ALLOCATE (send_buff(nnb**2), recv_buff(nnb**2))
763 ALLOCATE (send_req(nnb**2), recv_req(nnb**2))
774 IF (.NOT. found_whole) cycle
775 IF (.NOT. is_neighbor(iat)) cycle
776 IF (.NOT. is_neighbor(jat)) cycle
783 IF (found_risinv)
THEN
784 CALL dcopy(nsgf(inb)*nsgf(jnb), block_whole, 1, block_risinv, 1)
790 send_buff(is)%array => block_whole
791 tag = natom*inb + jnb
792 CALL group%isend(msgin=send_buff(is)%array, dest=dest, request=send_req(is), tag=tag)
806 IF (.NOT. found_risinv) cycle
813 IF (para_env%mepos == source) cycle
815 tag = natom*inb + jnb
817 recv_buff(ir)%array => block_risinv
818 CALL group%irecv(msgout=recv_buff(ir)%array, source=source, request=recv_req(ir), &
833 IF (found_risinv)
THEN
847 CALL timestop(handle)
849 END SUBROUTINE get_exat_ri_sinv
867 CHARACTER(len=*),
PARAMETER :: routinen =
'calculate_density_coeffs'
869 INTEGER :: exat, handle, i, iat, iatom, iex, inb, &
870 ind(3), ispin, jatom, jnb, katom, &
871 natom, nex, nkind, nnb, nspins, &
873 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: blk_size_orb, blk_size_ri, idx_to_nb, &
875 INTEGER,
DIMENSION(:),
POINTER :: all_ri_atoms
876 LOGICAL :: pmat_found, pmat_foundt, sinv_found, &
877 sinv_foundt, tensor_found, unique
878 REAL(
dp) :: factor, prefac
879 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: work2
880 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: work1
881 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: t_block
882 REAL(
dp),
DIMENSION(:, :),
POINTER :: pmat_block, pmat_blockt, sinv_block, &
886 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: overlap, rho_ao
889 TYPE(dbt_iterator_type) :: iter
890 TYPE(dbt_type) :: pqx
895 POINTER :: ab_list, ac_list, sab_ri
897 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
900 NULLIFY (qs_kind_set, basis_set_ri, basis_set_orb, ac_list, rho, rho_ao, sab_ri, ri_mats)
901 NULLIFY (particle_set, para_env, all_ri_atoms, overlap, pmat_blockt)
902 NULLIFY (blacs_env, pmat_block, ab_list, dbcsr_dist, sinv_block, sinv_blockt)
912 CALL timeset(routinen, handle)
914 CALL get_qs_env(qs_env, nkind=nkind, qs_kind_set=qs_kind_set, rho=rho, &
915 natom=natom, particle_set=particle_set, dbcsr_dist=dbcsr_dist, &
916 para_env=para_env, blacs_env=blacs_env)
917 nspins = xas_atom_env%nspins
918 nex =
SIZE(xas_atom_env%excited_atoms)
922 ALLOCATE (basis_set_ri(nkind))
923 ALLOCATE (basis_set_orb(nkind))
930 ri_mats => overlap(1)%matrix
934 CALL find_neighbors(xas_atom_env%excited_atoms, ri_mats, xas_atom_env%ri_radius, &
935 qs_env, all_neighbors=all_ri_atoms, neighbor_set=xas_atom_env%exat_neighbors)
938 factor = 0.5_dp;
IF (nspins == 2) factor = 1.0_dp
943 ALLOCATE (blk_size_ri(natom))
944 CALL get_particle_set(particle_set, qs_kind_set, nsgf=blk_size_ri, basis=basis_set_ri)
945 ALLOCATE (xas_atom_env%ri_dcoeff(natom, nspins, nex))
949 NULLIFY (xas_atom_env%ri_dcoeff(iat, ispin, iex)%array)
950 IF ((.NOT. any(xas_atom_env%exat_neighbors(iex)%array == iat)) &
951 .AND. (.NOT. xas_atom_env%excited_atoms(iex) == iat)) cycle
952 ALLOCATE (xas_atom_env%ri_dcoeff(iat, ispin, iex)%array(blk_size_ri(iat)))
953 xas_atom_env%ri_dcoeff(iat, ispin, iex)%array = 0.0_dp
959 IF (output_unit > 0)
THEN
960 WRITE (output_unit, fmt=
"(/,T7,A,/,T7,A)") &
961 "Excited atom, natoms in RI_REGION:", &
962 "---------------------------------"
968 ALLOCATE (blk_size_orb(natom))
969 CALL get_particle_set(particle_set, qs_kind_set, nsgf=blk_size_orb, basis=basis_set_orb)
974 exat = xas_atom_env%excited_atoms(iex)
975 nnb = 1 +
SIZE(xas_atom_env%exat_neighbors(iex)%array)
976 ALLOCATE (neighbors(nnb))
978 neighbors(2:nnb) = xas_atom_env%exat_neighbors(iex)%array(:)
982 ALLOCATE (idx_to_nb(natom))
985 idx_to_nb(neighbors(inb)) = inb
988 IF (output_unit > 0)
THEN
989 WRITE (output_unit, fmt=
"(T7,I12,I21)") &
997 qs_env, excited_atoms=neighbors)
1002 CALL create_pqx_tensor(pqx, ab_list, ac_list, dbcsr_dist, blk_size_orb, blk_size_orb, &
1004 CALL fill_pqx_tensor(pqx, ab_list, ac_list, basis_set_orb, basis_set_orb, basis_set_ri, &
1009 CALL get_exat_ri_sinv(ri_sinv, ri_mats, neighbors, idx_to_nb, basis_set_ri, qs_env)
1019 CALL dbt_iterator_start(iter, pqx)
1020 DO WHILE (dbt_iterator_blocks_left(iter))
1021 CALL dbt_iterator_next_block(iter, ind)
1022 CALL dbt_get_block(pqx, ind, t_block, tensor_found)
1027 inb = idx_to_nb(katom)
1031 IF (iatom == jatom) prefac = 1.0_dp
1033 DO ispin = 1, nspins
1036 CALL dbcsr_get_block_p(rho_ao(ispin)%matrix, iatom, jatom, pmat_block, pmat_found)
1037 CALL dbcsr_get_block_p(rho_ao(ispin)%matrix, jatom, iatom, pmat_blockt, pmat_foundt)
1038 IF ((.NOT. pmat_found) .AND. (.NOT. pmat_foundt)) cycle
1040 ALLOCATE (work1(blk_size_ri(katom), 1))
1044 IF (pmat_found)
THEN
1045 DO i = 1, blk_size_ri(katom)
1046 work1(i, 1) = prefac*sum(pmat_block(:, :)*t_block(:, :, i))
1049 DO i = 1, blk_size_ri(katom)
1050 work1(i, 1) = prefac*sum(transpose(pmat_blockt(:, :))*t_block(:, :, i))
1057 ri_at = neighbors(jnb)
1062 IF ((.NOT. sinv_found) .AND. (.NOT. sinv_foundt)) cycle
1065 ALLOCATE (work2(
SIZE(xas_atom_env%ri_dcoeff(ri_at, ispin, iex)%array)))
1068 IF (sinv_found)
THEN
1069 DO i = 1, blk_size_ri(katom)
1070 work2(:) = work2(:) + factor*work1(i, 1)*sinv_block(i, :)
1073 DO i = 1, blk_size_ri(katom)
1074 work2(:) = work2(:) + factor*work1(i, 1)*sinv_blockt(:, i)
1077 DO i = 1,
SIZE(work2)
1079 xas_atom_env%ri_dcoeff(ri_at, ispin, iex)%array(i) = &
1080 xas_atom_env%ri_dcoeff(ri_at, ispin, iex)%array(i) + work2(i)
1089 DEALLOCATE (t_block)
1091 CALL dbt_iterator_stop(iter)
1096 CALL dbt_destroy(pqx)
1099 DEALLOCATE (neighbors, idx_to_nb)
1105 DO ispin = 1, nspins
1107 IF ((.NOT. any(xas_atom_env%exat_neighbors(iex)%array == iat)) &
1108 .AND. (.NOT. xas_atom_env%excited_atoms(iex) == iat)) cycle
1109 CALL para_env%sum(xas_atom_env%ri_dcoeff(iat, ispin, iex)%array)
1116 DEALLOCATE (basis_set_ri, basis_set_orb, all_ri_atoms)
1118 CALL timestop(handle)
1134 SUBROUTINE put_density_on_atomic_grid(rho_set, ri_dcoeff, atom_kind, do_gga, batch_info, &
1135 xas_atom_env, qs_env)
1139 INTEGER,
INTENT(IN) :: atom_kind
1140 LOGICAL,
INTENT(IN) :: do_gga
1145 CHARACTER(len=*),
PARAMETER :: routinen =
'put_density_on_atomic_grid'
1147 INTEGER :: dir, handle, ipgf, iset, iso, iso_proc, &
1148 ispin, maxso, n, na, nr, nset, nsgfi, &
1149 nsoi, nspins, sgfi, starti
1150 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf, nsgf_set
1151 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgf
1152 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: so
1153 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: dso
1154 REAL(
dp),
DIMENSION(:, :),
POINTER :: dgr1, dgr2, ga, gr, ri_sphi_so, zet
1155 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: dga1, dga2, rhoa, rhob
1159 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1161 NULLIFY (grid_atom, ri_basis, qs_kind_set, lmax, npgf, zet, nsgf_set, ri_sphi_so)
1162 NULLIFY (lmin, first_sgf, rhoa, rhob, ga, gr, dgr1, dgr2, dga1, dga2, ri_dcoeff_so)
1164 CALL timeset(routinen, handle)
1172 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
1173 CALL get_qs_kind(qs_kind_set(atom_kind), basis_set=ri_basis, basis_type=
"RI_XAS")
1174 CALL get_gto_basis_set(ri_basis, lmax=lmax, npgf=npgf, zet=zet, nset=nset, nsgf_set=nsgf_set, &
1175 first_sgf=first_sgf, lmin=lmin, maxso=maxso)
1178 grid_atom => xas_atom_env%grid_atom_set(atom_kind)%grid_atom
1179 na = grid_atom%ng_sphere
1182 nspins = xas_atom_env%nspins
1183 ri_sphi_so => xas_atom_env%ri_sphi_so(atom_kind)%array
1186 rhoa => rho_set%rhoa
1187 rhob => rho_set%rhob
1188 rhoa = 0.0_dp; rhob = 0.0_dp;
1191 rho_set%drhoa(dir)%array = 0.0_dp
1192 rho_set%drhob(dir)%array = 0.0_dp
1197 ga => xas_atom_env%ga(atom_kind)%array
1198 gr => xas_atom_env%gr(atom_kind)%array
1200 dga1 => xas_atom_env%dga1(atom_kind)%array
1201 dga2 => xas_atom_env%dga2(atom_kind)%array
1202 dgr1 => xas_atom_env%dgr1(atom_kind)%array
1203 dgr2 => xas_atom_env%dgr2(atom_kind)%array
1205 dga1 => xas_atom_env%dga1(atom_kind)%array
1206 dga2 => xas_atom_env%dga2(atom_kind)%array
1207 dgr1 => xas_atom_env%dgr1(atom_kind)%array
1208 dgr2 => xas_atom_env%dgr2(atom_kind)%array
1212 ALLOCATE (ri_dcoeff_so(nspins))
1213 DO ispin = 1, nspins
1214 ALLOCATE (ri_dcoeff_so(ispin)%array(nset*maxso))
1215 ri_dcoeff_so(ispin)%array = 0.0_dp
1219 sgfi = first_sgf(1, iset)
1220 nsoi = npgf(iset)*
nsoset(lmax(iset))
1221 nsgfi = nsgf_set(iset)
1223 CALL dgemv(
'N', nsoi, nsgfi, 1.0_dp, ri_sphi_so(1:nsoi, sgfi:sgfi + nsgfi - 1), nsoi, &
1224 ri_dcoeff(ispin)%array(sgfi:sgfi + nsgfi - 1), 1, 0.0_dp, &
1225 ri_dcoeff_so(ispin)%array((iset - 1)*maxso + 1:(iset - 1)*maxso + nsoi), 1)
1231 ALLOCATE (so(na, nr))
1232 IF (do_gga)
ALLOCATE (dso(na, nr, 3))
1235 DO iso_proc = 1, batch_info%nso_proc(atom_kind)
1236 iset = batch_info%so_proc_info(atom_kind)%array(1, iso_proc)
1237 ipgf = batch_info%so_proc_info(atom_kind)%array(2, iso_proc)
1238 iso = batch_info%so_proc_info(atom_kind)%array(3, iso_proc)
1241 starti = (iset - 1)*maxso + (ipgf - 1)*
nsoset(lmax(iset))
1244 CALL dgemm(
'N',
'T', na, nr, 1, 1.0_dp, ga(:, iso_proc:iso_proc), na, &
1245 gr(:, iso_proc:iso_proc), nr, 0.0_dp, so(:, :), na)
1251 CALL dgemm(
'N',
'T', na, nr, 1, 1.0_dp, dga1(:, iso_proc:iso_proc, dir), na, &
1252 dgr1(:, iso_proc:iso_proc), nr, 0.0_dp, dso(:, :, dir), na)
1253 CALL dgemm(
'N',
'T', na, nr, 1, 1.0_dp, dga2(:, iso_proc:iso_proc, dir), na, &
1254 dgr2(:, iso_proc:iso_proc), nr, 1.0_dp, dso(:, :, dir), na)
1259 CALL daxpy(n, ri_dcoeff_so(1)%array(starti + iso), so, 1, rhoa(:, :, 1), 1)
1261 IF (nspins == 2)
THEN
1262 CALL daxpy(n, ri_dcoeff_so(2)%array(starti + iso), so, 1, rhob(:, :, 1), 1)
1269 CALL daxpy(n, ri_dcoeff_so(1)%array(starti + iso), dso(:, :, dir), &
1270 1, rho_set%drhoa(dir)%array(:, :, 1), 1)
1272 IF (nspins == 2)
THEN
1273 CALL daxpy(n, ri_dcoeff_so(2)%array(starti + iso), dso(:, :, dir), &
1274 1, rho_set%drhob(dir)%array(:, :, 1), 1)
1282 IF (nspins == 1)
THEN
1283 CALL dcopy(n, rhoa(:, :, 1), 1, rhob(:, :, 1), 1)
1287 CALL dcopy(n, rho_set%drhoa(dir)%array(:, :, 1), 1, rho_set%drhob(dir)%array(:, :, 1), 1)
1295 DO ispin = 1, nspins
1296 DEALLOCATE (ri_dcoeff_so(ispin)%array)
1298 DEALLOCATE (ri_dcoeff_so)
1300 CALL timestop(handle)
1302 END SUBROUTINE put_density_on_atomic_grid
1321 SUBROUTINE put_density_on_other_grid(rho_set, ri_dcoeff, source_iat, source_ikind, target_iat, &
1322 target_ikind, sr, er, do_gga, xas_atom_env, qs_env)
1326 INTEGER,
INTENT(IN) :: source_iat, source_ikind, target_iat, &
1327 target_ikind, sr, er
1328 LOGICAL,
INTENT(IN) :: do_gga
1332 CHARACTER(len=*),
PARAMETER :: routinen =
'put_density_on_other_grid'
1334 INTEGER :: dir, handle, ia, ico, ipgf, ir, iset, &
1335 isgf, lx, ly, lz, n, na, nr, nset, &
1337 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf, nsgf_set
1338 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgf
1340 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: sgf
1341 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) ::
co, dsgf, pos
1342 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :, :) :: dco
1343 REAL(
dp),
DIMENSION(3) :: rs, rst, rt
1344 REAL(
dp),
DIMENSION(:, :),
POINTER :: ri_sphi, zet
1345 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: rhoa, rhob
1351 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1353 NULLIFY (qs_kind_set, ri_basis, lmax, npgf, nsgf_set, lmin, zet, first_sgf, grid_atom)
1354 NULLIFY (harmonics, rhoa, rhob, particle_set, cell, ri_sphi)
1361 CALL timeset(routinen, handle)
1364 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, particle_set=particle_set, cell=cell)
1366 CALL get_qs_kind(qs_kind_set(source_ikind), basis_set=ri_basis, basis_type=
"RI_XAS")
1367 CALL get_gto_basis_set(ri_basis, lmax=lmax, npgf=npgf, zet=zet, nset=nset, nsgf_set=nsgf_set, &
1368 first_sgf=first_sgf, lmin=lmin, sphi=ri_sphi)
1371 grid_atom => xas_atom_env%grid_atom_set(target_ikind)%grid_atom
1372 harmonics => xas_atom_env%harmonics_atom_set(target_ikind)%harmonics_atom
1373 na = grid_atom%ng_sphere
1376 nspins = xas_atom_env%nspins
1379 rhoa => rho_set%rhoa
1380 rhob => rho_set%rhob
1383 rs =
pbc(particle_set(source_iat)%r, cell)
1384 rt =
pbc(particle_set(target_iat)%r, cell)
1385 rst =
pbc(rs, rt, cell)
1388 ALLOCATE (pos(na, sr:er, 4))
1394 pos(ia, ir, 1:3) = harmonics%a(:, ia)*grid_atom%rad(ir) + rst
1395 pos(ia, ir, 4) = pos(ia, ir, 1)**2 + pos(ia, ir, 2)**2 + pos(ia, ir, 3)**2
1404 ALLOCATE (
co(na, sr:er, npgf(iset)*
ncoset(lmax(iset))))
1405 IF (do_gga)
ALLOCATE (dco(na, sr:er, 3, npgf(iset)*
ncoset(lmax(iset))))
1414 co(ia, ir, :) = 0.0_dp
1416 dco(ia, ir, :, :) = 0.0_dp
1422 DO ipgf = 1, npgf(iset)
1423 start = (ipgf - 1)*
ncoset(lmax(iset))
1426 DO ico =
ncoset(lmin(iset) - 1) + 1,
ncoset(lmax(iset))
1435 rmom = exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1436 IF (lx /= 0) rmom = rmom*pos(ia, ir, 1)**lx
1437 IF (ly /= 0) rmom = rmom*pos(ia, ir, 2)**ly
1438 IF (lz /= 0) rmom = rmom*pos(ia, ir, 3)**lz
1439 co(ia, ir, start + ico) = rmom
1456 rmom = -2.0_dp*pos(ia, ir, 1)*zet(ipgf, iset)*exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1457 IF (ly /= 0) rmom = rmom*pos(ia, ir, 2)**ly
1458 IF (lz /= 0) rmom = rmom*pos(ia, ir, 3)**lz
1459 dco(ia, ir, 1, start + ico) = rmom
1471 rmom = (lx*pos(ia, ir, 1)**(lx - 1) - 2.0_dp*pos(ia, ir, 1)**(lx + 1)* &
1472 zet(ipgf, iset))*exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1474 rmom = (1.0_dp - 2.0_dp*pos(ia, ir, 1)**2*zet(ipgf, iset))* &
1475 exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1477 IF (ly /= 0) rmom = rmom*pos(ia, ir, 2)**ly
1478 IF (lz /= 0) rmom = rmom*pos(ia, ir, 3)**lz
1479 dco(ia, ir, 1, start + ico) = rmom
1494 rmom = -2.0_dp*pos(ia, ir, 2)*zet(ipgf, iset)*exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1495 IF (lx /= 0) rmom = rmom*pos(ia, ir, 1)**lx
1496 IF (lz /= 0) rmom = rmom*pos(ia, ir, 3)**lz
1497 dco(ia, ir, 2, start + ico) = rmom
1509 rmom = (ly*pos(ia, ir, 2)**(ly - 1) - 2.0_dp*pos(ia, ir, 2)**(ly + 1)*zet(ipgf, iset)) &
1510 *exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1512 rmom = (1.0_dp - 2.0_dp*pos(ia, ir, 2)**2*zet(ipgf, iset)) &
1513 *exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1515 IF (lx /= 0) rmom = rmom*pos(ia, ir, 1)**lx
1516 IF (lz /= 0) rmom = rmom*pos(ia, ir, 3)**lz
1517 dco(ia, ir, 2, start + ico) = rmom
1532 rmom = -2.0_dp*pos(ia, ir, 3)*zet(ipgf, iset)*exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1533 IF (lx /= 0) rmom = rmom*pos(ia, ir, 1)**lx
1534 IF (ly /= 0) rmom = rmom*pos(ia, ir, 2)**ly
1535 dco(ia, ir, 3, start + ico) = rmom
1547 rmom = (lz*pos(ia, ir, 3)**(lz - 1) - 2.0_dp*pos(ia, ir, 3)**(lz + 1)* &
1548 zet(ipgf, iset))*exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1550 rmom = (1.0_dp - 2.0_dp*pos(ia, ir, 3)**2*zet(ipgf, iset))* &
1551 exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1553 IF (lx /= 0) rmom = rmom*pos(ia, ir, 1)**lx
1554 IF (ly /= 0) rmom = rmom*pos(ia, ir, 2)**ly
1555 dco(ia, ir, 3, start + ico) = rmom
1573 ALLOCATE (sgf(na, sr:er))
1574 IF (do_gga)
ALLOCATE (dsgf(na, sr:er, 3))
1575 sgfi = first_sgf(1, iset) - 1
1577 DO isgf = 1, nsgf_set(iset)
1579 IF (do_gga) dsgf = 0.0_dp
1581 DO ipgf = 1, npgf(iset)
1582 start = (ipgf - 1)*
ncoset(lmax(iset))
1583 DO ico =
ncoset(lmin(iset) - 1) + 1,
ncoset(lmax(iset))
1584 CALL daxpy(n, ri_sphi(start + ico, sgfi + isgf),
co(:, sr:er, start + ico), 1, sgf(:, sr:er), 1)
1589 CALL daxpy(n, ri_dcoeff(1)%array(sgfi + isgf), sgf(:, sr:er), 1, rhoa(:, sr:er, 1), 1)
1591 IF (nspins == 2)
THEN
1592 CALL daxpy(n, ri_dcoeff(2)%array(sgfi + isgf), sgf(:, sr:er), 1, rhob(:, sr:er, 1), 1)
1598 DO ipgf = 1, npgf(iset)
1599 start = (ipgf - 1)*
ncoset(lmax(iset))
1600 DO ico =
ncoset(lmin(iset) - 1) + 1,
ncoset(lmax(iset))
1602 CALL daxpy(n, ri_sphi(start + ico, sgfi + isgf), dco(:, sr:er, dir, start + ico), &
1603 1, dsgf(:, sr:er, dir), 1)
1609 CALL daxpy(n, ri_dcoeff(1)%array(sgfi + isgf), dsgf(:, sr:er, dir), 1, &
1610 rho_set%drhoa(dir)%array(:, sr:er, 1), 1)
1612 IF (nspins == 2)
THEN
1613 CALL daxpy(n, ri_dcoeff(2)%array(sgfi + isgf), dsgf(:, sr:er, dir), 1, &
1614 rho_set%drhob(dir)%array(:, sr:er, 1), 1)
1621 DEALLOCATE (
co, sgf)
1622 IF (do_gga)
DEALLOCATE (dco, dsgf)
1626 IF (nspins == 1)
THEN
1627 CALL dcopy(n, rhoa(:, sr:er, 1), 1, rhob(:, sr:er, 1), 1)
1631 CALL dcopy(n, rho_set%drhoa(dir)%array(:, sr:er, 1), 1, rho_set%drhob(dir)%array(:, sr:er, 1), 1)
1636 CALL timestop(handle)
1638 END SUBROUTINE put_density_on_other_grid
1647 SUBROUTINE compute_norm_drho(rho_set, atom_kind, xas_atom_env)
1650 INTEGER,
INTENT(IN) :: atom_kind
1653 INTEGER :: dir, ia, ir, n, na, nr, nspins
1655 na = xas_atom_env%grid_atom_set(atom_kind)%grid_atom%ng_sphere
1656 nr = xas_atom_env%grid_atom_set(atom_kind)%grid_atom%nr
1658 nspins = xas_atom_env%nspins
1660 rho_set%norm_drhoa = 0.0_dp
1661 rho_set%norm_drhob = 0.0_dp
1662 rho_set%norm_drho = 0.0_dp
1667 rho_set%norm_drhoa(ia, ir, 1) = rho_set%norm_drhoa(ia, ir, 1) &
1668 + rho_set%drhoa(dir)%array(ia, ir, 1)**2
1672 rho_set%norm_drhoa = sqrt(rho_set%norm_drhoa)
1674 IF (nspins == 1)
THEN
1676 CALL dcopy(n, rho_set%norm_drhoa(:, :, 1), 1, rho_set%norm_drhob(:, :, 1), 1)
1681 rho_set%norm_drhob(ia, ir, 1) = rho_set%norm_drhob(ia, ir, 1) &
1682 + rho_set%drhob(dir)%array(ia, ir, 1)**2
1686 rho_set%norm_drhob = sqrt(rho_set%norm_drhob)
1692 rho_set%norm_drho(ia, ir, 1) = rho_set%norm_drho(ia, ir, 1) + &
1693 (rho_set%drhoa(dir)%array(ia, ir, 1) + &
1694 rho_set%drhob(dir)%array(ia, ir, 1))**2
1698 rho_set%norm_drho = sqrt(rho_set%norm_drho)
1700 END SUBROUTINE compute_norm_drho
1711 SUBROUTINE precompute_so_dso(do_gga, batch_info, xas_atom_env, qs_env)
1713 LOGICAL,
INTENT(IN) :: do_gga
1718 CHARACTER(len=*),
PARAMETER :: routinen =
'precompute_so_dso'
1720 INTEGER :: bo(2), dir, handle, ikind, ipgf, iset, &
1721 iso, iso_proc, l, maxso, n, na, nkind, &
1722 nr, nset, nso_proc, nsotot, starti
1723 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf, nsgf_set
1724 INTEGER,
DIMENSION(:, :),
POINTER :: so_proc_info
1725 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: rexp
1726 REAL(
dp),
DIMENSION(:, :),
POINTER :: dgr1, dgr2, ga, gr, slm, zet
1727 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: dga1, dga2, dslm_dxyz
1732 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1734 NULLIFY (qs_kind_set, harmonics, grid_atom, slm, dslm_dxyz, ri_basis, lmax, lmin, npgf)
1735 NULLIFY (nsgf_set, zet, para_env, so_proc_info)
1737 CALL timeset(routinen, handle)
1739 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, para_env=para_env)
1740 nkind =
SIZE(qs_kind_set)
1742 ALLOCATE (batch_info%so_proc_info(nkind))
1743 ALLOCATE (batch_info%nso_proc(nkind))
1744 ALLOCATE (batch_info%so_bo(2, nkind))
1748 NULLIFY (xas_atom_env%ga(ikind)%array)
1749 NULLIFY (xas_atom_env%gr(ikind)%array)
1750 NULLIFY (xas_atom_env%dga1(ikind)%array)
1751 NULLIFY (xas_atom_env%dga2(ikind)%array)
1752 NULLIFY (xas_atom_env%dgr1(ikind)%array)
1753 NULLIFY (xas_atom_env%dgr2(ikind)%array)
1755 NULLIFY (batch_info%so_proc_info(ikind)%array)
1757 IF (.NOT. any(xas_atom_env%excited_kinds == ikind)) cycle
1760 harmonics => xas_atom_env%harmonics_atom_set(ikind)%harmonics_atom
1761 grid_atom => xas_atom_env%grid_atom_set(ikind)%grid_atom
1763 na = grid_atom%ng_sphere
1767 slm => harmonics%slm
1768 dslm_dxyz => harmonics%dslm_dxyz
1771 CALL get_qs_kind(qs_kind_set(ikind), basis_set=ri_basis, basis_type=
"RI_XAS")
1773 nsgf_set=nsgf_set, lmin=lmin, maxso=maxso)
1777 bo =
get_limit(nsotot, batch_info%batch_size, batch_info%ipe)
1778 nso_proc = bo(2) - bo(1) + 1
1779 batch_info%so_bo(:, ikind) = bo
1780 batch_info%nso_proc(ikind) = nso_proc
1783 ALLOCATE (batch_info%so_proc_info(ikind)%array(3, nso_proc))
1784 so_proc_info => batch_info%so_proc_info(ikind)%array
1787 DO ipgf = 1, npgf(iset)
1788 starti = (iset - 1)*maxso + (ipgf - 1)*
nsoset(lmax(iset))
1789 DO iso =
nsoset(lmin(iset) - 1) + 1,
nsoset(lmax(iset))
1792 IF (starti + iso < bo(1) .OR. starti + iso > bo(2)) cycle
1793 iso_proc = starti + iso - bo(1) + 1
1794 so_proc_info(1, iso_proc) = iset
1795 so_proc_info(2, iso_proc) = ipgf
1796 so_proc_info(3, iso_proc) = iso
1803 ALLOCATE (xas_atom_env%ga(ikind)%array(na, nso_proc))
1804 ALLOCATE (xas_atom_env%gr(ikind)%array(nr, nso_proc))
1805 xas_atom_env%ga(ikind)%array = 0.0_dp; xas_atom_env%gr(ikind)%array = 0.0_dp
1807 ALLOCATE (xas_atom_env%dga1(ikind)%array(na, nso_proc, 3))
1808 ALLOCATE (xas_atom_env%dgr1(ikind)%array(nr, nso_proc))
1809 ALLOCATE (xas_atom_env%dga2(ikind)%array(na, nso_proc, 3))
1810 ALLOCATE (xas_atom_env%dgr2(ikind)%array(nr, nso_proc))
1811 xas_atom_env%dga1(ikind)%array = 0.0_dp; xas_atom_env%dgr1(ikind)%array = 0.0_dp
1812 xas_atom_env%dga2(ikind)%array = 0.0_dp; xas_atom_env%dgr2(ikind)%array = 0.0_dp
1815 ga => xas_atom_env%ga(ikind)%array
1816 gr => xas_atom_env%gr(ikind)%array
1817 dga1 => xas_atom_env%dga1(ikind)%array
1818 dga2 => xas_atom_env%dga2(ikind)%array
1819 dgr1 => xas_atom_env%dgr1(ikind)%array
1820 dgr2 => xas_atom_env%dgr2(ikind)%array
1824 DO iso_proc = 1, nso_proc
1825 iset = so_proc_info(1, iso_proc)
1826 ipgf = so_proc_info(2, iso_proc)
1827 iso = so_proc_info(3, iso_proc)
1835 rexp(1:nr) = exp(-zet(ipgf, iset)*grid_atom%rad2(1:nr))
1836 gr(1:nr, iso_proc) = grid_atom%rad(1:nr)**l*rexp(1:nr)
1839 ga(1:na, iso_proc) = slm(1:na, iso)
1848 dgr1(1:nr, iso_proc) = grid_atom%rad(1:nr)**(l - 1)*rexp(1:nr)
1849 dgr2(1:nr, iso_proc) = -2.0_dp*zet(ipgf, iset)*grid_atom%rad(1:nr)**(l + 1)*rexp(1:nr)
1853 dga1(1:na, iso_proc, dir) = dslm_dxyz(dir, 1:na, iso)
1854 dga2(1:na, iso_proc, dir) = harmonics%a(dir, 1:na)*slm(1:na, iso)
1863 CALL timestop(handle)
1865 END SUBROUTINE precompute_so_dso
1884 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_fxc_atoms'
1886 INTEGER :: batch_size, dir, er, ex_bo(2), handle, i, iatom, ibatch, iex, ikind, inb, ipe, &
1887 mepos, na, natom, nb, nb_bo(2), nbatch, nbk, nex_atom, nr, num_pe, sr
1888 INTEGER,
DIMENSION(2, 3) :: bounds
1889 INTEGER,
DIMENSION(:),
POINTER :: exat_neighbors
1890 LOGICAL :: do_gga, do_sc, do_sf
1896 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1902 NULLIFY (particle_set, qs_kind_set, dft_control, para_env, exat_neighbors)
1903 NULLIFY (input, xc_functionals)
1905 CALL timeset(routinen, handle)
1908 CALL get_qs_env(qs_env, particle_set=particle_set, qs_kind_set=qs_kind_set, natom=natom, &
1909 dft_control=dft_control, input=input, para_env=para_env)
1910 ALLOCATE (int_fxc(natom, 4))
1913 NULLIFY (int_fxc(iatom, i)%array)
1916 nex_atom =
SIZE(xas_atom_env%excited_atoms)
1918 do_sc = xas_tdp_control%do_spin_cons .OR. xas_tdp_control%do_singlet .OR. xas_tdp_control%do_triplet
1919 do_sf = xas_tdp_control%do_spin_flip
1925 do_gga = needs%drho_spin
1930 num_pe = para_env%num_pe
1931 mepos = para_env%mepos
1937 ibatch = mepos/batch_size
1939 ipe =
modulo(mepos, batch_size)
1941 batch_info%batch_size = batch_size
1942 batch_info%nbatch = nbatch
1943 batch_info%ibatch = ibatch
1944 batch_info%ipe = ipe
1947 CALL batch_info%para_env%from_split(para_env, ibatch)
1951 CALL precompute_so_dso(do_gga, batch_info, xas_atom_env, qs_env)
1954 ex_bo =
get_limit(nex_atom, nbatch, ibatch)
1957 DO iex = ex_bo(1), ex_bo(2)
1959 iatom = xas_atom_env%excited_atoms(iex)
1960 ikind = particle_set(iatom)%atomic_kind%kind_number
1961 exat_neighbors => xas_atom_env%exat_neighbors(iex)%array
1962 ri_dcoeff => xas_atom_env%ri_dcoeff(:, :, iex)
1965 na = xas_atom_env%grid_atom_set(ikind)%grid_atom%ng_sphere
1966 nr = xas_atom_env%grid_atom_set(ikind)%grid_atom%nr
1969 bounds(1:2, 1:3) = 1
1974 rho_cutoff=dft_control%qs_control%eps_rho_rspace, &
1975 drho_cutoff=dft_control%qs_control%eps_rho_rspace)
1982 CALL put_density_on_atomic_grid(rho_set, ri_dcoeff(iatom, :), ikind, &
1983 do_gga, batch_info, xas_atom_env, qs_env)
1988 sr = nb_bo(1); er = nb_bo(2)
1989 DO inb = 1,
SIZE(exat_neighbors)
1991 nb = exat_neighbors(inb)
1992 nbk = particle_set(nb)%atomic_kind%kind_number
1993 CALL put_density_on_other_grid(rho_set, ri_dcoeff(nb, :), nb, nbk, iatom, &
1994 ikind, sr, er, do_gga, xas_atom_env, qs_env)
1999 CALL batch_info%para_env%sum(rho_set%rhoa)
2000 CALL batch_info%para_env%sum(rho_set%rhob)
2003 CALL batch_info%para_env%sum(rho_set%drhoa(dir)%array)
2004 CALL batch_info%para_env%sum(rho_set%drhob(dir)%array)
2009 IF (do_gga)
CALL compute_norm_drho(rho_set, ikind, xas_atom_env)
2012 CALL xc_functionals_eval(xc_functionals, lsd=.true., rho_set=rho_set, deriv_set=deriv_set, &
2017 CALL integrate_sc_fxc(int_fxc, iatom, ikind, deriv_set, xas_atom_env, qs_env)
2022 CALL integrate_sf_fxc(int_fxc, iatom, ikind, rho_set, deriv_set, xas_atom_env, qs_env)
2026 IF (do_gga .AND. do_sc)
THEN
2027 CALL integrate_gga_fxc(int_fxc, iatom, ikind, batch_info, rho_set, deriv_set, &
2028 xas_atom_env, qs_env)
2039 CALL para_env%sync()
2041 CALL timestop(handle)
2057 SUBROUTINE integrate_gga_fxc(int_fxc, iatom, ikind, batch_info, rho_set, deriv_set, &
2058 xas_atom_env, qs_env)
2061 INTEGER,
INTENT(IN) :: iatom, ikind
2068 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_gga_fxc'
2070 INTEGER :: bo(2), dir, handle, i, ia, ir, jpgf, &
2071 jset, jso, l, maxso, na, nr, nset, &
2072 nsgf, nsoi, nsotot, startj, ub
2073 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf
2074 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: rexp
2075 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: int_sgf, res, so, work
2076 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: dso
2077 REAL(
dp),
DIMENSION(:, :),
POINTER :: dgr1, dgr2, ga, gr, ri_sphi_so, weight, &
2079 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: dga1, dga2
2086 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2088 NULLIFY (grid_atom, ri_basis, qs_kind_set, ga, gr, dgr1, dgr2, lmax, lmin, npgf)
2089 NULLIFY (weight, ri_sphi_so, dga1, dga2, para_env, harmonics, zet)
2101 CALL timeset(routinen, handle)
2105 IF (xas_atom_env%nspins == 2) ub = 3
2108 harmonics => xas_atom_env%harmonics_atom_set(ikind)%harmonics_atom
2109 grid_atom => xas_atom_env%grid_atom_set(ikind)%grid_atom
2110 na = grid_atom%ng_sphere
2112 weight => grid_atom%weight
2115 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, para_env=para_env)
2116 CALL get_qs_kind(qs_kind_set(ikind), basis_set=ri_basis, basis_type=
"RI_XAS")
2118 CALL get_gto_basis_set(gto_basis_set=ri_basis, lmax=lmax, lmin=lmin, nsgf=nsgf, &
2119 maxso=maxso, npgf=npgf, nset=nset, zet=zet)
2123 ga => xas_atom_env%ga(ikind)%array
2124 gr => xas_atom_env%gr(ikind)%array
2125 dgr1 => xas_atom_env%dgr1(ikind)%array
2126 dgr2 => xas_atom_env%dgr2(ikind)%array
2127 dga1 => xas_atom_env%dga1(ikind)%array
2128 dga2 => xas_atom_env%dga2(ikind)%array
2139 ALLOCATE (so(na, nr))
2140 ALLOCATE (dso(na, nr, 3))
2145 ALLOCATE (int_so(ub))
2147 ALLOCATE (vxc(i)%array(na, nr))
2148 ALLOCATE (vxg(i)%array(na, nr, 3))
2149 ALLOCATE (int_so(i)%array(nsotot, nsotot))
2150 vxc(i)%array = 0.0_dp; vxg(i)%array = 0.0_dp; int_so(i)%array = 0.0_dp
2154 DO jpgf = 1, npgf(jset)
2155 startj = (jset - 1)*maxso + (jpgf - 1)*
nsoset(lmax(jset))
2156 DO jso =
nsoset(lmin(jset) - 1) + 1,
nsoset(lmax(jset))
2162 rexp(1:nr) = exp(-zet(jpgf, jset)*grid_atom%rad2(1:nr))
2170 so(ia, ir) = grid_atom%rad(ir)**l*rexp(ir)*harmonics%slm(ia, jso)
2173 dso(ia, ir, :) = 0.0_dp
2175 dso(ia, ir, dir) = dso(ia, ir, dir) &
2176 + grid_atom%rad(ir)**(l - 1)*rexp(ir)*harmonics%dslm_dxyz(dir, ia, jso) &
2177 - 2.0_dp*zet(jpgf, jset)*grid_atom%rad(ir)**(l + 1)*rexp(ir) &
2178 *harmonics%a(dir, ia)*harmonics%slm(ia, jso)
2185 CALL get_vxc_vxg(vxc, vxg, so, dso, na, nr, rho_set, deriv_set, weight)
2189 nsoi = batch_info%nso_proc(ikind)
2190 bo = batch_info%so_bo(:, ikind)
2191 ALLOCATE (res(nsoi, nsoi), work(na, nsoi))
2192 res = 0.0_dp; work = 0.0_dp
2197 CALL dgemm(
'N',
'N', na, nsoi, nr, 1.0_dp, vxc(i)%array(:, :), na, &
2198 gr(:, 1:nsoi), nr, 0.0_dp, work, na)
2199 CALL dgemm(
'T',
'N', nsoi, nsoi, na, 1.0_dp, work, na, &
2200 ga(:, 1:nsoi), na, 0.0_dp, res, nsoi)
2201 int_so(i)%array(bo(1):bo(2), startj + jso) =
get_diag(res)
2206 CALL dgemm(
'N',
'N', na, nsoi, nr, 1.0_dp, vxg(i)%array(:, :, dir), na, &
2207 dgr1(:, 1:nsoi), nr, 0.0_dp, work, na)
2208 CALL dgemm(
'T',
'N', nsoi, nsoi, na, 1.0_dp, work, na, &
2209 dga1(:, 1:nsoi, dir), na, 0.0_dp, res, nsoi)
2210 CALL daxpy(nsoi, 1.0_dp,
get_diag(res), 1, int_so(i)%array(bo(1):bo(2), startj + jso), 1)
2212 CALL dgemm(
'N',
'N', na, nsoi, nr, 1.0_dp, vxg(i)%array(:, :, dir), na, &
2213 dgr2(:, 1:nsoi), nr, 0.0_dp, work, na)
2214 CALL dgemm(
'T',
'N', nsoi, nsoi, na, 1.0_dp, work, na, &
2215 dga2(:, 1:nsoi, dir), na, 0.0_dp, res, nsoi)
2216 CALL daxpy(nsoi, 1.0_dp,
get_diag(res), 1, int_so(i)%array(bo(1):bo(2), startj + jso), 1)
2221 DEALLOCATE (res, work)
2228 ri_sphi_so => xas_atom_env%ri_sphi_so(ikind)%array
2229 ALLOCATE (int_sgf(nsgf, nsgf))
2231 CALL batch_info%para_env%sum(int_so(i)%array)
2232 CALL contract_so2sgf(int_sgf, int_so(i)%array, ri_basis, ri_sphi_so)
2233 CALL daxpy(nsgf*nsgf, 1.0_dp, int_sgf, 1, int_fxc(iatom, i)%array, 1)
2238 DEALLOCATE (vxc(i)%array)
2239 DEALLOCATE (vxg(i)%array)
2240 DEALLOCATE (int_so(i)%array)
2242 DEALLOCATE (vxc, vxg, int_so)
2244 CALL timestop(handle)
2246 END SUBROUTINE integrate_gga_fxc
2265 SUBROUTINE get_vxc_vxg(vxc, vxg, so, dso, na, nr, rho_set, deriv_set, weight)
2269 REAL(
dp),
DIMENSION(:, :) :: so
2270 REAL(
dp),
DIMENSION(:, :, :) :: dso
2271 INTEGER,
INTENT(IN) :: na, nr
2274 REAL(
dp),
DIMENSION(:, :),
POINTER :: weight
2276 CHARACTER(len=*),
PARAMETER :: routinen =
'get_vxc_vxg'
2278 INTEGER :: dir, handle, i, ia, ir, ub
2279 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: dot_proda, dot_prodb, tmp
2280 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: d1e, d2e, norm_drhoa, norm_drhob
2283 NULLIFY (norm_drhoa, norm_drhob, d2e, d1e, deriv)
2285 CALL timeset(routinen, handle)
2294 norm_drhoa => rho_set%norm_drhoa
2295 norm_drhob => rho_set%norm_drhob
2299 vxc(i)%array = 0.0_dp
2300 vxg(i)%array = 0.0_dp
2303 ALLOCATE (tmp(na, nr), dot_proda(na, nr), dot_prodb(na, nr))
2304 dot_proda = 0.0_dp; dot_prodb = 0.0_dp
2320 dot_proda(ia, ir) = dot_proda(ia, ir) + rho_set%drhoa(dir)%array(ia, ir, 1)*dso(ia, ir, dir)
2321 dot_prodb(ia, ir) = dot_prodb(ia, ir) + rho_set%drhob(dir)%array(ia, ir, 1)*dso(ia, ir, dir)
2331 IF (
ASSOCIATED(deriv))
THEN
2336 vxc(1)%array(ia, ir) = d2e(ia, ir, 1)*dot_proda(ia, ir)
2345 IF (
ASSOCIATED(deriv))
THEN
2350 vxc(1)%array(ia, ir) = vxc(1)%array(ia, ir) + d2e(ia, ir, 1)*dot_prodb(ia, ir)
2360 vxc(1)%array(ia, ir) = vxc(1)%array(ia, ir)*weight(ia, ir)
2367 IF (
ASSOCIATED(deriv))
THEN
2372 tmp(ia, ir) = d2e(ia, ir, 1)*so(ia, ir)
2380 IF (
ASSOCIATED(deriv))
THEN
2385 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_prodb(ia, ir)
2393 IF (
ASSOCIATED(deriv))
THEN
2398 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2406 IF (
ASSOCIATED(deriv))
THEN
2411 tmp(ia, ir) = tmp(ia, ir) - d1e(ia, ir, 1)*dot_proda(ia, ir) &
2412 /max(norm_drhoa(ia, ir, 1), rho_set%drho_cutoff)**2
2423 vxg(1)%array(ia, ir, dir) = tmp(ia, ir)*rho_set%drhoa(dir)%array(ia, ir, 1)
2431 IF (
ASSOCIATED(deriv))
THEN
2436 tmp(ia, ir) = d2e(ia, ir, 1)*so(ia, ir)
2444 IF (
ASSOCIATED(deriv))
THEN
2449 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2457 IF (
ASSOCIATED(deriv))
THEN
2462 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_prodb(ia, ir)
2473 vxg(1)%array(ia, ir, dir) = vxg(1)%array(ia, ir, dir) + tmp(ia, ir)*rho_set%drhob(dir)%array(ia, ir, 1)
2481 IF (
ASSOCIATED(deriv))
THEN
2487 vxg(1)%array(ia, ir, dir) = vxg(1)%array(ia, ir, dir) + d1e(ia, ir, 1)*dso(ia, ir, dir)
2499 vxg(1)%array(ia, ir, dir) = vxg(1)%array(ia, ir, dir)*weight(ia, ir)
2509 IF (
ASSOCIATED(deriv))
THEN
2514 vxc(2)%array(ia, ir) = d2e(ia, ir, 1)*dot_prodb(ia, ir)
2522 IF (
ASSOCIATED(deriv))
THEN
2527 vxc(2)%array(ia, ir) = vxc(2)%array(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2537 vxc(2)%array(ia, ir) = vxc(2)%array(ia, ir)*weight(ia, ir)
2544 IF (
ASSOCIATED(deriv))
THEN
2549 tmp(ia, ir) = d2e(ia, ir, 1)*so(ia, ir)
2557 IF (
ASSOCIATED(deriv))
THEN
2562 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2570 IF (
ASSOCIATED(deriv))
THEN
2575 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_prodb(ia, ir)
2586 vxg(2)%array(ia, ir, dir) = tmp(ia, ir)*rho_set%drhoa(dir)%array(ia, ir, 1)
2594 IF (
ASSOCIATED(deriv))
THEN
2599 tmp(ia, ir) = d2e(ia, ir, 1)*so(ia, ir)
2607 IF (
ASSOCIATED(deriv))
THEN
2612 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_prodb(ia, ir)
2620 IF (
ASSOCIATED(deriv))
THEN
2625 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2636 vxg(2)%array(ia, ir, dir) = vxg(2)%array(ia, ir, dir) + tmp(ia, ir)*rho_set%drhob(dir)%array(ia, ir, 1)
2644 IF (
ASSOCIATED(deriv))
THEN
2650 vxg(2)%array(ia, ir, dir) = vxg(2)%array(ia, ir, dir) + d1e(ia, ir, 1)*dso(ia, ir, dir)
2662 vxg(2)%array(ia, ir, dir) = vxg(2)%array(ia, ir, dir)*weight(ia, ir)
2673 IF (
ASSOCIATED(deriv))
THEN
2678 vxc(3)%array(ia, ir) = d2e(ia, ir, 1)*dot_prodb(ia, ir)
2686 IF (
ASSOCIATED(deriv))
THEN
2691 vxc(3)%array(ia, ir) = vxc(3)%array(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2701 vxc(3)%array(ia, ir) = vxc(3)%array(ia, ir)*weight(ia, ir)
2708 IF (
ASSOCIATED(deriv))
THEN
2713 tmp(ia, ir) = d2e(ia, ir, 1)*so(ia, ir)
2721 IF (
ASSOCIATED(deriv))
THEN
2726 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2734 IF (
ASSOCIATED(deriv))
THEN
2739 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_prodb(ia, ir)
2747 IF (
ASSOCIATED(deriv))
THEN
2752 tmp(ia, ir) = tmp(ia, ir) - d1e(ia, ir, 1)*dot_prodb(ia, ir) &
2753 /max(norm_drhob(ia, ir, 1), rho_set%drho_cutoff)**2
2764 vxg(3)%array(ia, ir, dir) = tmp(ia, ir)*rho_set%drhob(dir)%array(ia, ir, 1)
2772 IF (
ASSOCIATED(deriv))
THEN
2777 tmp(ia, ir) = d2e(ia, ir, 1)*so(ia, ir)
2785 IF (
ASSOCIATED(deriv))
THEN
2790 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_prodb(ia, ir)
2798 IF (
ASSOCIATED(deriv))
THEN
2803 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2814 vxg(3)%array(ia, ir, dir) = vxg(3)%array(ia, ir, dir) + &
2815 tmp(ia, ir)*rho_set%drhoa(dir)%array(ia, ir, 1)
2823 IF (
ASSOCIATED(deriv))
THEN
2829 vxg(3)%array(ia, ir, dir) = vxg(3)%array(ia, ir, dir) + d1e(ia, ir, 1)*dso(ia, ir, dir)
2841 vxg(3)%array(ia, ir, dir) = vxg(3)%array(ia, ir, dir)*weight(ia, ir)
2851 CALL timestop(handle)
2853 END SUBROUTINE get_vxc_vxg
2864 SUBROUTINE integrate_sc_fxc(int_fxc, iatom, ikind, deriv_set, xas_atom_env, qs_env)
2867 INTEGER,
INTENT(IN) :: iatom, ikind
2872 INTEGER :: i, maxso, na, nr, nset, nsotot, nspins, &
2874 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: fxc, int_so
2875 REAL(
dp),
DIMENSION(:, :),
POINTER :: ri_sphi_so
2880 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2883 NULLIFY (grid_atom, deriv, ri_basis, ri_sphi_so, qs_kind_set, dft_control)
2886 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, dft_control=dft_control)
2887 grid_atom => xas_atom_env%grid_atom_set(ikind)%grid_atom
2888 na = grid_atom%ng_sphere
2890 CALL get_qs_kind(qs_kind_set(ikind), basis_set=ri_basis, basis_type=
"RI_XAS")
2893 ri_sphi_so => xas_atom_env%ri_sphi_so(ikind)%array
2894 nspins = dft_control%nspins
2906 ALLOCATE (fxc(na, nr))
2907 ALLOCATE (int_so(nsotot, nsotot))
2911 ub = 2;
IF (nspins == 2) ub = 3
2915 fxc(:, :) = d2e(i)%array(:, :, 1)*grid_atom%weight(:, :)
2916 CALL integrate_so_prod(int_so, fxc, ikind, xas_atom_env, qs_env)
2919 ALLOCATE (int_fxc(iatom, i)%array(ri_nsgf, ri_nsgf))
2920 int_fxc(iatom, i)%array = 0.0_dp
2921 CALL contract_so2sgf(int_fxc(iatom, i)%array, int_so, ri_basis, ri_sphi_so)
2925 END SUBROUTINE integrate_sc_fxc
2938 SUBROUTINE integrate_sf_fxc(int_fxc, iatom, ikind, rho_set, deriv_set, xas_atom_env, qs_env)
2941 INTEGER,
INTENT(IN) :: iatom, ikind
2947 INTEGER :: ia, ir, maxso, na, nr, nset, nsotot, &
2949 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: fxc, int_so
2950 REAL(
dp),
DIMENSION(:, :),
POINTER :: ri_sphi_so
2951 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: rhoa, rhob
2956 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2959 NULLIFY (grid_atom, deriv, ri_basis, ri_sphi_so, qs_kind_set, rhoa, rhob, dft_control)
2962 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, dft_control=dft_control)
2963 grid_atom => xas_atom_env%grid_atom_set(ikind)%grid_atom
2964 na = grid_atom%ng_sphere
2966 CALL get_qs_kind(qs_kind_set(ikind), basis_set=ri_basis, basis_type=
"RI_XAS")
2969 ri_sphi_so => xas_atom_env%ri_sphi_so(ikind)%array
2970 rhoa => rho_set%rhoa
2971 rhob => rho_set%rhob
2989 ALLOCATE (fxc(na, nr))
2998 IF (abs(rhoa(ia, ir, 1) - rhob(ia, ir, 1)) > dft_control%qs_control%eps_rho_rspace)
THEN
2999 fxc(ia, ir) = grid_atom%weight(ia, ir)/(rhoa(ia, ir, 1) - rhob(ia, ir, 1)) &
3000 *(d1e(1)%array(ia, ir, 1) - d1e(2)%array(ia, ir, 1))
3002 fxc(ia, ir) = 0.5_dp*grid_atom%weight(ia, ir)* &
3003 (d2e(1)%array(ia, ir, 1) + d2e(3)%array(ia, ir, 1) - 2._dp*d2e(2)%array(ia, ir, 1))
3011 ALLOCATE (int_so(nsotot, nsotot))
3013 CALL integrate_so_prod(int_so, fxc, ikind, xas_atom_env, qs_env)
3016 ALLOCATE (int_fxc(iatom, 4)%array(ri_nsgf, ri_nsgf))
3017 int_fxc(iatom, 4)%array = 0.0_dp
3018 CALL contract_so2sgf(int_fxc(iatom, 4)%array, int_so, ri_basis, ri_sphi_so)
3020 END SUBROUTINE integrate_sf_fxc
3029 SUBROUTINE contract_so2sgf(int_sgf, int_so, basis, sphi_so)
3031 REAL(
dp),
DIMENSION(:, :) :: int_sgf, int_so
3033 REAL(
dp),
DIMENSION(:, :) :: sphi_so
3035 INTEGER :: iset, jset, maxso, nset, nsoi, nsoj, &
3036 sgfi, sgfj, starti, startj
3037 INTEGER,
DIMENSION(:),
POINTER :: lmax, npgf, nsgf_set
3038 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgf
3040 NULLIFY (nsgf_set, npgf, lmax, first_sgf)
3042 CALL get_gto_basis_set(basis, nset=nset, maxso=maxso, nsgf_set=nsgf_set, first_sgf=first_sgf, &
3043 npgf=npgf, lmax=lmax)
3046 starti = (iset - 1)*maxso + 1
3047 nsoi = npgf(iset)*
nsoset(lmax(iset))
3048 sgfi = first_sgf(1, iset)
3051 startj = (jset - 1)*maxso + 1
3052 nsoj = npgf(jset)*
nsoset(lmax(jset))
3053 sgfj = first_sgf(1, jset)
3055 CALL ab_contract(int_sgf(sgfi:sgfi + nsgf_set(iset) - 1, sgfj:sgfj + nsgf_set(jset) - 1), &
3056 int_so(starti:starti + nsoi - 1, startj:startj + nsoj - 1), &
3057 sphi_so(:, sgfi:), sphi_so(:, sgfj:), nsoi, nsoj, &
3058 nsgf_set(iset), nsgf_set(jset))
3062 END SUBROUTINE contract_so2sgf
3076 SUBROUTINE integrate_so_prod(intso, fxc, ikind, xas_atom_env, qs_env)
3078 REAL(
dp),
DIMENSION(:, :),
INTENT(INOUT) :: intso
3079 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: fxc
3080 INTEGER,
INTENT(IN) :: ikind
3084 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_so_prod'
3086 INTEGER :: handle, ia, ic, icg, ipgf1, ipgf2, iset1, iset2, iso, iso1, iso2, l, ld, lmax12, &
3087 lmin12, m1, m2, max_iso_not0, max_iso_not0_local, max_s_harm, maxl, maxso, n1, n2, na, &
3088 ngau1, ngau2, nngau1, nr, nset, size1
3089 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: cg_n_list
3090 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :) :: cg_list
3091 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf
3092 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: g1, g2
3093 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: gfxcg, gg, matso
3094 REAL(
dp),
DIMENSION(:, :),
POINTER :: zet
3095 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: my_cg
3099 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3101 CALL timeset(routinen, handle)
3103 NULLIFY (grid_atom, harmonics, ri_basis, qs_kind_set, lmax, lmin, npgf, zet, my_cg)
3106 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
3107 CALL get_qs_kind(qs_kind_set(ikind), basis_set=ri_basis, basis_type=
"RI_XAS")
3108 grid_atom => xas_atom_env%grid_atom_set(ikind)%grid_atom
3109 harmonics => xas_atom_env%harmonics_atom_set(ikind)%harmonics_atom
3111 CALL get_gto_basis_set(ri_basis, lmax=lmax, lmin=lmin, maxso=maxso, maxl=maxl, npgf=npgf, &
3114 na = grid_atom%ng_sphere
3116 my_cg => harmonics%my_CG
3117 max_iso_not0 = harmonics%max_iso_not0
3118 max_s_harm = harmonics%max_s_harm
3119 cpassert(2*maxl .LE.
indso(1, max_iso_not0))
3121 ALLOCATE (g1(nr), g2(nr), gg(nr, 0:2*maxl))
3122 ALLOCATE (gfxcg(na, 0:2*maxl))
3124 ALLOCATE (cg_list(2,
nsoset(maxl)**2, max_s_harm), cg_n_list(max_s_harm))
3134 CALL get_none0_cg_list(my_cg, lmin(iset1), lmax(iset1), lmin(iset2), lmax(iset2), &
3135 max_s_harm, lmax(iset1) + lmax(iset2), cg_list, cg_n_list, &
3137 cpassert(max_iso_not0_local .LE. max_iso_not0)
3140 DO ipgf1 = 1, npgf(iset1)
3141 ngau1 = n1*(ipgf1 - 1) + m1
3143 nngau1 =
nsoset(lmin(iset1) - 1) + ngau1
3145 g1(:) = exp(-zet(ipgf1, iset1)*grid_atom%rad2(1:nr))
3146 DO ipgf2 = 1, npgf(iset2)
3147 ngau2 = n2*(ipgf2 - 1) + m2
3149 g2(:) = exp(-zet(ipgf2, iset2)*grid_atom%rad2(1:nr))
3150 lmin12 = lmin(iset1) + lmin(iset2)
3151 lmax12 = lmax(iset1) + lmax(iset2)
3155 IF (lmin12 == 0)
THEN
3156 gg(:, lmin12) = g1(:)*g2(:)
3158 gg(:, lmin12) = grid_atom%rad2l(1:nr, lmin12)*g1(:)*g2(:)
3161 DO l = lmin12 + 1, lmax12
3162 gg(:, l) = grid_atom%rad(1:nr)*gg(:, l - 1)
3166 CALL dgemm(
'N',
'N', na, ld, nr, 1.0_dp, fxc(1:na, 1:nr), na, gg(:, 0:lmax12), &
3167 nr, 0.0_dp, gfxcg(1:na, 0:lmax12), na)
3171 DO iso = 1, max_iso_not0_local
3172 DO icg = 1, cg_n_list(iso)
3173 iso1 = cg_list(1, icg, iso)
3174 iso2 = cg_list(2, icg, iso)
3178 matso(iso1, iso2) = matso(iso1, iso2) + gfxcg(ia, l)* &
3179 my_cg(iso1, iso2, iso)*harmonics%slm(ia, iso)
3185 DO ic =
nsoset(lmin(iset2) - 1) + 1,
nsoset(lmax(iset2))
3186 iso1 =
nsoset(lmin(iset1) - 1) + 1
3188 CALL daxpy(size1, 1.0_dp, matso(iso1:, ic), 1, intso(nngau1 + 1:, iso2), 1)
3198 CALL timestop(handle)
3200 END SUBROUTINE integrate_so_prod
3211 SUBROUTINE integrate_so_dxdy_prod(intso, V, ikind, qs_env, soc_atom_env)
3213 REAL(
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: intso
3214 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: v
3215 INTEGER,
INTENT(IN) :: ikind
3219 INTEGER :: i, ipgf, iset, iso, j, jpgf, jset, jso, &
3220 k, l, maxso, na, nr, nset, starti, &
3222 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf
3223 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: fga, fgr, r1, r2, work
3224 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: a1, a2
3225 REAL(
dp),
DIMENSION(:, :),
POINTER :: slm, zet
3226 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: dslm_dxyz
3230 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3232 NULLIFY (grid_atom, harmonics, basis, qs_kind_set, dslm_dxyz, slm, lmin, lmax, npgf, zet)
3234 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
3235 CALL get_qs_kind(qs_kind_set(ikind), basis_set=basis, basis_type=
"ORB")
3236 IF (
PRESENT(soc_atom_env))
THEN
3237 grid_atom => soc_atom_env%grid_atom_set(ikind)%grid_atom
3238 harmonics => soc_atom_env%harmonics_atom_set(ikind)%harmonics_atom
3240 CALL get_qs_kind(qs_kind_set(ikind), basis_set=basis, basis_type=
"ORB", harmonics=harmonics, &
3241 grid_atom=grid_atom)
3244 na = grid_atom%ng_sphere
3247 slm => harmonics%slm
3248 dslm_dxyz => harmonics%dslm_dxyz
3252 maxso=maxso, npgf=npgf, nset=nset, zet=zet)
3258 ALLOCATE (a1(na, nset*maxso, 3), a2(na, nset*maxso, 3))
3259 ALLOCATE (r1(nr, nset*maxso), r2(nr, nset*maxso))
3260 a1 = 0.0_dp; a2 = 0.0_dp
3261 r1 = 0.0_dp; r2 = 0.0_dp
3264 DO ipgf = 1, npgf(iset)
3265 starti = (iset - 1)*maxso + (ipgf - 1)*
nsoset(lmax(iset))
3266 DO iso =
nsoset(lmin(iset) - 1) + 1,
nsoset(lmax(iset))
3273 r1(1:nr, starti + iso) = grid_atom%rad(1:nr)**(l - 1)*exp(-zet(ipgf, iset)*grid_atom%rad2(1:nr))
3276 r2(1:nr, starti + iso) = -2.0_dp*zet(ipgf, iset)*grid_atom%rad(1:nr)**(l + 1) &
3277 *exp(-zet(ipgf, iset)*grid_atom%rad2(1:nr))
3281 a1(1:na, starti + iso, i) = dslm_dxyz(i, 1:na, iso)
3284 a2(1:na, starti + iso, i) = harmonics%a(i, 1:na)*slm(1:na, iso)
3293 ALLOCATE (fga(na, 1))
3294 ALLOCATE (fgr(nr, 1))
3295 ALLOCATE (work(na, 1))
3296 fga = 0.0_dp; fgr = 0.0_dp; work = 0.0_dp
3300 DO ipgf = 1, npgf(iset)
3301 starti = (iset - 1)*maxso + (ipgf - 1)*
nsoset(lmax(iset))
3302 DO jpgf = 1, npgf(jset)
3303 startj = (jset - 1)*maxso + (jpgf - 1)*
nsoset(lmax(jset))
3307 k = mod(i + 1, 3) + 1
3309 DO iso =
nsoset(lmin(iset) - 1) + 1,
nsoset(lmax(iset))
3310 DO jso =
nsoset(lmin(jset) - 1) + 1,
nsoset(lmax(jset))
3315 fgr(1:nr, 1) = r1(1:nr, starti + iso)*r1(1:nr, startj + jso)
3316 fga(1:na, 1) = a1(1:na, starti + iso, j)*a1(1:na, startj + jso, k)
3318 CALL dgemm(
'N',
'N', na, 1, nr, 1.0_dp, v, na, fgr, nr, 0.0_dp, work, na)
3319 CALL dgemm(
'T',
'N', 1, 1, na, 1.0_dp, work, na, fga, na, 0.0_dp, &
3320 intso(starti + iso:, startj + jso, i), 1)
3323 fgr(1:nr, 1) = r1(1:nr, starti + iso)*r2(1:nr, startj + jso)
3324 fga(1:na, 1) = a1(1:na, starti + iso, j)*a2(1:na, startj + jso, k)
3326 CALL dgemm(
'N',
'N', na, 1, nr, 1.0_dp, v, na, fgr, nr, 0.0_dp, work, na)
3327 CALL dgemm(
'T',
'N', 1, 1, na, 1.0_dp, work, na, fga, na, 1.0_dp, &
3328 intso(starti + iso:, startj + jso, i), 1)
3331 fgr(1:nr, 1) = r2(1:nr, starti + iso)*r1(1:nr, startj + jso)
3332 fga(1:na, 1) = a2(1:na, starti + iso, j)*a1(1:na, startj + jso, k)
3334 CALL dgemm(
'N',
'N', na, 1, nr, 1.0_dp, v, na, fgr, nr, 0.0_dp, work, na)
3335 CALL dgemm(
'T',
'N', 1, 1, na, 1.0_dp, work, na, fga, na, 1.0_dp, &
3336 intso(starti + iso:, startj + jso, i), 1)
3339 fgr(1:nr, 1) = r2(1:nr, starti + iso)*r2(1:nr, startj + jso)
3340 fga(1:na, 1) = a2(1:na, starti + iso, j)*a2(1:na, startj + jso, k)
3342 CALL dgemm(
'N',
'N', na, 1, nr, 1.0_dp, v, na, fgr, nr, 0.0_dp, work, na)
3343 CALL dgemm(
'T',
'N', 1, 1, na, 1.0_dp, work, na, fga, na, 1.0_dp, &
3344 intso(starti + iso:, startj + jso, i), 1)
3356 intso(:, :, i) = intso(:, :, i) - transpose(intso(:, :, i))
3359 END SUBROUTINE integrate_so_dxdy_prod
3373 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_soc
3378 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_soc_atoms'
3380 INTEGER :: handle, i, iat, ikind, ir, jat, maxso, &
3381 na, nkind, nr, nset, nsgf
3382 LOGICAL :: all_potential_present
3384 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: vr
3385 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: v
3386 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: intso
3387 REAL(
dp),
DIMENSION(:, :),
POINTER :: sphi_so
3388 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: intsgf
3395 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3398 CALL timeset(routinen, handle)
3400 NULLIFY (int_soc, basis, qs_kind_set, sphi_so, matrix_s, grid)
3401 NULLIFY (particle_set)
3404 CALL get_qs_env(qs_env, nkind=nkind, qs_kind_set=qs_kind_set, matrix_s=matrix_s, &
3405 particle_set=particle_set)
3408 CALL get_qs_kind_set(qs_kind_set, all_potential_present=all_potential_present)
3411 ALLOCATE (int_soc(nkind))
3413 CALL get_qs_kind(qs_kind_set(ikind), basis_set=basis, basis_type=
"ORB", zeff=zeff)
3414 IF (
PRESENT(soc_atom_env))
THEN
3415 grid => soc_atom_env%grid_atom_set(ikind)%grid_atom
3417 CALL get_qs_kind(qs_kind_set(ikind), grid_atom=grid)
3420 ALLOCATE (intso(nset*maxso, nset*maxso, 3))
3430 ALLOCATE (v(na, nr))
3433 CALL daxpy(na, vr(ir)/(4.0_dp*
c_light_au**2 - 2.0_dp*vr(ir)), grid%weight(:, ir), 1, &
3439 IF (
PRESENT(xas_atom_env))
THEN
3440 CALL integrate_so_dxdy_prod(intso, v, ikind, qs_env)
3442 CALL integrate_so_dxdy_prod(intso, v, ikind, qs_env, soc_atom_env)
3448 ALLOCATE (int_soc(ikind)%array(nsgf, nsgf, 3))
3449 intsgf => int_soc(ikind)%array
3450 IF (
PRESENT(xas_atom_env))
THEN
3451 sphi_so => xas_atom_env%orb_sphi_so(ikind)%array
3453 sphi_so => soc_atom_env%orb_sphi_so(ikind)%array
3458 CALL contract_so2sgf(intsgf(:, :, i), intso(:, :, i), basis, sphi_so)
3465 IF ((
PRESENT(xas_atom_env)) .OR. all_potential_present)
THEN
3467 CALL dbcsr_create(matrix_soc(i)%matrix, name=
"SOC MATRIX", template=matrix_s(1)%matrix, &
3468 matrix_type=dbcsr_type_antisymmetric)
3475 IF (.NOT. iat == jat) cycle
3476 ikind = particle_set(iat)%atomic_kind%kind_number
3479 CALL dbcsr_put_block(matrix_soc(i)%matrix, iat, iat, int_soc(ikind)%array(:, :, i))
3486 CALL dbcsr_create(matrix_soc(i)%matrix, name=
"SOC MATRIX", template=matrix_s(1)%matrix, &
3487 matrix_type=dbcsr_type_no_symmetry)
3488 CALL dbcsr_set(matrix_soc(i)%matrix, 0.0_dp)
3489 CALL dbcsr_copy(matrix_soc(i)%matrix, soc_atom_env%soc_pp(i, 1)%matrix)
3499 DEALLOCATE (int_soc(ikind)%array)
3501 DEALLOCATE (int_soc)
3503 CALL timestop(handle)
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
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 ab_contract(abint, sab, sphi_a, sphi_b, ncoa, ncob, nsgfa, nsgfb)
contract overlap integrals (a,b) and transfer to spherical Gaussians
Calculate the atomic operator matrices.
subroutine, public calculate_model_potential(modpot, grid, zcore)
Calculate model potential. It is useful to guess atomic orbitals.
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)
...
Handles all functions related to the CELL.
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_distribution_release(dist)
...
subroutine, public dbcsr_distribution_new(dist, template, group, pgrid, row_dist, col_dist, reuse_arrays)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_replicate_all(matrix)
...
subroutine, public dbcsr_get_stored_coordinates(matrix, row, column, processor)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_finalize(matrix)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_iterator_readonly_start(iterator, matrix, shared, dynamic, dynamic_byrows)
Like dbcsr_iterator_start() but with matrix being INTENT(IN). When invoking this routine,...
subroutine, public dbcsr_put_block(matrix, row, col, block, summation)
...
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)
...
Interface to (sca)lapack for the Cholesky based procedures.
subroutine, public cp_dbcsr_cholesky_decompose(matrix, n, para_env, blacs_env)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
subroutine, public cp_dbcsr_cholesky_invert(matrix, n, para_env, blacs_env, uplo_to_full)
used to replace the cholesky decomposition by the inverse
DBCSR operations in CP2K.
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
This is the start of a dbt_api, all publically needed functions are exported here....
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Generation of the spherical Lebedev grids. All Lebedev grids were generated with a precision of at le...
subroutine, public deallocate_lebedev_grids()
...
type(oh_grid), dimension(nlg), target, public lebedev_grid
integer function, public get_number_of_lebedev_grid(l, n)
Get the number of the Lebedev grid, which has the requested angular momentum quantnum number l or siz...
subroutine, public init_lebedev_grids()
Load the coordinates and weights of the nonredundant Lebedev grid points.
2- and 3-center electron repulsion integral routines based on libint2 Currently available operators: ...
Collection of simple mathematical functions and subroutines.
subroutine, public invmat_symm(a, potrf, uplo)
returns inverse of real symmetric, positive definite matrix
pure real(kind=dp) function, dimension(min(size(a, 1), size(a, 2))), public get_diag(a)
Return the diagonal elements of matrix a as a vector.
Utility routines for the memory handling.
Interface to the message passing library MPI.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:, :, :), allocatable, public co
integer, dimension(:), allocatable, public nco
integer, dimension(:), allocatable, public nsoset
integer, dimension(:, :), allocatable, public indso
integer, dimension(:), allocatable, public ncoset
integer, dimension(:, :), allocatable, public indco
integer, dimension(:), allocatable, public nso
Define methods related to particle_type.
subroutine, public get_particle_set(particle_set, qs_kind_set, first_sgf, last_sgf, nsgf, nmao, basis)
Get the components of a particle set.
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public c_light_au
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, 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, 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, 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, ecoul_1c, rho0_s_rs, rho0_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)
Get the QUICKSTEP environment.
subroutine, public allocate_grid_atom(grid_atom)
Initialize components of the grid_atom_type structure.
subroutine, public create_grid_atom(grid_atom, nr, na, llmax, ll, quadrature)
...
subroutine, public allocate_harmonics_atom(harmonics)
Allocate a spherical harmonics set for the atom grid.
subroutine, public get_maxl_cg(harmonics, orb_basis, llmax, max_s_harm)
...
subroutine, public create_harmonics_atom(harmonics, my_cg, na, llmax, maxs, max_s_harm, ll, wa, azi, pol)
...
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, 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, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr, npgf_seg)
Get attributes of an atomic kind set.
Define the neighbor list data types and the corresponding functionality.
subroutine, public release_neighbor_list_sets(nlists)
releases an array of neighbor_list_sets
Calculation of overlap matrix, its derivatives and forces.
subroutine, public build_overlap_matrix_simple(ks_env, matrix_s, basis_set_list_a, basis_set_list_b, sab_nl)
Calculation of the overlap matrix over Cartesian Gaussian functions.
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
Calculate spherical harmonics.
subroutine, public clebsch_gordon_init(l)
...
subroutine, public clebsch_gordon_deallocate()
...
All kind of helpful little routines.
pure integer function, dimension(2), public get_limit(m, n, me)
divide m entries into n parts, return size of part me
This module deals with all the integrals done on local atomic grids in xas_tdp. This is mostly used t...
subroutine, public calculate_density_coeffs(xas_atom_env, qs_env)
Compute the coefficients to project the density on a partial RI_XAS basis.
subroutine, public compute_sphi_so(ikind, basis_type, sphi_so, qs_env)
Computes the contraction coefficients to go from spherical orbitals to sgf for a given atomic kind an...
subroutine, public init_xas_atom_env(xas_atom_env, xas_tdp_env, xas_tdp_control, qs_env, ltddfpt)
Initializes a xas_atom_env type given the qs_enxas_atom_env, qs_envv.
subroutine, public integrate_soc_atoms(matrix_soc, xas_atom_env, qs_env, soc_atom_env)
Computes the SOC matrix elements with respect to the ORB basis set for each atomic kind and put them ...
subroutine, public truncate_radial_grid(grid_atom, max_radius)
Reduces the radial extension of an atomic grid such that it only covers a given radius.
subroutine, public init_xas_atom_grid_harmo(xas_atom_env, grid_info, do_xc, qs_env)
Initializes the atomic grids and harmonics for the RI atomic calculations.
subroutine, public integrate_fxc_atoms(int_fxc, xas_atom_env, xas_tdp_control, qs_env)
Integrate the xc kernel as a function of r on the atomic grids for the RI_XAS basis.
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 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 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...
Define XAS TDP control type and associated create, release, etc subroutines, as well as XAS TDP envir...
subroutine, public get_proc_batch_sizes(batch_size, nbatch, nex_atom, nprocs)
Uses heuristics to determine a good batching of the processros for fxc integration.
subroutine, public release_batch_info(batch_info)
Releases a batch_info type.
subroutine, public xc_rho_set_atom_update(rho_set, needs, nspins, bo)
...
Module with functions to handle derivative descriptors. derivative description are strings have the f...
integer, parameter, public deriv_norm_drho
integer, parameter, public deriv_norm_drhoa
integer, parameter, public deriv_rhob
integer, parameter, public deriv_rhoa
integer, parameter, public deriv_norm_drhob
represent a group ofunctional derivatives
type(xc_derivative_type) function, pointer, public xc_dset_get_derivative(derivative_set, description, allocate_deriv)
returns the requested xc_derivative
subroutine, public xc_dset_release(derivative_set)
releases a derivative set
subroutine, public xc_dset_create(derivative_set, pw_pool, local_bounds)
creates a derivative set object
Provides types for the management of the xc-functionals and their derivatives.
subroutine, public xc_derivative_get(deriv, split_desc, order, deriv_data, accept_null_data)
returns various information on the given derivative
type(xc_rho_cflags_type) function, public xc_functionals_get_needs(functionals, lsd, calc_potential)
...
subroutine, public xc_functionals_eval(functionals, lsd, rho_set, deriv_set, deriv_order)
...
subroutine, public xc_rho_set_create(rho_set, local_bounds, rho_cutoff, drho_cutoff, tau_cutoff)
allocates and does (minimal) initialization of a rho_set
subroutine, public xc_rho_set_release(rho_set, pw_pool)
releases the given rho_set
Exchange and Correlation functional calculations.
subroutine, public divide_by_norm_drho(deriv_set, rho_set, lsd)
divides derivatives from deriv_set by norm_drho
Type defining parameters related to the simulation cell.
represent a pointer to a 1d array
represent a pointer to a 1d array
represent a pointer to a 2d array
represent a pointer to a 3d array
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.
keeps the density in various representations, keeping track of which ones are valid.
a environment type that contains all the info needed for XAS_TDP atomic grid calculations
Type containing control information for TDP XAS calculations.
Type containing informations such as inputs and results for TDP XAS calculations.
A derivative set contains the different derivatives of a xc-functional in form of a linked list.
represent a derivative of a functional
contains a flag for each component of xc_rho_set, so that you can use it to tell which components you...
represent a density, with all the representation and data needed to perform a functional evaluation