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,&
132#include "./base/base_uses.f90"
138 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xas_tdp_atom'
164 LOGICAL,
OPTIONAL :: ltddfpt
166 CHARACTER(len=*),
PARAMETER :: routinen =
'init_xas_atom_env'
168 INTEGER :: handle, ikind, natom, nex_atoms, &
169 nex_kinds, nkind, nspins
172 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
174 NULLIFY (qs_kind_set, particle_set)
176 CALL timeset(routinen, handle)
179 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, natom=natom, particle_set=particle_set)
181 nkind =
SIZE(qs_kind_set)
182 nex_kinds = xas_tdp_env%nex_kinds
183 nex_atoms = xas_tdp_env%nex_atoms
184 do_xc = xas_tdp_control%do_xc
185 IF (
PRESENT(ltddfpt))
THEN
186 IF (ltddfpt) do_xc = .false.
188 nspins = 1;
IF (xas_tdp_control%do_uks .OR. xas_tdp_control%do_roks) nspins = 2
190 xas_atom_env%nspins = nspins
191 xas_atom_env%ri_radius = xas_tdp_control%ri_radius
192 ALLOCATE (xas_atom_env%grid_atom_set(nkind))
193 ALLOCATE (xas_atom_env%harmonics_atom_set(nkind))
194 ALLOCATE (xas_atom_env%ri_sphi_so(nkind))
195 ALLOCATE (xas_atom_env%orb_sphi_so(nkind))
197 ALLOCATE (xas_atom_env%gr(nkind))
198 ALLOCATE (xas_atom_env%ga(nkind))
199 ALLOCATE (xas_atom_env%dgr1(nkind))
200 ALLOCATE (xas_atom_env%dgr2(nkind))
201 ALLOCATE (xas_atom_env%dga1(nkind))
202 ALLOCATE (xas_atom_env%dga2(nkind))
205 xas_atom_env%excited_atoms => xas_tdp_env%ex_atom_indices
206 xas_atom_env%excited_kinds => xas_tdp_env%ex_kind_indices
213 NULLIFY (xas_atom_env%orb_sphi_so(ikind)%array, xas_atom_env%ri_sphi_so(ikind)%array)
214 CALL compute_sphi_so(ikind,
"ORB", xas_atom_env%orb_sphi_so(ikind)%array, qs_env)
215 IF (any(xas_atom_env%excited_kinds == ikind))
THEN
216 CALL compute_sphi_so(ikind,
"RI_XAS", xas_atom_env%ri_sphi_so(ikind)%array, qs_env)
221 IF (do_xc .AND. (.NOT. xas_tdp_control%xps_only))
THEN
225 CALL timestop(handle)
241 CHARACTER(len=default_string_length), &
242 DIMENSION(:, :),
POINTER :: grid_info
243 LOGICAL,
INTENT(IN) :: do_xc
246 CHARACTER(LEN=default_string_length) :: kind_name
247 INTEGER :: igrid, ikind, la, ll, llmax, max_s_harm, &
248 max_s_set, maxl, maxlgto, maxs, na, &
250 REAL(
dp) :: kind_radius
251 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: my_cg
257 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
259 NULLIFY (my_cg, qs_kind_set, tmp_basis, grid_atom, harmonics, qs_control, dft_control)
262 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, dft_control=dft_control)
264 CALL get_qs_kind_set(qs_kind_set, maxlgto=maxlgto, basis_type=
"RI_XAS")
268 qs_control => dft_control%qs_control
272 max_s_harm =
nsoset(llmax)
273 max_s_set =
nsoset(maxlgto)
279 quadrature = qs_control%gapw_control%quadrature
281 DO ikind = 1,
SIZE(xas_atom_env%grid_atom_set)
284 NULLIFY (xas_atom_env%grid_atom_set(ikind)%grid_atom)
285 NULLIFY (xas_atom_env%harmonics_atom_set(ikind)%harmonics_atom)
289 NULLIFY (grid_atom, harmonics)
290 grid_atom => xas_atom_env%grid_atom_set(ikind)%grid_atom
291 harmonics => xas_atom_env%harmonics_atom_set(ikind)%harmonics_atom
294 CALL get_qs_kind(qs_kind_set(ikind), ngrid_rad=nr, ngrid_ang=na, name=kind_name)
297 IF (any(grid_info == kind_name))
THEN
298 DO igrid = 1,
SIZE(grid_info, 1)
299 IF (grid_info(igrid, 1) == kind_name)
THEN
302 READ (grid_info(igrid, 2), *, iostat=stat) na
303 IF (stat /= 0) cpabort(
"The 'na' value for the GRID keyword must be an integer")
304 READ (grid_info(igrid, 3), *, iostat=stat) nr
305 IF (stat /= 0) cpabort(
"The 'nr' value for the GRID keyword must be an integer")
309 ELSE IF (do_xc .AND. any(xas_atom_env%excited_kinds == ikind))
THEN
311 cpwarn(
"The default (and possibly small) GAPW grid is being used for one excited KIND")
317 grid_atom%ng_sphere = na
321 IF (any(xas_atom_env%excited_kinds == ikind) .AND. do_xc)
THEN
322 CALL get_qs_kind(qs_kind_set(ikind), basis_set=tmp_basis, basis_type=
"RI_XAS")
324 CALL get_qs_kind(qs_kind_set(ikind), basis_set=tmp_basis, basis_type=
"ORB")
326 CALL get_gto_basis_set(gto_basis_set=tmp_basis, maxl=maxl, kind_radius=kind_radius)
333 my_cg, na, llmax, maxs, max_s_harm, ll, grid_atom%wa, &
334 grid_atom%azi, grid_atom%pol)
335 CALL get_maxl_cg(harmonics, tmp_basis, llmax, max_s_harm)
354 REAL(
dp),
INTENT(IN) :: max_radius
356 INTEGER :: first_ir, ir, llmax_p1, na, new_nr, nr
359 na = grid_atom%ng_sphere
360 llmax_p1 =
SIZE(grid_atom%rad2l, 2) - 1
364 IF (grid_atom%rad(ir) < max_radius)
THEN
369 new_nr = nr - first_ir + 1
372 grid_atom%nr = new_nr
374 grid_atom%rad(1:new_nr) = grid_atom%rad(first_ir:nr)
375 grid_atom%rad2(1:new_nr) = grid_atom%rad2(first_ir:nr)
376 grid_atom%wr(1:new_nr) = grid_atom%wr(first_ir:nr)
377 grid_atom%weight(:, 1:new_nr) = grid_atom%weight(:, first_ir:nr)
378 grid_atom%rad2l(1:new_nr, :) = grid_atom%rad2l(first_ir:nr, :)
379 grid_atom%oorad2l(1:new_nr, :) = grid_atom%oorad2l(first_ir:nr, :)
384 CALL reallocate(grid_atom%weight, 1, na, 1, new_nr)
385 CALL reallocate(grid_atom%rad2l, 1, new_nr, 0, llmax_p1)
386 CALL reallocate(grid_atom%oorad2l, 1, new_nr, 0, llmax_p1)
400 INTEGER,
INTENT(IN) :: ikind
401 CHARACTER(len=*),
INTENT(IN) :: basis_type
402 REAL(
dp),
DIMENSION(:, :),
POINTER :: sphi_so
405 INTEGER :: ico, ipgf, iset, iso, l, lx, ly, lz, &
406 maxso, nset, sgfi, start_c, start_s
407 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf, nsgf_set
408 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgf
410 REAL(
dp),
DIMENSION(:, :),
POINTER :: sphi
412 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
414 NULLIFY (basis, lmax, lmin, npgf, nsgf_set, qs_kind_set, first_sgf, sphi)
416 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
417 CALL get_qs_kind(qs_kind_set(ikind), basis_set=basis, basis_type=basis_type)
418 CALL get_gto_basis_set(basis, lmax=lmax, nset=nset, npgf=npgf, maxso=maxso, lmin=lmin, &
419 nsgf_set=nsgf_set, sphi=sphi, first_sgf=first_sgf)
421 ALLOCATE (sphi_so(maxso, sum(nsgf_set)))
425 sgfi = first_sgf(1, iset)
426 DO ipgf = 1, npgf(iset)
427 start_s = (ipgf - 1)*
nsoset(lmax(iset))
428 start_c = (ipgf - 1)*
ncoset(lmax(iset))
429 DO l = lmin(iset), lmax(iset)
438 sphi_so(start_s +
nsoset(l - 1) + iso, sgfi:sgfi + nsgf_set(iset) - 1) = &
439 sphi_so(start_s +
nsoset(l - 1) + iso, sgfi:sgfi + nsgf_set(iset) - 1) + &
440 factor*sphi(start_c +
ncoset(l - 1) + ico, sgfi:sgfi + nsgf_set(iset) - 1)
461 SUBROUTINE find_neighbors(base_atoms, mat_s, radius, qs_env, all_neighbors, neighbor_set)
463 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: base_atoms
467 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: all_neighbors
469 POINTER :: neighbor_set
471 INTEGER :: i, iat, ibase, iblk, jblk, mepos, natom, &
473 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: blk_to_base, inb, who_is_there
474 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: n_neighbors
475 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: is_base_atom
476 REAL(
dp) :: dist2, rad2, ri(3), rij(3), rj(3)
483 NULLIFY (particle_set, para_env, my_neighbor_set, cell)
486 CALL get_qs_env(qs_env, para_env=para_env, natom=natom, particle_set=particle_set, cell=cell)
487 mepos = para_env%mepos
488 nbase =
SIZE(base_atoms)
490 ALLOCATE (my_neighbor_set(nbase))
493 ALLOCATE (blk_to_base(natom), is_base_atom(natom))
494 blk_to_base = 0; is_base_atom = .false.
496 blk_to_base(base_atoms(ibase)) = ibase
497 is_base_atom(base_atoms(ibase)) = .true.
501 ALLOCATE (n_neighbors(nbase, 0:para_env%num_pe - 1))
510 IF (iblk == jblk) cycle
513 ri =
pbc(particle_set(iblk)%r, cell)
514 rj =
pbc(particle_set(jblk)%r, cell)
515 rij =
pbc(ri, rj, cell)
517 IF (dist2 > rad2) cycle
519 IF (is_base_atom(iblk))
THEN
520 ibase = blk_to_base(iblk)
521 n_neighbors(ibase, mepos) = n_neighbors(ibase, mepos) + 1
523 IF (is_base_atom(jblk))
THEN
524 ibase = blk_to_base(jblk)
525 n_neighbors(ibase, mepos) = n_neighbors(ibase, mepos) + 1
530 CALL para_env%sum(n_neighbors)
534 ALLOCATE (my_neighbor_set(ibase)%array(sum(n_neighbors(ibase, :))))
535 my_neighbor_set(ibase)%array = 0
540 ALLOCATE (inb(nbase))
545 IF (iblk == jblk) cycle
548 ri =
pbc(particle_set(iblk)%r, cell)
549 rj =
pbc(particle_set(jblk)%r, cell)
550 rij =
pbc(ri, rj, cell)
552 IF (dist2 > rad2) cycle
554 IF (is_base_atom(iblk))
THEN
555 ibase = blk_to_base(iblk)
556 my_neighbor_set(ibase)%array(sum(n_neighbors(ibase, 0:mepos - 1)) + inb(ibase)) = jblk
557 inb(ibase) = inb(ibase) + 1
559 IF (is_base_atom(jblk))
THEN
560 ibase = blk_to_base(jblk)
561 my_neighbor_set(ibase)%array(sum(n_neighbors(ibase, 0:mepos - 1)) + inb(ibase)) = iblk
562 inb(ibase) = inb(ibase) + 1
570 CALL para_env%sum(my_neighbor_set(ibase)%array)
574 IF (
PRESENT(all_neighbors))
THEN
575 ALLOCATE (who_is_there(natom))
579 who_is_there(base_atoms(ibase)) = 1
580 DO nb = 1,
SIZE(my_neighbor_set(ibase)%array)
581 who_is_there(my_neighbor_set(ibase)%array(nb)) = 1
585 ALLOCATE (all_neighbors(natom))
588 IF (who_is_there(iat) == 1)
THEN
590 all_neighbors(i) = iat
597 IF (
PRESENT(neighbor_set))
THEN
598 neighbor_set => my_neighbor_set
601 DEALLOCATE (my_neighbor_set(ibase)%array)
603 DEALLOCATE (my_neighbor_set)
606 END SUBROUTINE find_neighbors
620 SUBROUTINE get_exat_ri_sinv(ri_sinv, whole_s, neighbors, idx_to_nb, basis_set_ri, qs_env)
623 INTEGER,
DIMENSION(:),
INTENT(IN) :: neighbors, idx_to_nb
627 CHARACTER(len=*),
PARAMETER :: routinen =
'get_exat_ri_sinv'
629 INTEGER :: blk, dest, group_handle, handle, iat, &
630 ikind, inb, ir, is, jat, jnb, natom, &
631 nnb, npcols, nprows, source, tag
632 INTEGER,
DIMENSION(:),
POINTER :: col_dist, nsgf, row_dist
633 INTEGER,
DIMENSION(:, :),
POINTER :: pgrid
634 LOGICAL :: found_risinv, found_whole
635 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: is_neighbor
636 REAL(
dp) :: ri(3), rij(3), rj(3)
637 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: radius
638 REAL(
dp),
DIMENSION(:, :),
POINTER :: block_risinv, block_whole
640 TYPE(
cp_2d_r_p_type),
ALLOCATABLE,
DIMENSION(:) :: recv_buff, send_buff
650 NULLIFY (pgrid, dbcsr_dist, row_dist, col_dist, nsgf, particle_set, block_whole, block_risinv)
651 NULLIFY (cell, para_env, blacs_env)
653 CALL timeset(routinen, handle)
655 CALL get_qs_env(qs_env, dbcsr_dist=dbcsr_dist, particle_set=particle_set, natom=natom, &
656 para_env=para_env, blacs_env=blacs_env, cell=cell)
657 nnb =
SIZE(neighbors)
658 ALLOCATE (nsgf(nnb), is_neighbor(natom), radius(nnb))
659 is_neighbor = .false.
662 ikind = particle_set(iat)%atomic_kind%kind_number
663 CALL get_gto_basis_set(basis_set_ri(ikind)%gto_basis_set, nsgf=nsgf(inb), kind_radius=radius(inb))
664 is_neighbor(iat) = .true.
669 CALL group%set_handle(group_handle)
671 ALLOCATE (row_dist(nnb), col_dist(nnb))
673 row_dist(inb) =
modulo(nprows - inb, nprows)
674 col_dist(inb) =
modulo(npcols - inb, npcols)
680 CALL dbcsr_create(matrix=ri_sinv, name=
"RI_SINV", matrix_type=dbcsr_type_symmetric, &
681 dist=sinv_dist, row_blk_size=nsgf, col_blk_size=nsgf)
684 ri =
pbc(particle_set(neighbors(inb))%r, cell)
688 rj =
pbc(particle_set(neighbors(jnb))%r, cell)
689 rij =
pbc(ri, rj, cell)
690 IF (sum(rij**2) > (radius(inb) + radius(jnb))**2) cycle
693 IF (para_env%mepos == blk)
THEN
694 ALLOCATE (block_risinv(nsgf(inb), nsgf(jnb)))
695 block_risinv = 0.0_dp
697 DEALLOCATE (block_risinv)
704 DEALLOCATE (row_dist, col_dist)
708 ALLOCATE (send_buff(nnb**2), recv_buff(nnb**2))
709 ALLOCATE (send_req(nnb**2), recv_req(nnb**2))
720 IF (.NOT. found_whole) cycle
721 IF (.NOT. is_neighbor(iat)) cycle
722 IF (.NOT. is_neighbor(jat)) cycle
729 IF (found_risinv)
THEN
730 CALL dcopy(nsgf(inb)*nsgf(jnb), block_whole, 1, block_risinv, 1)
736 send_buff(is)%array => block_whole
737 tag = natom*inb + jnb
738 CALL group%isend(msgin=send_buff(is)%array, dest=dest, request=send_req(is), tag=tag)
752 IF (.NOT. found_risinv) cycle
759 IF (para_env%mepos == source) cycle
761 tag = natom*inb + jnb
763 recv_buff(ir)%array => block_risinv
764 CALL group%irecv(msgout=recv_buff(ir)%array, source=source, request=recv_req(ir), &
779 IF (found_risinv)
THEN
793 CALL timestop(handle)
795 END SUBROUTINE get_exat_ri_sinv
813 CHARACTER(len=*),
PARAMETER :: routinen =
'calculate_density_coeffs'
815 INTEGER :: exat, handle, i, iat, iatom, iex, inb, &
816 ind(3), ispin, jatom, jnb, katom, &
817 natom, nex, nkind, nnb, nspins, &
819 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: blk_size_orb, blk_size_ri, idx_to_nb, &
821 INTEGER,
DIMENSION(:),
POINTER :: all_ri_atoms
822 LOGICAL :: pmat_found, pmat_foundt, sinv_found, &
823 sinv_foundt, tensor_found, unique
824 REAL(
dp) :: factor, prefac
825 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: work2
826 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: work1
827 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: t_block
828 REAL(
dp),
DIMENSION(:, :),
POINTER :: pmat_block, pmat_blockt, sinv_block, &
832 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: overlap, rho_ao
835 TYPE(dbt_iterator_type) :: iter
836 TYPE(dbt_type) :: pqx
838 TYPE(libint_potential_type) :: pot
841 POINTER :: ab_list, ac_list, sab_ri
843 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
846 NULLIFY (qs_kind_set, basis_set_ri, basis_set_orb, ac_list, rho, rho_ao, sab_ri, ri_mats)
847 NULLIFY (particle_set, para_env, all_ri_atoms, overlap, pmat_blockt)
848 NULLIFY (blacs_env, pmat_block, ab_list, dbcsr_dist, sinv_block, sinv_blockt)
858 CALL timeset(routinen, handle)
860 CALL get_qs_env(qs_env, nkind=nkind, qs_kind_set=qs_kind_set, rho=rho, &
861 natom=natom, particle_set=particle_set, dbcsr_dist=dbcsr_dist, &
862 para_env=para_env, blacs_env=blacs_env)
863 nspins = xas_atom_env%nspins
864 nex =
SIZE(xas_atom_env%excited_atoms)
868 ALLOCATE (basis_set_ri(nkind))
869 ALLOCATE (basis_set_orb(nkind))
876 ri_mats => overlap(1)%matrix
880 CALL find_neighbors(xas_atom_env%excited_atoms, ri_mats, xas_atom_env%ri_radius, &
881 qs_env, all_neighbors=all_ri_atoms, neighbor_set=xas_atom_env%exat_neighbors)
884 factor = 0.5_dp;
IF (nspins == 2) factor = 1.0_dp
889 ALLOCATE (blk_size_ri(natom))
890 CALL get_particle_set(particle_set, qs_kind_set, nsgf=blk_size_ri, basis=basis_set_ri)
891 ALLOCATE (xas_atom_env%ri_dcoeff(natom, nspins, nex))
895 NULLIFY (xas_atom_env%ri_dcoeff(iat, ispin, iex)%array)
896 IF ((.NOT. any(xas_atom_env%exat_neighbors(iex)%array == iat)) &
897 .AND. (.NOT. xas_atom_env%excited_atoms(iex) == iat)) cycle
898 ALLOCATE (xas_atom_env%ri_dcoeff(iat, ispin, iex)%array(blk_size_ri(iat)))
899 xas_atom_env%ri_dcoeff(iat, ispin, iex)%array = 0.0_dp
905 IF (output_unit > 0)
THEN
906 WRITE (output_unit, fmt=
"(/,T7,A,/,T7,A)") &
907 "Excited atom, natoms in RI_REGION:", &
908 "---------------------------------"
914 ALLOCATE (blk_size_orb(natom))
915 CALL get_particle_set(particle_set, qs_kind_set, nsgf=blk_size_orb, basis=basis_set_orb)
920 exat = xas_atom_env%excited_atoms(iex)
921 nnb = 1 +
SIZE(xas_atom_env%exat_neighbors(iex)%array)
922 ALLOCATE (neighbors(nnb))
924 neighbors(2:nnb) = xas_atom_env%exat_neighbors(iex)%array(:)
928 ALLOCATE (idx_to_nb(natom))
931 idx_to_nb(neighbors(inb)) = inb
934 IF (output_unit > 0)
THEN
935 WRITE (output_unit, fmt=
"(T7,I12,I21)") &
943 qs_env, excited_atoms=neighbors)
948 CALL create_pqx_tensor(pqx, ab_list, ac_list, dbcsr_dist, blk_size_orb, blk_size_orb, &
950 CALL fill_pqx_tensor(pqx, ab_list, ac_list, basis_set_orb, basis_set_orb, basis_set_ri, &
955 CALL get_exat_ri_sinv(ri_sinv, ri_mats, neighbors, idx_to_nb, basis_set_ri, qs_env)
965 CALL dbt_iterator_start(iter, pqx)
966 DO WHILE (dbt_iterator_blocks_left(iter))
967 CALL dbt_iterator_next_block(iter, ind)
968 CALL dbt_get_block(pqx, ind, t_block, tensor_found)
973 inb = idx_to_nb(katom)
977 IF (iatom == jatom) prefac = 1.0_dp
982 CALL dbcsr_get_block_p(rho_ao(ispin)%matrix, iatom, jatom, pmat_block, pmat_found)
983 CALL dbcsr_get_block_p(rho_ao(ispin)%matrix, jatom, iatom, pmat_blockt, pmat_foundt)
984 IF ((.NOT. pmat_found) .AND. (.NOT. pmat_foundt)) cycle
986 ALLOCATE (work1(blk_size_ri(katom), 1))
991 DO i = 1, blk_size_ri(katom)
992 work1(i, 1) = prefac*sum(pmat_block(:, :)*t_block(:, :, i))
995 DO i = 1, blk_size_ri(katom)
996 work1(i, 1) = prefac*sum(transpose(pmat_blockt(:, :))*t_block(:, :, i))
1003 ri_at = neighbors(jnb)
1008 IF ((.NOT. sinv_found) .AND. (.NOT. sinv_foundt)) cycle
1011 ALLOCATE (work2(
SIZE(xas_atom_env%ri_dcoeff(ri_at, ispin, iex)%array)))
1014 IF (sinv_found)
THEN
1015 DO i = 1, blk_size_ri(katom)
1016 work2(:) = work2(:) + factor*work1(i, 1)*sinv_block(i, :)
1019 DO i = 1, blk_size_ri(katom)
1020 work2(:) = work2(:) + factor*work1(i, 1)*sinv_blockt(:, i)
1023 DO i = 1,
SIZE(work2)
1025 xas_atom_env%ri_dcoeff(ri_at, ispin, iex)%array(i) = &
1026 xas_atom_env%ri_dcoeff(ri_at, ispin, iex)%array(i) + work2(i)
1035 DEALLOCATE (t_block)
1037 CALL dbt_iterator_stop(iter)
1042 CALL dbt_destroy(pqx)
1045 DEALLOCATE (neighbors, idx_to_nb)
1051 DO ispin = 1, nspins
1053 IF ((.NOT. any(xas_atom_env%exat_neighbors(iex)%array == iat)) &
1054 .AND. (.NOT. xas_atom_env%excited_atoms(iex) == iat)) cycle
1055 CALL para_env%sum(xas_atom_env%ri_dcoeff(iat, ispin, iex)%array)
1062 DEALLOCATE (basis_set_ri, basis_set_orb, all_ri_atoms)
1064 CALL timestop(handle)
1080 SUBROUTINE put_density_on_atomic_grid(rho_set, ri_dcoeff, atom_kind, do_gga, batch_info, &
1081 xas_atom_env, qs_env)
1085 INTEGER,
INTENT(IN) :: atom_kind
1086 LOGICAL,
INTENT(IN) :: do_gga
1091 CHARACTER(len=*),
PARAMETER :: routinen =
'put_density_on_atomic_grid'
1093 INTEGER :: dir, handle, ipgf, iset, iso, iso_proc, &
1094 ispin, maxso, n, na, nr, nset, nsgfi, &
1095 nsoi, nspins, sgfi, starti
1096 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf, nsgf_set
1097 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgf
1098 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: so
1099 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: dso
1100 REAL(
dp),
DIMENSION(:, :),
POINTER :: dgr1, dgr2, ga, gr, ri_sphi_so, zet
1101 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: dga1, dga2, rhoa, rhob
1105 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1107 NULLIFY (grid_atom, ri_basis, qs_kind_set, lmax, npgf, zet, nsgf_set, ri_sphi_so)
1108 NULLIFY (lmin, first_sgf, rhoa, rhob, ga, gr, dgr1, dgr2, dga1, dga2, ri_dcoeff_so)
1110 CALL timeset(routinen, handle)
1118 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
1119 CALL get_qs_kind(qs_kind_set(atom_kind), basis_set=ri_basis, basis_type=
"RI_XAS")
1120 CALL get_gto_basis_set(ri_basis, lmax=lmax, npgf=npgf, zet=zet, nset=nset, nsgf_set=nsgf_set, &
1121 first_sgf=first_sgf, lmin=lmin, maxso=maxso)
1124 grid_atom => xas_atom_env%grid_atom_set(atom_kind)%grid_atom
1125 na = grid_atom%ng_sphere
1128 nspins = xas_atom_env%nspins
1129 ri_sphi_so => xas_atom_env%ri_sphi_so(atom_kind)%array
1132 rhoa => rho_set%rhoa
1133 rhob => rho_set%rhob
1134 rhoa = 0.0_dp; rhob = 0.0_dp
1137 rho_set%drhoa(dir)%array = 0.0_dp
1138 rho_set%drhob(dir)%array = 0.0_dp
1143 ga => xas_atom_env%ga(atom_kind)%array
1144 gr => xas_atom_env%gr(atom_kind)%array
1146 dga1 => xas_atom_env%dga1(atom_kind)%array
1147 dga2 => xas_atom_env%dga2(atom_kind)%array
1148 dgr1 => xas_atom_env%dgr1(atom_kind)%array
1149 dgr2 => xas_atom_env%dgr2(atom_kind)%array
1151 dga1 => xas_atom_env%dga1(atom_kind)%array
1152 dga2 => xas_atom_env%dga2(atom_kind)%array
1153 dgr1 => xas_atom_env%dgr1(atom_kind)%array
1154 dgr2 => xas_atom_env%dgr2(atom_kind)%array
1158 ALLOCATE (ri_dcoeff_so(nspins))
1159 DO ispin = 1, nspins
1160 ALLOCATE (ri_dcoeff_so(ispin)%array(nset*maxso))
1161 ri_dcoeff_so(ispin)%array = 0.0_dp
1165 sgfi = first_sgf(1, iset)
1166 nsoi = npgf(iset)*
nsoset(lmax(iset))
1167 nsgfi = nsgf_set(iset)
1169 CALL dgemv(
'N', nsoi, nsgfi, 1.0_dp, ri_sphi_so(1:nsoi, sgfi:sgfi + nsgfi - 1), nsoi, &
1170 ri_dcoeff(ispin)%array(sgfi:sgfi + nsgfi - 1), 1, 0.0_dp, &
1171 ri_dcoeff_so(ispin)%array((iset - 1)*maxso + 1:(iset - 1)*maxso + nsoi), 1)
1177 ALLOCATE (so(na, nr))
1178 IF (do_gga)
ALLOCATE (dso(na, nr, 3))
1181 DO iso_proc = 1, batch_info%nso_proc(atom_kind)
1182 iset = batch_info%so_proc_info(atom_kind)%array(1, iso_proc)
1183 ipgf = batch_info%so_proc_info(atom_kind)%array(2, iso_proc)
1184 iso = batch_info%so_proc_info(atom_kind)%array(3, iso_proc)
1187 starti = (iset - 1)*maxso + (ipgf - 1)*
nsoset(lmax(iset))
1190 CALL dgemm(
'N',
'T', na, nr, 1, 1.0_dp, ga(:, iso_proc:iso_proc), na, &
1191 gr(:, iso_proc:iso_proc), nr, 0.0_dp, so(:, :), na)
1197 CALL dgemm(
'N',
'T', na, nr, 1, 1.0_dp, dga1(:, iso_proc:iso_proc, dir), na, &
1198 dgr1(:, iso_proc:iso_proc), nr, 0.0_dp, dso(:, :, dir), na)
1199 CALL dgemm(
'N',
'T', na, nr, 1, 1.0_dp, dga2(:, iso_proc:iso_proc, dir), na, &
1200 dgr2(:, iso_proc:iso_proc), nr, 1.0_dp, dso(:, :, dir), na)
1205 CALL daxpy(n, ri_dcoeff_so(1)%array(starti + iso), so, 1, rhoa(:, :, 1), 1)
1207 IF (nspins == 2)
THEN
1208 CALL daxpy(n, ri_dcoeff_so(2)%array(starti + iso), so, 1, rhob(:, :, 1), 1)
1215 CALL daxpy(n, ri_dcoeff_so(1)%array(starti + iso), dso(:, :, dir), &
1216 1, rho_set%drhoa(dir)%array(:, :, 1), 1)
1218 IF (nspins == 2)
THEN
1219 CALL daxpy(n, ri_dcoeff_so(2)%array(starti + iso), dso(:, :, dir), &
1220 1, rho_set%drhob(dir)%array(:, :, 1), 1)
1228 IF (nspins == 1)
THEN
1229 CALL dcopy(n, rhoa(:, :, 1), 1, rhob(:, :, 1), 1)
1233 CALL dcopy(n, rho_set%drhoa(dir)%array(:, :, 1), 1, rho_set%drhob(dir)%array(:, :, 1), 1)
1241 DO ispin = 1, nspins
1242 DEALLOCATE (ri_dcoeff_so(ispin)%array)
1244 DEALLOCATE (ri_dcoeff_so)
1246 CALL timestop(handle)
1248 END SUBROUTINE put_density_on_atomic_grid
1267 SUBROUTINE put_density_on_other_grid(rho_set, ri_dcoeff, source_iat, source_ikind, target_iat, &
1268 target_ikind, sr, er, do_gga, xas_atom_env, qs_env)
1272 INTEGER,
INTENT(IN) :: source_iat, source_ikind, target_iat, &
1273 target_ikind, sr, er
1274 LOGICAL,
INTENT(IN) :: do_gga
1278 CHARACTER(len=*),
PARAMETER :: routinen =
'put_density_on_other_grid'
1280 INTEGER :: dir, handle, ia, ico, ipgf, ir, iset, &
1281 isgf, lx, ly, lz, n, na, nr, nset, &
1283 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf, nsgf_set
1284 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgf
1286 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: sgf
1287 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) ::
co, dsgf, pos
1288 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :, :) :: dco
1289 REAL(
dp),
DIMENSION(3) :: rs, rst, rt
1290 REAL(
dp),
DIMENSION(:, :),
POINTER :: ri_sphi, zet
1291 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: rhoa, rhob
1297 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1299 NULLIFY (qs_kind_set, ri_basis, lmax, npgf, nsgf_set, lmin, zet, first_sgf, grid_atom)
1300 NULLIFY (harmonics, rhoa, rhob, particle_set, cell, ri_sphi)
1307 CALL timeset(routinen, handle)
1310 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, particle_set=particle_set, cell=cell)
1312 CALL get_qs_kind(qs_kind_set(source_ikind), basis_set=ri_basis, basis_type=
"RI_XAS")
1313 CALL get_gto_basis_set(ri_basis, lmax=lmax, npgf=npgf, zet=zet, nset=nset, nsgf_set=nsgf_set, &
1314 first_sgf=first_sgf, lmin=lmin, sphi=ri_sphi)
1317 grid_atom => xas_atom_env%grid_atom_set(target_ikind)%grid_atom
1318 harmonics => xas_atom_env%harmonics_atom_set(target_ikind)%harmonics_atom
1319 na = grid_atom%ng_sphere
1322 nspins = xas_atom_env%nspins
1325 rhoa => rho_set%rhoa
1326 rhob => rho_set%rhob
1329 rs =
pbc(particle_set(source_iat)%r, cell)
1330 rt =
pbc(particle_set(target_iat)%r, cell)
1331 rst =
pbc(rs, rt, cell)
1334 ALLOCATE (pos(na, sr:er, 4))
1340 pos(ia, ir, 1:3) = harmonics%a(:, ia)*grid_atom%rad(ir) + rst
1341 pos(ia, ir, 4) = pos(ia, ir, 1)**2 + pos(ia, ir, 2)**2 + pos(ia, ir, 3)**2
1350 ALLOCATE (
co(na, sr:er, npgf(iset)*
ncoset(lmax(iset))))
1351 IF (do_gga)
ALLOCATE (dco(na, sr:er, 3, npgf(iset)*
ncoset(lmax(iset))))
1360 co(ia, ir, :) = 0.0_dp
1362 dco(ia, ir, :, :) = 0.0_dp
1368 DO ipgf = 1, npgf(iset)
1369 start = (ipgf - 1)*
ncoset(lmax(iset))
1372 DO ico =
ncoset(lmin(iset) - 1) + 1,
ncoset(lmax(iset))
1381 rmom = exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1382 IF (lx /= 0) rmom = rmom*pos(ia, ir, 1)**lx
1383 IF (ly /= 0) rmom = rmom*pos(ia, ir, 2)**ly
1384 IF (lz /= 0) rmom = rmom*pos(ia, ir, 3)**lz
1385 co(ia, ir, start + ico) = rmom
1402 rmom = -2.0_dp*pos(ia, ir, 1)*zet(ipgf, iset)*exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1403 IF (ly /= 0) rmom = rmom*pos(ia, ir, 2)**ly
1404 IF (lz /= 0) rmom = rmom*pos(ia, ir, 3)**lz
1405 dco(ia, ir, 1, start + ico) = rmom
1417 rmom = (lx*pos(ia, ir, 1)**(lx - 1) - 2.0_dp*pos(ia, ir, 1)**(lx + 1)* &
1418 zet(ipgf, iset))*exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1420 rmom = (1.0_dp - 2.0_dp*pos(ia, ir, 1)**2*zet(ipgf, iset))* &
1421 exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1423 IF (ly /= 0) rmom = rmom*pos(ia, ir, 2)**ly
1424 IF (lz /= 0) rmom = rmom*pos(ia, ir, 3)**lz
1425 dco(ia, ir, 1, start + ico) = rmom
1440 rmom = -2.0_dp*pos(ia, ir, 2)*zet(ipgf, iset)*exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1441 IF (lx /= 0) rmom = rmom*pos(ia, ir, 1)**lx
1442 IF (lz /= 0) rmom = rmom*pos(ia, ir, 3)**lz
1443 dco(ia, ir, 2, start + ico) = rmom
1455 rmom = (ly*pos(ia, ir, 2)**(ly - 1) - 2.0_dp*pos(ia, ir, 2)**(ly + 1)*zet(ipgf, iset)) &
1456 *exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1458 rmom = (1.0_dp - 2.0_dp*pos(ia, ir, 2)**2*zet(ipgf, iset)) &
1459 *exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1461 IF (lx /= 0) rmom = rmom*pos(ia, ir, 1)**lx
1462 IF (lz /= 0) rmom = rmom*pos(ia, ir, 3)**lz
1463 dco(ia, ir, 2, start + ico) = rmom
1478 rmom = -2.0_dp*pos(ia, ir, 3)*zet(ipgf, iset)*exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1479 IF (lx /= 0) rmom = rmom*pos(ia, ir, 1)**lx
1480 IF (ly /= 0) rmom = rmom*pos(ia, ir, 2)**ly
1481 dco(ia, ir, 3, start + ico) = rmom
1493 rmom = (lz*pos(ia, ir, 3)**(lz - 1) - 2.0_dp*pos(ia, ir, 3)**(lz + 1)* &
1494 zet(ipgf, iset))*exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1496 rmom = (1.0_dp - 2.0_dp*pos(ia, ir, 3)**2*zet(ipgf, iset))* &
1497 exp(-zet(ipgf, iset)*pos(ia, ir, 4))
1499 IF (lx /= 0) rmom = rmom*pos(ia, ir, 1)**lx
1500 IF (ly /= 0) rmom = rmom*pos(ia, ir, 2)**ly
1501 dco(ia, ir, 3, start + ico) = rmom
1519 ALLOCATE (sgf(na, sr:er))
1520 IF (do_gga)
ALLOCATE (dsgf(na, sr:er, 3))
1521 sgfi = first_sgf(1, iset) - 1
1523 DO isgf = 1, nsgf_set(iset)
1525 IF (do_gga) dsgf = 0.0_dp
1527 DO ipgf = 1, npgf(iset)
1528 start = (ipgf - 1)*
ncoset(lmax(iset))
1529 DO ico =
ncoset(lmin(iset) - 1) + 1,
ncoset(lmax(iset))
1530 CALL daxpy(n, ri_sphi(start + ico, sgfi + isgf),
co(:, sr:er, start + ico), 1, sgf(:, sr:er), 1)
1535 CALL daxpy(n, ri_dcoeff(1)%array(sgfi + isgf), sgf(:, sr:er), 1, rhoa(:, sr:er, 1), 1)
1537 IF (nspins == 2)
THEN
1538 CALL daxpy(n, ri_dcoeff(2)%array(sgfi + isgf), sgf(:, sr:er), 1, rhob(:, sr:er, 1), 1)
1544 DO ipgf = 1, npgf(iset)
1545 start = (ipgf - 1)*
ncoset(lmax(iset))
1546 DO ico =
ncoset(lmin(iset) - 1) + 1,
ncoset(lmax(iset))
1548 CALL daxpy(n, ri_sphi(start + ico, sgfi + isgf), dco(:, sr:er, dir, start + ico), &
1549 1, dsgf(:, sr:er, dir), 1)
1555 CALL daxpy(n, ri_dcoeff(1)%array(sgfi + isgf), dsgf(:, sr:er, dir), 1, &
1556 rho_set%drhoa(dir)%array(:, sr:er, 1), 1)
1558 IF (nspins == 2)
THEN
1559 CALL daxpy(n, ri_dcoeff(2)%array(sgfi + isgf), dsgf(:, sr:er, dir), 1, &
1560 rho_set%drhob(dir)%array(:, sr:er, 1), 1)
1567 DEALLOCATE (
co, sgf)
1568 IF (do_gga)
DEALLOCATE (dco, dsgf)
1572 IF (nspins == 1)
THEN
1573 CALL dcopy(n, rhoa(:, sr:er, 1), 1, rhob(:, sr:er, 1), 1)
1577 CALL dcopy(n, rho_set%drhoa(dir)%array(:, sr:er, 1), 1, rho_set%drhob(dir)%array(:, sr:er, 1), 1)
1582 CALL timestop(handle)
1584 END SUBROUTINE put_density_on_other_grid
1593 SUBROUTINE compute_norm_drho(rho_set, atom_kind, xas_atom_env)
1596 INTEGER,
INTENT(IN) :: atom_kind
1599 INTEGER :: dir, ia, ir, n, na, nr, nspins
1601 na = xas_atom_env%grid_atom_set(atom_kind)%grid_atom%ng_sphere
1602 nr = xas_atom_env%grid_atom_set(atom_kind)%grid_atom%nr
1604 nspins = xas_atom_env%nspins
1606 rho_set%norm_drhoa = 0.0_dp
1607 rho_set%norm_drhob = 0.0_dp
1608 rho_set%norm_drho = 0.0_dp
1613 rho_set%norm_drhoa(ia, ir, 1) = rho_set%norm_drhoa(ia, ir, 1) &
1614 + rho_set%drhoa(dir)%array(ia, ir, 1)**2
1618 rho_set%norm_drhoa = sqrt(rho_set%norm_drhoa)
1620 IF (nspins == 1)
THEN
1622 CALL dcopy(n, rho_set%norm_drhoa(:, :, 1), 1, rho_set%norm_drhob(:, :, 1), 1)
1627 rho_set%norm_drhob(ia, ir, 1) = rho_set%norm_drhob(ia, ir, 1) &
1628 + rho_set%drhob(dir)%array(ia, ir, 1)**2
1632 rho_set%norm_drhob = sqrt(rho_set%norm_drhob)
1638 rho_set%norm_drho(ia, ir, 1) = rho_set%norm_drho(ia, ir, 1) + &
1639 (rho_set%drhoa(dir)%array(ia, ir, 1) + &
1640 rho_set%drhob(dir)%array(ia, ir, 1))**2
1644 rho_set%norm_drho = sqrt(rho_set%norm_drho)
1646 END SUBROUTINE compute_norm_drho
1657 SUBROUTINE precompute_so_dso(do_gga, batch_info, xas_atom_env, qs_env)
1659 LOGICAL,
INTENT(IN) :: do_gga
1664 CHARACTER(len=*),
PARAMETER :: routinen =
'precompute_so_dso'
1666 INTEGER :: bo(2), dir, handle, ikind, ipgf, iset, &
1667 iso, iso_proc, l, maxso, n, na, nkind, &
1668 nr, nset, nso_proc, nsotot, starti
1669 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf, nsgf_set
1670 INTEGER,
DIMENSION(:, :),
POINTER :: so_proc_info
1671 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: rexp
1672 REAL(
dp),
DIMENSION(:, :),
POINTER :: dgr1, dgr2, ga, gr, slm, zet
1673 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: dga1, dga2, dslm_dxyz
1678 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1680 NULLIFY (qs_kind_set, harmonics, grid_atom, slm, dslm_dxyz, ri_basis, lmax, lmin, npgf)
1681 NULLIFY (nsgf_set, zet, para_env, so_proc_info)
1683 CALL timeset(routinen, handle)
1685 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, para_env=para_env)
1686 nkind =
SIZE(qs_kind_set)
1688 ALLOCATE (batch_info%so_proc_info(nkind))
1689 ALLOCATE (batch_info%nso_proc(nkind))
1690 ALLOCATE (batch_info%so_bo(2, nkind))
1694 NULLIFY (xas_atom_env%ga(ikind)%array)
1695 NULLIFY (xas_atom_env%gr(ikind)%array)
1696 NULLIFY (xas_atom_env%dga1(ikind)%array)
1697 NULLIFY (xas_atom_env%dga2(ikind)%array)
1698 NULLIFY (xas_atom_env%dgr1(ikind)%array)
1699 NULLIFY (xas_atom_env%dgr2(ikind)%array)
1701 NULLIFY (batch_info%so_proc_info(ikind)%array)
1703 IF (.NOT. any(xas_atom_env%excited_kinds == ikind)) cycle
1706 harmonics => xas_atom_env%harmonics_atom_set(ikind)%harmonics_atom
1707 grid_atom => xas_atom_env%grid_atom_set(ikind)%grid_atom
1709 na = grid_atom%ng_sphere
1713 slm => harmonics%slm
1714 dslm_dxyz => harmonics%dslm_dxyz
1717 CALL get_qs_kind(qs_kind_set(ikind), basis_set=ri_basis, basis_type=
"RI_XAS")
1719 nsgf_set=nsgf_set, lmin=lmin, maxso=maxso)
1723 bo =
get_limit(nsotot, batch_info%batch_size, batch_info%ipe)
1724 nso_proc = bo(2) - bo(1) + 1
1725 batch_info%so_bo(:, ikind) = bo
1726 batch_info%nso_proc(ikind) = nso_proc
1729 ALLOCATE (batch_info%so_proc_info(ikind)%array(3, nso_proc))
1730 so_proc_info => batch_info%so_proc_info(ikind)%array
1733 DO ipgf = 1, npgf(iset)
1734 starti = (iset - 1)*maxso + (ipgf - 1)*
nsoset(lmax(iset))
1735 DO iso =
nsoset(lmin(iset) - 1) + 1,
nsoset(lmax(iset))
1738 IF (starti + iso < bo(1) .OR. starti + iso > bo(2)) cycle
1739 iso_proc = starti + iso - bo(1) + 1
1740 so_proc_info(1, iso_proc) = iset
1741 so_proc_info(2, iso_proc) = ipgf
1742 so_proc_info(3, iso_proc) = iso
1749 ALLOCATE (xas_atom_env%ga(ikind)%array(na, nso_proc))
1750 ALLOCATE (xas_atom_env%gr(ikind)%array(nr, nso_proc))
1751 xas_atom_env%ga(ikind)%array = 0.0_dp; xas_atom_env%gr(ikind)%array = 0.0_dp
1753 ALLOCATE (xas_atom_env%dga1(ikind)%array(na, nso_proc, 3))
1754 ALLOCATE (xas_atom_env%dgr1(ikind)%array(nr, nso_proc))
1755 ALLOCATE (xas_atom_env%dga2(ikind)%array(na, nso_proc, 3))
1756 ALLOCATE (xas_atom_env%dgr2(ikind)%array(nr, nso_proc))
1757 xas_atom_env%dga1(ikind)%array = 0.0_dp; xas_atom_env%dgr1(ikind)%array = 0.0_dp
1758 xas_atom_env%dga2(ikind)%array = 0.0_dp; xas_atom_env%dgr2(ikind)%array = 0.0_dp
1761 ga => xas_atom_env%ga(ikind)%array
1762 gr => xas_atom_env%gr(ikind)%array
1763 dga1 => xas_atom_env%dga1(ikind)%array
1764 dga2 => xas_atom_env%dga2(ikind)%array
1765 dgr1 => xas_atom_env%dgr1(ikind)%array
1766 dgr2 => xas_atom_env%dgr2(ikind)%array
1770 DO iso_proc = 1, nso_proc
1771 iset = so_proc_info(1, iso_proc)
1772 ipgf = so_proc_info(2, iso_proc)
1773 iso = so_proc_info(3, iso_proc)
1781 rexp(1:nr) = exp(-zet(ipgf, iset)*grid_atom%rad2(1:nr))
1782 gr(1:nr, iso_proc) = grid_atom%rad(1:nr)**l*rexp(1:nr)
1785 ga(1:na, iso_proc) = slm(1:na, iso)
1794 dgr1(1:nr, iso_proc) = grid_atom%rad(1:nr)**(l - 1)*rexp(1:nr)
1795 dgr2(1:nr, iso_proc) = -2.0_dp*zet(ipgf, iset)*grid_atom%rad(1:nr)**(l + 1)*rexp(1:nr)
1799 dga1(1:na, iso_proc, dir) = dslm_dxyz(dir, 1:na, iso)
1800 dga2(1:na, iso_proc, dir) = harmonics%a(dir, 1:na)*slm(1:na, iso)
1809 CALL timestop(handle)
1811 END SUBROUTINE precompute_so_dso
1830 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_fxc_atoms'
1832 INTEGER :: batch_size, dir, er, ex_bo(2), handle, i, iatom, ibatch, iex, ikind, inb, ipe, &
1833 mepos, na, natom, nb, nb_bo(2), nbatch, nbk, nex_atom, nr, num_pe, sr
1834 INTEGER,
DIMENSION(2, 3) :: bounds
1835 INTEGER,
DIMENSION(:),
POINTER :: exat_neighbors
1836 LOGICAL :: do_gga, do_sc, do_sf
1842 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1848 NULLIFY (particle_set, qs_kind_set, dft_control, para_env, exat_neighbors)
1849 NULLIFY (input, xc_functionals)
1851 CALL timeset(routinen, handle)
1854 CALL get_qs_env(qs_env, particle_set=particle_set, qs_kind_set=qs_kind_set, natom=natom, &
1855 dft_control=dft_control, input=input, para_env=para_env)
1856 ALLOCATE (int_fxc(natom, 4))
1859 NULLIFY (int_fxc(iatom, i)%array)
1862 nex_atom =
SIZE(xas_atom_env%excited_atoms)
1864 do_sc = xas_tdp_control%do_spin_cons .OR. xas_tdp_control%do_singlet .OR. xas_tdp_control%do_triplet
1865 do_sf = xas_tdp_control%do_spin_flip
1868 IF (qs_env%do_rixs)
THEN
1875 do_gga = needs%drho_spin
1880 num_pe = para_env%num_pe
1881 mepos = para_env%mepos
1887 ibatch = mepos/batch_size
1889 ipe =
modulo(mepos, batch_size)
1891 batch_info%batch_size = batch_size
1892 batch_info%nbatch = nbatch
1893 batch_info%ibatch = ibatch
1894 batch_info%ipe = ipe
1897 CALL batch_info%para_env%from_split(para_env, ibatch)
1901 CALL precompute_so_dso(do_gga, batch_info, xas_atom_env, qs_env)
1904 ex_bo =
get_limit(nex_atom, nbatch, ibatch)
1907 DO iex = ex_bo(1), ex_bo(2)
1909 iatom = xas_atom_env%excited_atoms(iex)
1910 ikind = particle_set(iatom)%atomic_kind%kind_number
1911 exat_neighbors => xas_atom_env%exat_neighbors(iex)%array
1912 ri_dcoeff => xas_atom_env%ri_dcoeff(:, :, iex)
1915 na = xas_atom_env%grid_atom_set(ikind)%grid_atom%ng_sphere
1916 nr = xas_atom_env%grid_atom_set(ikind)%grid_atom%nr
1919 bounds(1:2, 1:3) = 1
1924 rho_cutoff=dft_control%qs_control%eps_rho_rspace, &
1925 drho_cutoff=dft_control%qs_control%eps_rho_rspace)
1932 CALL put_density_on_atomic_grid(rho_set, ri_dcoeff(iatom, :), ikind, &
1933 do_gga, batch_info, xas_atom_env, qs_env)
1938 sr = nb_bo(1); er = nb_bo(2)
1939 DO inb = 1,
SIZE(exat_neighbors)
1941 nb = exat_neighbors(inb)
1942 nbk = particle_set(nb)%atomic_kind%kind_number
1943 CALL put_density_on_other_grid(rho_set, ri_dcoeff(nb, :), nb, nbk, iatom, &
1944 ikind, sr, er, do_gga, xas_atom_env, qs_env)
1949 CALL batch_info%para_env%sum(rho_set%rhoa)
1950 CALL batch_info%para_env%sum(rho_set%rhob)
1953 CALL batch_info%para_env%sum(rho_set%drhoa(dir)%array)
1954 CALL batch_info%para_env%sum(rho_set%drhob(dir)%array)
1959 IF (do_gga)
CALL compute_norm_drho(rho_set, ikind, xas_atom_env)
1962 CALL xc_functionals_eval(xc_functionals, lsd=.true., rho_set=rho_set, deriv_set=deriv_set, &
1967 CALL integrate_sc_fxc(int_fxc, iatom, ikind, deriv_set, xas_atom_env, qs_env)
1972 CALL integrate_sf_fxc(int_fxc, iatom, ikind, rho_set, deriv_set, xas_atom_env, qs_env)
1976 IF (do_gga .AND. do_sc)
THEN
1977 CALL integrate_gga_fxc(int_fxc, iatom, ikind, batch_info, rho_set, deriv_set, &
1978 xas_atom_env, qs_env)
1989 CALL para_env%sync()
1991 CALL timestop(handle)
2007 SUBROUTINE integrate_gga_fxc(int_fxc, iatom, ikind, batch_info, rho_set, deriv_set, &
2008 xas_atom_env, qs_env)
2011 INTEGER,
INTENT(IN) :: iatom, ikind
2018 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_gga_fxc'
2020 INTEGER :: bo(2), dir, handle, i, ia, ir, jpgf, &
2021 jset, jso, l, maxso, na, nr, nset, &
2022 nsgf, nsoi, nsotot, startj, ub
2023 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf
2024 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: rexp
2025 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: int_sgf, res, so, work
2026 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: dso
2027 REAL(
dp),
DIMENSION(:, :),
POINTER :: dgr1, dgr2, ga, gr, ri_sphi_so, weight, &
2029 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: dga1, dga2
2036 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2038 NULLIFY (grid_atom, ri_basis, qs_kind_set, ga, gr, dgr1, dgr2, lmax, lmin, npgf)
2039 NULLIFY (weight, ri_sphi_so, dga1, dga2, para_env, harmonics, zet)
2051 CALL timeset(routinen, handle)
2055 IF (xas_atom_env%nspins == 2) ub = 3
2058 harmonics => xas_atom_env%harmonics_atom_set(ikind)%harmonics_atom
2059 grid_atom => xas_atom_env%grid_atom_set(ikind)%grid_atom
2060 na = grid_atom%ng_sphere
2062 weight => grid_atom%weight
2065 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, para_env=para_env)
2066 CALL get_qs_kind(qs_kind_set(ikind), basis_set=ri_basis, basis_type=
"RI_XAS")
2068 CALL get_gto_basis_set(gto_basis_set=ri_basis, lmax=lmax, lmin=lmin, nsgf=nsgf, &
2069 maxso=maxso, npgf=npgf, nset=nset, zet=zet)
2073 ga => xas_atom_env%ga(ikind)%array
2074 gr => xas_atom_env%gr(ikind)%array
2075 dgr1 => xas_atom_env%dgr1(ikind)%array
2076 dgr2 => xas_atom_env%dgr2(ikind)%array
2077 dga1 => xas_atom_env%dga1(ikind)%array
2078 dga2 => xas_atom_env%dga2(ikind)%array
2089 ALLOCATE (so(na, nr))
2090 ALLOCATE (dso(na, nr, 3))
2095 ALLOCATE (int_so(ub))
2097 ALLOCATE (vxc(i)%array(na, nr))
2098 ALLOCATE (vxg(i)%array(na, nr, 3))
2099 ALLOCATE (int_so(i)%array(nsotot, nsotot))
2100 vxc(i)%array = 0.0_dp; vxg(i)%array = 0.0_dp; int_so(i)%array = 0.0_dp
2104 DO jpgf = 1, npgf(jset)
2105 startj = (jset - 1)*maxso + (jpgf - 1)*
nsoset(lmax(jset))
2106 DO jso =
nsoset(lmin(jset) - 1) + 1,
nsoset(lmax(jset))
2112 rexp(1:nr) = exp(-zet(jpgf, jset)*grid_atom%rad2(1:nr))
2120 so(ia, ir) = grid_atom%rad(ir)**l*rexp(ir)*harmonics%slm(ia, jso)
2123 dso(ia, ir, :) = 0.0_dp
2125 dso(ia, ir, dir) = dso(ia, ir, dir) &
2126 + grid_atom%rad(ir)**(l - 1)*rexp(ir)*harmonics%dslm_dxyz(dir, ia, jso) &
2127 - 2.0_dp*zet(jpgf, jset)*grid_atom%rad(ir)**(l + 1)*rexp(ir) &
2128 *harmonics%a(dir, ia)*harmonics%slm(ia, jso)
2135 CALL get_vxc_vxg(vxc, vxg, so, dso, na, nr, rho_set, deriv_set, weight)
2139 nsoi = batch_info%nso_proc(ikind)
2140 bo = batch_info%so_bo(:, ikind)
2141 ALLOCATE (res(nsoi, nsoi), work(na, nsoi))
2142 res = 0.0_dp; work = 0.0_dp
2147 CALL dgemm(
'N',
'N', na, nsoi, nr, 1.0_dp, vxc(i)%array(:, :), na, &
2148 gr(:, 1:nsoi), nr, 0.0_dp, work, na)
2149 CALL dgemm(
'T',
'N', nsoi, nsoi, na, 1.0_dp, work, na, &
2150 ga(:, 1:nsoi), na, 0.0_dp, res, nsoi)
2151 int_so(i)%array(bo(1):bo(2), startj + jso) =
get_diag(res)
2156 CALL dgemm(
'N',
'N', na, nsoi, nr, 1.0_dp, vxg(i)%array(:, :, dir), na, &
2157 dgr1(:, 1:nsoi), nr, 0.0_dp, work, na)
2158 CALL dgemm(
'T',
'N', nsoi, nsoi, na, 1.0_dp, work, na, &
2159 dga1(:, 1:nsoi, dir), na, 0.0_dp, res, nsoi)
2160 CALL daxpy(nsoi, 1.0_dp,
get_diag(res), 1, int_so(i)%array(bo(1):bo(2), startj + jso), 1)
2162 CALL dgemm(
'N',
'N', na, nsoi, nr, 1.0_dp, vxg(i)%array(:, :, dir), na, &
2163 dgr2(:, 1:nsoi), nr, 0.0_dp, work, na)
2164 CALL dgemm(
'T',
'N', nsoi, nsoi, na, 1.0_dp, work, na, &
2165 dga2(:, 1:nsoi, dir), na, 0.0_dp, res, nsoi)
2166 CALL daxpy(nsoi, 1.0_dp,
get_diag(res), 1, int_so(i)%array(bo(1):bo(2), startj + jso), 1)
2171 DEALLOCATE (res, work)
2178 ri_sphi_so => xas_atom_env%ri_sphi_so(ikind)%array
2179 ALLOCATE (int_sgf(nsgf, nsgf))
2181 CALL batch_info%para_env%sum(int_so(i)%array)
2182 CALL contract_so2sgf(int_sgf, int_so(i)%array, ri_basis, ri_sphi_so)
2183 CALL daxpy(nsgf*nsgf, 1.0_dp, int_sgf, 1, int_fxc(iatom, i)%array, 1)
2188 DEALLOCATE (vxc(i)%array)
2189 DEALLOCATE (vxg(i)%array)
2190 DEALLOCATE (int_so(i)%array)
2192 DEALLOCATE (vxc, vxg, int_so)
2194 CALL timestop(handle)
2196 END SUBROUTINE integrate_gga_fxc
2215 SUBROUTINE get_vxc_vxg(vxc, vxg, so, dso, na, nr, rho_set, deriv_set, weight)
2219 REAL(
dp),
DIMENSION(:, :) :: so
2220 REAL(
dp),
DIMENSION(:, :, :) :: dso
2221 INTEGER,
INTENT(IN) :: na, nr
2224 REAL(
dp),
DIMENSION(:, :),
POINTER :: weight
2226 CHARACTER(len=*),
PARAMETER :: routinen =
'get_vxc_vxg'
2228 INTEGER :: dir, handle, i, ia, ir, ub
2229 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: dot_proda, dot_prodb, tmp
2230 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: d1e, d2e, norm_drhoa, norm_drhob
2233 NULLIFY (norm_drhoa, norm_drhob, d2e, d1e, deriv)
2235 CALL timeset(routinen, handle)
2244 norm_drhoa => rho_set%norm_drhoa
2245 norm_drhob => rho_set%norm_drhob
2249 vxc(i)%array = 0.0_dp
2250 vxg(i)%array = 0.0_dp
2253 ALLOCATE (tmp(na, nr), dot_proda(na, nr), dot_prodb(na, nr))
2254 dot_proda = 0.0_dp; dot_prodb = 0.0_dp
2270 dot_proda(ia, ir) = dot_proda(ia, ir) + rho_set%drhoa(dir)%array(ia, ir, 1)*dso(ia, ir, dir)
2271 dot_prodb(ia, ir) = dot_prodb(ia, ir) + rho_set%drhob(dir)%array(ia, ir, 1)*dso(ia, ir, dir)
2281 IF (
ASSOCIATED(deriv))
THEN
2286 vxc(1)%array(ia, ir) = d2e(ia, ir, 1)*dot_proda(ia, ir)
2295 IF (
ASSOCIATED(deriv))
THEN
2300 vxc(1)%array(ia, ir) = vxc(1)%array(ia, ir) + d2e(ia, ir, 1)*dot_prodb(ia, ir)
2310 vxc(1)%array(ia, ir) = vxc(1)%array(ia, ir)*weight(ia, ir)
2317 IF (
ASSOCIATED(deriv))
THEN
2322 tmp(ia, ir) = d2e(ia, ir, 1)*so(ia, ir)
2330 IF (
ASSOCIATED(deriv))
THEN
2335 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_prodb(ia, ir)
2343 IF (
ASSOCIATED(deriv))
THEN
2348 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2356 IF (
ASSOCIATED(deriv))
THEN
2361 tmp(ia, ir) = tmp(ia, ir) - d1e(ia, ir, 1)*dot_proda(ia, ir) &
2362 /max(norm_drhoa(ia, ir, 1), rho_set%drho_cutoff)**2
2373 vxg(1)%array(ia, ir, dir) = tmp(ia, ir)*rho_set%drhoa(dir)%array(ia, ir, 1)
2381 IF (
ASSOCIATED(deriv))
THEN
2386 tmp(ia, ir) = d2e(ia, ir, 1)*so(ia, ir)
2394 IF (
ASSOCIATED(deriv))
THEN
2399 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2407 IF (
ASSOCIATED(deriv))
THEN
2412 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_prodb(ia, ir)
2423 vxg(1)%array(ia, ir, dir) = vxg(1)%array(ia, ir, dir) + tmp(ia, ir)*rho_set%drhob(dir)%array(ia, ir, 1)
2431 IF (
ASSOCIATED(deriv))
THEN
2437 vxg(1)%array(ia, ir, dir) = vxg(1)%array(ia, ir, dir) + d1e(ia, ir, 1)*dso(ia, ir, dir)
2449 vxg(1)%array(ia, ir, dir) = vxg(1)%array(ia, ir, dir)*weight(ia, ir)
2459 IF (
ASSOCIATED(deriv))
THEN
2464 vxc(2)%array(ia, ir) = d2e(ia, ir, 1)*dot_prodb(ia, ir)
2472 IF (
ASSOCIATED(deriv))
THEN
2477 vxc(2)%array(ia, ir) = vxc(2)%array(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2487 vxc(2)%array(ia, ir) = vxc(2)%array(ia, ir)*weight(ia, ir)
2494 IF (
ASSOCIATED(deriv))
THEN
2499 tmp(ia, ir) = d2e(ia, ir, 1)*so(ia, ir)
2507 IF (
ASSOCIATED(deriv))
THEN
2512 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2520 IF (
ASSOCIATED(deriv))
THEN
2525 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_prodb(ia, ir)
2536 vxg(2)%array(ia, ir, dir) = tmp(ia, ir)*rho_set%drhoa(dir)%array(ia, ir, 1)
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_prodb(ia, ir)
2570 IF (
ASSOCIATED(deriv))
THEN
2575 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2586 vxg(2)%array(ia, ir, dir) = vxg(2)%array(ia, ir, dir) + tmp(ia, ir)*rho_set%drhob(dir)%array(ia, ir, 1)
2594 IF (
ASSOCIATED(deriv))
THEN
2600 vxg(2)%array(ia, ir, dir) = vxg(2)%array(ia, ir, dir) + d1e(ia, ir, 1)*dso(ia, ir, dir)
2612 vxg(2)%array(ia, ir, dir) = vxg(2)%array(ia, ir, dir)*weight(ia, ir)
2623 IF (
ASSOCIATED(deriv))
THEN
2628 vxc(3)%array(ia, ir) = d2e(ia, ir, 1)*dot_prodb(ia, ir)
2636 IF (
ASSOCIATED(deriv))
THEN
2641 vxc(3)%array(ia, ir) = vxc(3)%array(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2651 vxc(3)%array(ia, ir) = vxc(3)%array(ia, ir)*weight(ia, ir)
2658 IF (
ASSOCIATED(deriv))
THEN
2663 tmp(ia, ir) = d2e(ia, ir, 1)*so(ia, ir)
2671 IF (
ASSOCIATED(deriv))
THEN
2676 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2684 IF (
ASSOCIATED(deriv))
THEN
2689 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_prodb(ia, ir)
2697 IF (
ASSOCIATED(deriv))
THEN
2702 tmp(ia, ir) = tmp(ia, ir) - d1e(ia, ir, 1)*dot_prodb(ia, ir) &
2703 /max(norm_drhob(ia, ir, 1), rho_set%drho_cutoff)**2
2714 vxg(3)%array(ia, ir, dir) = tmp(ia, ir)*rho_set%drhob(dir)%array(ia, ir, 1)
2722 IF (
ASSOCIATED(deriv))
THEN
2727 tmp(ia, ir) = d2e(ia, ir, 1)*so(ia, ir)
2735 IF (
ASSOCIATED(deriv))
THEN
2740 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_prodb(ia, ir)
2748 IF (
ASSOCIATED(deriv))
THEN
2753 tmp(ia, ir) = tmp(ia, ir) + d2e(ia, ir, 1)*dot_proda(ia, ir)
2764 vxg(3)%array(ia, ir, dir) = vxg(3)%array(ia, ir, dir) + &
2765 tmp(ia, ir)*rho_set%drhoa(dir)%array(ia, ir, 1)
2773 IF (
ASSOCIATED(deriv))
THEN
2779 vxg(3)%array(ia, ir, dir) = vxg(3)%array(ia, ir, dir) + d1e(ia, ir, 1)*dso(ia, ir, dir)
2791 vxg(3)%array(ia, ir, dir) = vxg(3)%array(ia, ir, dir)*weight(ia, ir)
2801 CALL timestop(handle)
2803 END SUBROUTINE get_vxc_vxg
2814 SUBROUTINE integrate_sc_fxc(int_fxc, iatom, ikind, deriv_set, xas_atom_env, qs_env)
2817 INTEGER,
INTENT(IN) :: iatom, ikind
2822 INTEGER :: i, maxso, na, nr, nset, nsotot, nspins, &
2824 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: fxc, int_so
2825 REAL(
dp),
DIMENSION(:, :),
POINTER :: ri_sphi_so
2830 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2833 NULLIFY (grid_atom, ri_basis, ri_sphi_so, qs_kind_set, dft_control)
2836 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, dft_control=dft_control)
2837 grid_atom => xas_atom_env%grid_atom_set(ikind)%grid_atom
2838 na = grid_atom%ng_sphere
2840 CALL get_qs_kind(qs_kind_set(ikind), basis_set=ri_basis, basis_type=
"RI_XAS")
2843 ri_sphi_so => xas_atom_env%ri_sphi_so(ikind)%array
2844 nspins = dft_control%nspins
2852 IF (
ASSOCIATED(derivs(i)%deriv))
THEN
2858 ALLOCATE (fxc(na, nr))
2859 ALLOCATE (int_so(nsotot, nsotot))
2863 DO i = 1, nspins + 1
2865 IF (
ASSOCIATED(derivs(i)%deriv))
THEN
2866 fxc(:, :) = d2e(i)%array(:, :, 1)*grid_atom%weight(:, :)
2867 CALL integrate_so_prod(int_so, fxc, ikind, xas_atom_env, qs_env)
2871 ALLOCATE (int_fxc(iatom, i)%array(ri_nsgf, ri_nsgf))
2872 int_fxc(iatom, i)%array = 0.0_dp
2873 CALL contract_so2sgf(int_fxc(iatom, i)%array, int_so, ri_basis, ri_sphi_so)
2876 END SUBROUTINE integrate_sc_fxc
2889 SUBROUTINE integrate_sf_fxc(int_fxc, iatom, ikind, rho_set, deriv_set, xas_atom_env, qs_env)
2892 INTEGER,
INTENT(IN) :: iatom, ikind
2898 INTEGER :: ia, ir, maxso, na, nr, nset, nsotot, &
2900 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: fxc, int_so
2901 REAL(
dp),
DIMENSION(:, :),
POINTER :: ri_sphi_so
2902 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: rhoa, rhob
2907 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2910 NULLIFY (grid_atom, deriv, ri_basis, ri_sphi_so, qs_kind_set, rhoa, rhob, dft_control)
2913 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, dft_control=dft_control)
2914 grid_atom => xas_atom_env%grid_atom_set(ikind)%grid_atom
2915 na = grid_atom%ng_sphere
2917 CALL get_qs_kind(qs_kind_set(ikind), basis_set=ri_basis, basis_type=
"RI_XAS")
2920 ri_sphi_so => xas_atom_env%ri_sphi_so(ikind)%array
2921 rhoa => rho_set%rhoa
2922 rhob => rho_set%rhob
2926 IF (
ASSOCIATED(deriv))
THEN
2930 IF (
ASSOCIATED(deriv))
THEN
2937 IF (
ASSOCIATED(deriv))
THEN
2941 IF (
ASSOCIATED(deriv))
THEN
2945 IF (
ASSOCIATED(deriv))
THEN
2950 ALLOCATE (fxc(na, nr))
2959 IF (abs(rhoa(ia, ir, 1) - rhob(ia, ir, 1)) > dft_control%qs_control%eps_rho_rspace)
THEN
2960 fxc(ia, ir) = grid_atom%weight(ia, ir)/(rhoa(ia, ir, 1) - rhob(ia, ir, 1)) &
2961 *(d1e(1)%array(ia, ir, 1) - d1e(2)%array(ia, ir, 1))
2963 fxc(ia, ir) = 0.5_dp*grid_atom%weight(ia, ir)* &
2964 (d2e(1)%array(ia, ir, 1) + d2e(3)%array(ia, ir, 1) - 2._dp*d2e(2)%array(ia, ir, 1))
2972 ALLOCATE (int_so(nsotot, nsotot))
2974 CALL integrate_so_prod(int_so, fxc, ikind, xas_atom_env, qs_env)
2977 ALLOCATE (int_fxc(iatom, 4)%array(ri_nsgf, ri_nsgf))
2978 int_fxc(iatom, 4)%array = 0.0_dp
2979 CALL contract_so2sgf(int_fxc(iatom, 4)%array, int_so, ri_basis, ri_sphi_so)
2981 END SUBROUTINE integrate_sf_fxc
2990 SUBROUTINE contract_so2sgf(int_sgf, int_so, basis, sphi_so)
2992 REAL(
dp),
DIMENSION(:, :) :: int_sgf, int_so
2994 REAL(
dp),
DIMENSION(:, :) :: sphi_so
2996 INTEGER :: iset, jset, maxso, nset, nsoi, nsoj, &
2997 sgfi, sgfj, starti, startj
2998 INTEGER,
DIMENSION(:),
POINTER :: lmax, npgf, nsgf_set
2999 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgf
3001 NULLIFY (nsgf_set, npgf, lmax, first_sgf)
3003 CALL get_gto_basis_set(basis, nset=nset, maxso=maxso, nsgf_set=nsgf_set, first_sgf=first_sgf, &
3004 npgf=npgf, lmax=lmax)
3007 starti = (iset - 1)*maxso + 1
3008 nsoi = npgf(iset)*
nsoset(lmax(iset))
3009 sgfi = first_sgf(1, iset)
3012 startj = (jset - 1)*maxso + 1
3013 nsoj = npgf(jset)*
nsoset(lmax(jset))
3014 sgfj = first_sgf(1, jset)
3016 CALL ab_contract(int_sgf(sgfi:sgfi + nsgf_set(iset) - 1, sgfj:sgfj + nsgf_set(jset) - 1), &
3017 int_so(starti:starti + nsoi - 1, startj:startj + nsoj - 1), &
3018 sphi_so(:, sgfi:), sphi_so(:, sgfj:), nsoi, nsoj, &
3019 nsgf_set(iset), nsgf_set(jset))
3023 END SUBROUTINE contract_so2sgf
3037 SUBROUTINE integrate_so_prod(intso, fxc, ikind, xas_atom_env, qs_env)
3039 REAL(
dp),
DIMENSION(:, :),
INTENT(INOUT) :: intso
3040 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: fxc
3041 INTEGER,
INTENT(IN) :: ikind
3045 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_so_prod'
3047 INTEGER :: handle, ia, ic, icg, ipgf1, ipgf2, iset1, iset2, iso, iso1, iso2, l, ld, lmax12, &
3048 lmin12, m1, m2, max_iso_not0, max_iso_not0_local, max_s_harm, maxl, maxso, n1, n2, na, &
3049 ngau1, ngau2, nngau1, nr, nset, size1
3050 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: cg_n_list
3051 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :) :: cg_list
3052 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf
3053 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: g1, g2
3054 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: gfxcg, gg, matso
3055 REAL(
dp),
DIMENSION(:, :),
POINTER :: zet
3056 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: my_cg
3060 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3062 CALL timeset(routinen, handle)
3064 NULLIFY (grid_atom, harmonics, ri_basis, qs_kind_set, lmax, lmin, npgf, zet, my_cg)
3067 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
3068 CALL get_qs_kind(qs_kind_set(ikind), basis_set=ri_basis, basis_type=
"RI_XAS")
3069 grid_atom => xas_atom_env%grid_atom_set(ikind)%grid_atom
3070 harmonics => xas_atom_env%harmonics_atom_set(ikind)%harmonics_atom
3072 CALL get_gto_basis_set(ri_basis, lmax=lmax, lmin=lmin, maxso=maxso, maxl=maxl, npgf=npgf, &
3075 na = grid_atom%ng_sphere
3077 my_cg => harmonics%my_CG
3078 max_iso_not0 = harmonics%max_iso_not0
3079 max_s_harm = harmonics%max_s_harm
3080 cpassert(2*maxl <=
indso(1, max_iso_not0))
3082 ALLOCATE (g1(nr), g2(nr), gg(nr, 0:2*maxl))
3083 ALLOCATE (gfxcg(na, 0:2*maxl))
3085 ALLOCATE (cg_list(2,
nsoset(maxl)**2, max_s_harm), cg_n_list(max_s_harm))
3095 CALL get_none0_cg_list(my_cg, lmin(iset1), lmax(iset1), lmin(iset2), lmax(iset2), &
3096 max_s_harm, lmax(iset1) + lmax(iset2), cg_list, cg_n_list, &
3098 cpassert(max_iso_not0_local <= max_iso_not0)
3101 DO ipgf1 = 1, npgf(iset1)
3102 ngau1 = n1*(ipgf1 - 1) + m1
3104 nngau1 =
nsoset(lmin(iset1) - 1) + ngau1
3106 g1(:) = exp(-zet(ipgf1, iset1)*grid_atom%rad2(1:nr))
3107 DO ipgf2 = 1, npgf(iset2)
3108 ngau2 = n2*(ipgf2 - 1) + m2
3110 g2(:) = exp(-zet(ipgf2, iset2)*grid_atom%rad2(1:nr))
3111 lmin12 = lmin(iset1) + lmin(iset2)
3112 lmax12 = lmax(iset1) + lmax(iset2)
3116 IF (lmin12 == 0)
THEN
3117 gg(:, lmin12) = g1(:)*g2(:)
3119 gg(:, lmin12) = grid_atom%rad2l(1:nr, lmin12)*g1(:)*g2(:)
3122 DO l = lmin12 + 1, lmax12
3123 gg(:, l) = grid_atom%rad(1:nr)*gg(:, l - 1)
3127 CALL dgemm(
'N',
'N', na, ld, nr, 1.0_dp, fxc(1:na, 1:nr), na, gg(:, 0:lmax12), &
3128 nr, 0.0_dp, gfxcg(1:na, 0:lmax12), na)
3132 DO iso = 1, max_iso_not0_local
3133 DO icg = 1, cg_n_list(iso)
3134 iso1 = cg_list(1, icg, iso)
3135 iso2 = cg_list(2, icg, iso)
3139 matso(iso1, iso2) = matso(iso1, iso2) + gfxcg(ia, l)* &
3140 my_cg(iso1, iso2, iso)*harmonics%slm(ia, iso)
3146 DO ic =
nsoset(lmin(iset2) - 1) + 1,
nsoset(lmax(iset2))
3147 iso1 =
nsoset(lmin(iset1) - 1) + 1
3149 CALL daxpy(size1, 1.0_dp, matso(iso1:, ic), 1, intso(nngau1 + 1:, iso2), 1)
3159 CALL timestop(handle)
3161 END SUBROUTINE integrate_so_prod
3172 SUBROUTINE integrate_so_dxdy_prod(intso, V, ikind, qs_env, soc_atom_env)
3174 REAL(
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: intso
3175 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: v
3176 INTEGER,
INTENT(IN) :: ikind
3180 INTEGER :: i, ipgf, iset, iso, j, jpgf, jset, jso, &
3181 k, l, maxso, na, nr, nset, starti, &
3183 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf
3184 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: fga, fgr, r1, r2, work
3185 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: a1, a2
3186 REAL(
dp),
DIMENSION(:, :),
POINTER :: slm, zet
3187 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: dslm_dxyz
3191 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3193 NULLIFY (grid_atom, harmonics, basis, qs_kind_set, dslm_dxyz, slm, lmin, lmax, npgf, zet)
3195 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
3196 CALL get_qs_kind(qs_kind_set(ikind), basis_set=basis, basis_type=
"ORB")
3197 IF (
PRESENT(soc_atom_env))
THEN
3198 grid_atom => soc_atom_env%grid_atom_set(ikind)%grid_atom
3199 harmonics => soc_atom_env%harmonics_atom_set(ikind)%harmonics_atom
3201 CALL get_qs_kind(qs_kind_set(ikind), basis_set=basis, basis_type=
"ORB", harmonics=harmonics, &
3202 grid_atom=grid_atom)
3205 na = grid_atom%ng_sphere
3208 slm => harmonics%slm
3209 dslm_dxyz => harmonics%dslm_dxyz
3213 maxso=maxso, npgf=npgf, nset=nset, zet=zet)
3219 ALLOCATE (a1(na, nset*maxso, 3), a2(na, nset*maxso, 3))
3220 ALLOCATE (r1(nr, nset*maxso), r2(nr, nset*maxso))
3221 a1 = 0.0_dp; a2 = 0.0_dp
3222 r1 = 0.0_dp; r2 = 0.0_dp
3225 DO ipgf = 1, npgf(iset)
3226 starti = (iset - 1)*maxso + (ipgf - 1)*
nsoset(lmax(iset))
3227 DO iso =
nsoset(lmin(iset) - 1) + 1,
nsoset(lmax(iset))
3234 r1(1:nr, starti + iso) = grid_atom%rad(1:nr)**(l - 1)*exp(-zet(ipgf, iset)*grid_atom%rad2(1:nr))
3237 r2(1:nr, starti + iso) = -2.0_dp*zet(ipgf, iset)*grid_atom%rad(1:nr)**(l + 1) &
3238 *exp(-zet(ipgf, iset)*grid_atom%rad2(1:nr))
3242 a1(1:na, starti + iso, i) = dslm_dxyz(i, 1:na, iso)
3245 a2(1:na, starti + iso, i) = harmonics%a(i, 1:na)*slm(1:na, iso)
3254 ALLOCATE (fga(na, 1))
3255 ALLOCATE (fgr(nr, 1))
3256 ALLOCATE (work(na, 1))
3257 fga = 0.0_dp; fgr = 0.0_dp; work = 0.0_dp
3261 DO ipgf = 1, npgf(iset)
3262 starti = (iset - 1)*maxso + (ipgf - 1)*
nsoset(lmax(iset))
3263 DO jpgf = 1, npgf(jset)
3264 startj = (jset - 1)*maxso + (jpgf - 1)*
nsoset(lmax(jset))
3268 k = mod(i + 1, 3) + 1
3270 DO iso =
nsoset(lmin(iset) - 1) + 1,
nsoset(lmax(iset))
3271 DO jso =
nsoset(lmin(jset) - 1) + 1,
nsoset(lmax(jset))
3276 fgr(1:nr, 1) = r1(1:nr, starti + iso)*r1(1:nr, startj + jso)
3277 fga(1:na, 1) = a1(1:na, starti + iso, j)*a1(1:na, startj + jso, k)
3279 CALL dgemm(
'N',
'N', na, 1, nr, 1.0_dp, v, na, fgr, nr, 0.0_dp, work, na)
3280 CALL dgemm(
'T',
'N', 1, 1, na, 1.0_dp, work, na, fga, na, 0.0_dp, &
3281 intso(starti + iso:, startj + jso, i), 1)
3284 fgr(1:nr, 1) = r1(1:nr, starti + iso)*r2(1:nr, startj + jso)
3285 fga(1:na, 1) = a1(1:na, starti + iso, j)*a2(1:na, startj + jso, k)
3287 CALL dgemm(
'N',
'N', na, 1, nr, 1.0_dp, v, na, fgr, nr, 0.0_dp, work, na)
3288 CALL dgemm(
'T',
'N', 1, 1, na, 1.0_dp, work, na, fga, na, 1.0_dp, &
3289 intso(starti + iso:, startj + jso, i), 1)
3292 fgr(1:nr, 1) = r2(1:nr, starti + iso)*r1(1:nr, startj + jso)
3293 fga(1:na, 1) = a2(1:na, starti + iso, j)*a1(1:na, startj + jso, k)
3295 CALL dgemm(
'N',
'N', na, 1, nr, 1.0_dp, v, na, fgr, nr, 0.0_dp, work, na)
3296 CALL dgemm(
'T',
'N', 1, 1, na, 1.0_dp, work, na, fga, na, 1.0_dp, &
3297 intso(starti + iso:, startj + jso, i), 1)
3300 fgr(1:nr, 1) = r2(1:nr, starti + iso)*r2(1:nr, startj + jso)
3301 fga(1:na, 1) = a2(1:na, starti + iso, j)*a2(1:na, startj + jso, k)
3303 CALL dgemm(
'N',
'N', na, 1, nr, 1.0_dp, v, na, fgr, nr, 0.0_dp, work, na)
3304 CALL dgemm(
'T',
'N', 1, 1, na, 1.0_dp, work, na, fga, na, 1.0_dp, &
3305 intso(starti + iso:, startj + jso, i), 1)
3317 intso(:, :, i) = intso(:, :, i) - transpose(intso(:, :, i))
3320 END SUBROUTINE integrate_so_dxdy_prod
3334 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_soc
3339 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_soc_atoms'
3341 INTEGER :: handle, i, iat, ikind, ir, jat, maxso, &
3342 na, nkind, nr, nset, nsgf
3343 LOGICAL :: all_potential_present
3345 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: vr
3346 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: v
3347 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: intso
3348 REAL(
dp),
DIMENSION(:, :),
POINTER :: sphi_so
3349 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: intsgf
3356 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3359 CALL timeset(routinen, handle)
3361 NULLIFY (int_soc, basis, qs_kind_set, sphi_so, matrix_s, grid)
3362 NULLIFY (particle_set)
3365 CALL get_qs_env(qs_env, nkind=nkind, qs_kind_set=qs_kind_set, matrix_s=matrix_s, &
3366 particle_set=particle_set)
3369 CALL get_qs_kind_set(qs_kind_set, all_potential_present=all_potential_present)
3372 ALLOCATE (int_soc(nkind))
3374 CALL get_qs_kind(qs_kind_set(ikind), basis_set=basis, basis_type=
"ORB", zeff=zeff)
3375 IF (
PRESENT(soc_atom_env))
THEN
3376 grid => soc_atom_env%grid_atom_set(ikind)%grid_atom
3378 CALL get_qs_kind(qs_kind_set(ikind), grid_atom=grid)
3381 ALLOCATE (intso(nset*maxso, nset*maxso, 3))
3391 ALLOCATE (v(na, nr))
3394 CALL daxpy(na, vr(ir)/(4.0_dp*
c_light_au**2 - 2.0_dp*vr(ir)), grid%weight(:, ir), 1, &
3400 IF (
PRESENT(xas_atom_env))
THEN
3401 CALL integrate_so_dxdy_prod(intso, v, ikind, qs_env)
3403 CALL integrate_so_dxdy_prod(intso, v, ikind, qs_env, soc_atom_env)
3409 ALLOCATE (int_soc(ikind)%array(nsgf, nsgf, 3))
3410 intsgf => int_soc(ikind)%array
3411 IF (
PRESENT(xas_atom_env))
THEN
3412 sphi_so => xas_atom_env%orb_sphi_so(ikind)%array
3414 sphi_so => soc_atom_env%orb_sphi_so(ikind)%array
3419 CALL contract_so2sgf(intsgf(:, :, i), intso(:, :, i), basis, sphi_so)
3426 IF ((
PRESENT(xas_atom_env)) .OR. all_potential_present)
THEN
3428 CALL dbcsr_create(matrix_soc(i)%matrix, name=
"SOC MATRIX", template=matrix_s(1)%matrix, &
3429 matrix_type=dbcsr_type_antisymmetric)
3436 IF (.NOT. iat == jat) cycle
3437 ikind = particle_set(iat)%atomic_kind%kind_number
3440 CALL dbcsr_put_block(matrix_soc(i)%matrix, iat, iat, int_soc(ikind)%array(:, :, i))
3447 CALL dbcsr_create(matrix_soc(i)%matrix, name=
"SOC MATRIX", template=matrix_s(1)%matrix, &
3448 matrix_type=dbcsr_type_no_symmetry)
3449 CALL dbcsr_set(matrix_soc(i)%matrix, 0.0_dp)
3450 CALL dbcsr_copy(matrix_soc(i)%matrix, soc_atom_env%soc_pp(i, 1)%matrix)
3460 DEALLOCATE (int_soc(ikind)%array)
3462 DEALLOCATE (int_soc)
3464 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, ccon)
...
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)
...
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_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
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....
Expansion of the product of two real spherical harmonics in real spherical harmonics.
subroutine, public real_gaunt_coefficients(my_cg, maxl1, maxl2, llmax, cg_none0_list, ncg_none0)
Calculate the expansion of the product of two real spherical harmonics in real spherical harmonics,...
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, ncgf)
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, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
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, 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, hund_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, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, 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.
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, do_mtlr_present, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
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, lcart)
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...
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 pointer to a derivative (to have arrays of derivatives)
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