72#include "./base/base_uses.f90"
78 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'mp2_eri_gpw'
106 cell, dft_control, particle_set, &
107 pw_env_sub, external_vector, poisson_env, rho_r, pot_g, &
108 potential_parameter, mat_munu, qs_env, task_list_sub)
113 POINTER :: atomic_kind_set
115 POINTER :: qs_kind_set
116 TYPE(
cell_type),
INTENT(IN),
POINTER :: cell
119 POINTER :: particle_set
120 TYPE(
pw_env_type),
INTENT(IN),
POINTER :: pw_env_sub
121 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: external_vector
130 CHARACTER(LEN=*),
PARAMETER :: routinen =
'mp2_eri_3c_integrate_gpw'
134 CALL timeset(routinen, handle)
138 qs_kind_set, cell, particle_set, pw_env_sub, &
139 dft_control%qs_control%eps_rho_rspace, basis_type=
"RI_AUX")
145 CALL integrate_v_rspace(rho_r, hmat=mat_munu, qs_env=qs_env, &
146 calculate_forces=.false., compute_tau=.false., gapw=.false., &
147 pw_env_external=pw_env_sub, task_list_external=task_list_sub)
149 CALL timestop(handle)
166 natom, potential_parameter, sab_orb_sub, L_local_col, kind_of)
170 INTEGER,
INTENT(IN) :: my_group_l_start, my_group_l_end, natom
173 INTENT(IN),
POINTER :: sab_orb_sub
174 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT) :: l_local_col
175 INTEGER,
DIMENSION(:),
INTENT(IN) :: kind_of
177 CHARACTER(LEN=*),
PARAMETER :: routinen =
'mp2_eri_2c_integrate_gpw'
179 INTEGER :: dir, handle, handle2, i_counter, iatom, igrid_level, ikind, ipgf, iset, lb(3), &
180 lll, location(3), max_nseta, na1, na2, ncoa, nseta, offset, sgfa, tp(3), ub(3)
181 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: offset_2d
182 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, npgfa, nsgfa
183 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa
184 LOGICAL :: map_it_here, use_subpatch
185 REAL(kind=
dp) :: cutoff_old, radius, relative_cutoff_old
186 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: e_cutoff_old
187 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: i_ab
188 REAL(kind=
dp),
DIMENSION(3) :: ra
189 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a
190 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: i_tmp2, rpgfa, sphi_a, zeta
201 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
207 CALL timeset(routinen, handle)
209 CALL prepare_gpw(qs_env, dft_control, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, &
210 auxbas_pw_pool, poisson_env, task_list_sub, rho_r, rho_g, pot_g, psi_l, sab_orb_sub)
212 CALL get_qs_env(qs_env, cell=cell, qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set, particle_set=particle_set)
217 DO lll = my_group_l_start, my_group_l_end
218 i_counter = i_counter + 1
222 qs_kind_set, cell, dft_control, particle_set, pw_env_sub, &
223 required_function=lll, basis_type=
"RI_AUX")
225 CALL timeset(routinen//
"_pot_lm", handle2)
231 CALL pw_env_get(pw_env_sub, rs_descs=rs_descs, rs_grids=rs_v)
234 CALL timestop(handle2)
238 CALL get_qs_kind_set(qs_kind_set=qs_kind_set, maxnset=max_nseta, basis_type=
"RI_AUX")
239 ALLOCATE (offset_2d(max_nseta, natom))
242 ikind = kind_of(iatom)
243 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), basis_set=basis_set_a, basis_type=
"RI_AUX")
244 nseta = basis_set_a%nset
245 nsgfa => basis_set_a%nsgf_set
247 offset = offset + nsgfa(iset)
248 offset_2d(iset, iatom) = offset
263 ikind = kind_of(iatom)
264 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), basis_set=basis_set_a, basis_type=
"RI_AUX")
266 first_sgfa => basis_set_a%first_sgf
267 la_max => basis_set_a%lmax
268 la_min => basis_set_a%lmin
269 npgfa => basis_set_a%npgf
270 nseta = basis_set_a%nset
271 nsgfa => basis_set_a%nsgf_set
272 rpgfa => basis_set_a%pgf_radius
273 set_radius_a => basis_set_a%set_radius
274 sphi_a => basis_set_a%sphi
275 zeta => basis_set_a%zet
277 ra(:) =
pbc(particle_set(iatom)%r, cell)
280 ncoa = npgfa(iset)*
ncoset(la_max(iset))
281 sgfa = first_sgfa(1, iset)
283 ALLOCATE (i_tmp2(ncoa, 1))
285 ALLOCATE (i_ab(nsgfa(iset), 1))
288 offset = offset_2d(iset, iatom)
291 use_subpatch = .NOT. all(rs_v(igrid_level)%desc%perd == 1)
294 offset, para_env_sub%num_pe, para_env_sub%mepos))
THEN
295 DO ipgf = 1, npgfa(iset)
296 sgfa = first_sgfa(1, iset)
297 na1 = (ipgf - 1)*
ncoset(la_max(iset)) + 1
298 na2 = ipgf*
ncoset(la_max(iset))
302 lb_min=0, lb_max=0, ra=ra, rb=ra, rp=ra, &
303 zetp=zeta(ipgf, iset), &
304 eps=dft_control%qs_control%eps_gvg_rspace, &
305 prefactor=1.0_dp, cutoff=1.0_dp)
307 CALL integrate_pgf_product( &
308 la_max=la_max(iset), zeta=zeta(ipgf, iset), la_min=la_min(iset), &
309 lb_max=0, zetb=0.0_dp, lb_min=0, &
310 ra=ra, rab=(/0.0_dp, 0.0_dp, 0.0_dp/), &
311 rsgrid=rs_v(igrid_level), &
316 calculate_forces=.false., &
317 use_subpatch=use_subpatch, &
321 CALL dgemm(
"T",
"N", nsgfa(iset), 1, ncoa, &
322 1.0_dp, sphi_a(1, sgfa),
SIZE(sphi_a, 1), &
323 i_tmp2(1, 1),
SIZE(i_tmp2, 1), &
324 1.0_dp, i_ab(1, 1),
SIZE(i_ab, 1))
326 l_local_col(offset - nsgfa(iset) + 1:offset, i_counter) = i_ab(1:nsgfa(iset), 1)
335 DEALLOCATE (offset_2d)
339 CALL para_env_sub%sum(l_local_col)
341 CALL cleanup_gpw(qs_env, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, &
342 task_list_sub, auxbas_pw_pool, rho_r, rho_g, pot_g, psi_l)
344 CALL timestop(handle)
375 qs_kind_set, particle_set, cell, pw_env_sub, poisson_env, pot_g, &
376 potential_parameter, use_virial, rho_g_copy, dvg, &
377 kind_of, atom_of_kind, G_PQ_local, force, h_stress, para_env_sub, &
378 dft_control, psi_L, factor)
381 INTEGER,
INTENT(IN) :: lll
384 POINTER :: atomic_kind_set
386 POINTER :: qs_kind_set
388 POINTER :: particle_set
389 TYPE(
cell_type),
INTENT(IN),
POINTER :: cell
390 TYPE(
pw_env_type),
INTENT(IN),
POINTER :: pw_env_sub
394 LOGICAL,
INTENT(IN) :: use_virial
396 INTEGER,
DIMENSION(:),
INTENT(IN) :: kind_of, atom_of_kind
397 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: g_pq_local
400 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(INOUT) :: h_stress
404 REAL(kind=
dp),
INTENT(IN) :: factor
406 CHARACTER(LEN=*),
PARAMETER :: routinen =
'integrate_potential_forces_2c'
408 INTEGER :: handle, handle2
410 CALL timeset(routinen, handle)
413 CALL timeset(routinen//
"_wf_pot", handle2)
418 qs_kind_set, cell, dft_control, particle_set, &
419 pw_env_sub, required_function=lll, basis_type=
'RI_AUX')
425 CALL timestop(handle2)
429 CALL pw_copy(rho_g, rho_g_copy)
438 qs_kind_set, cell, particle_set, pw_env_sub, &
439 dft_control%qs_control%eps_rho_rspace, &
442 CALL calc_potential_gpw(psi_l, rho_g, poisson_env, pot_g, potential_parameter, no_transfer=.true.)
444 CALL virial_gpw_potential(rho_g_copy, pot_g, rho_g, dvg, h_stress, potential_parameter, para_env_sub)
449 CALL integrate_potential(pw_env_sub, rho_r, kind_of, atom_of_kind, particle_set, qs_kind_set, &
450 -0.25_dp*factor*g_pq_local, cell, force, use_virial, h_stress, para_env_sub, dft_control)
452 CALL timestop(handle)
472 TYPE(
pw_env_type),
INTENT(IN),
POINTER :: pw_env_sub
475 CHARACTER(LEN=*),
PARAMETER :: routinen =
'integrate_potential_forces_3c_1c'
479 CALL timeset(routinen, handle)
484 CALL integrate_v_rspace(rho_r, hmat=mat_munu, pmat=matrix_p_munu, &
485 qs_env=qs_env, calculate_forces=.true., compute_tau=.false., gapw=.false., &
486 pw_env_external=pw_env_sub, &
487 task_list_external=task_list_sub)
489 CALL timestop(handle)
518 potential_parameter, &
519 ks_env, poisson_env, pot_g, use_virial, rho_g_copy, dvg, &
520 h_stress, para_env_sub, kind_of, atom_of_kind, &
521 qs_kind_set, particle_set, cell, LLL, force, dft_control)
527 TYPE(
pw_env_type),
INTENT(IN),
POINTER :: pw_env_sub
532 LOGICAL,
INTENT(IN) :: use_virial
535 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(INOUT) :: h_stress
537 INTEGER,
DIMENSION(:),
INTENT(IN) :: kind_of, atom_of_kind
539 POINTER :: qs_kind_set
541 POINTER :: particle_set
542 TYPE(
cell_type),
INTENT(IN),
POINTER :: cell
543 INTEGER,
INTENT(IN) :: lll
548 CHARACTER(LEN=*),
PARAMETER :: routinen =
'integrate_potential_forces_3c_2c'
550 INTEGER :: atom_a, handle, handle2, iatom, &
551 igrid_level, ikind, iorb, ipgf, iset, &
552 na1, na2, ncoa, nseta, offset, sgfa
553 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, npgfa, nsgfa
554 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa
555 LOGICAL :: map_it_here, skip_shell, use_subpatch
556 REAL(kind=
dp) :: radius
557 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: i_ab
558 REAL(kind=
dp),
DIMENSION(3) :: force_a, force_b, ra
559 REAL(kind=
dp),
DIMENSION(3, 3) :: my_virial_a, my_virial_b
560 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a
561 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: i_tmp2, pab, rpgfa, sphi_a, zeta
567 CALL timeset(routinen, handle)
570 CALL timeset(routinen//
"_Gpot", handle2)
576 task_list_external=task_list_sub, &
577 pw_env_external=pw_env_sub, &
582 CALL timestop(handle2)
584 IF (use_virial)
CALL virial_gpw_potential(rho_g_copy, pot_g, rho_g, dvg, h_stress, potential_parameter, para_env_sub)
589 CALL pw_env_get(pw_env_sub, rs_descs=rs_descs, rs_grids=rs_v)
593 DO iatom = 1,
SIZE(kind_of)
594 ikind = kind_of(iatom)
595 atom_a = atom_of_kind(iatom)
596 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), basis_set=basis_set_a, &
599 first_sgfa => basis_set_a%first_sgf
600 la_max => basis_set_a%lmax
601 la_min => basis_set_a%lmin
602 npgfa => basis_set_a%npgf
603 nseta = basis_set_a%nset
604 nsgfa => basis_set_a%nsgf_set
605 rpgfa => basis_set_a%pgf_radius
606 set_radius_a => basis_set_a%set_radius
607 sphi_a => basis_set_a%sphi
608 zeta => basis_set_a%zet
610 ra(:) =
pbc(particle_set(iatom)%r, cell)
620 ncoa = npgfa(iset)*
ncoset(la_max(iset))
621 sgfa = first_sgfa(1, iset)
623 ALLOCATE (i_tmp2(ncoa, 1))
625 ALLOCATE (i_ab(nsgfa(iset), 1))
627 ALLOCATE (pab(ncoa, 1))
631 DO iorb = 1, nsgfa(iset)
632 IF (iorb + offset == lll)
THEN
633 i_ab(iorb, 1) = 1.0_dp
639 offset = offset + nsgfa(iset)
646 CALL dgemm(
"N",
"N", ncoa, 1, nsgfa(iset), &
647 1.0_dp, sphi_a(1, sgfa),
SIZE(sphi_a, 1), &
648 i_ab(1, 1),
SIZE(i_ab, 1), &
649 0.0_dp, pab(1, 1),
SIZE(pab, 1))
653 map_it_here = .false.
654 use_subpatch = .NOT. all(rs_v(igrid_level)%desc%perd == 1)
656 IF (
map_gaussian_here(rs_v(igrid_level), cell%h_inv, ra, offset, para_env_sub%num_pe, para_env_sub%mepos))
THEN
657 DO ipgf = 1, npgfa(iset)
658 na1 = (ipgf - 1)*
ncoset(la_max(iset)) + 1
659 na2 = ipgf*
ncoset(la_max(iset))
663 lb_min=0, lb_max=0, ra=ra, rb=ra, rp=ra, &
664 zetp=zeta(ipgf, iset), &
665 eps=dft_control%qs_control%eps_gvg_rspace, &
666 prefactor=1.0_dp, cutoff=1.0_dp)
668 CALL integrate_pgf_product(la_max=la_max(iset), zeta=zeta(ipgf, iset)/2.0_dp, la_min=la_min(iset), &
669 lb_max=0, zetb=zeta(ipgf, iset)/2.0_dp, lb_min=0, &
670 ra=ra, rab=(/0.0_dp, 0.0_dp, 0.0_dp/), &
671 rsgrid=rs_v(igrid_level), &
677 calculate_forces=.true., &
678 force_a=force_a, force_b=force_b, &
679 use_virial=use_virial, &
680 my_virial_a=my_virial_a, &
681 my_virial_b=my_virial_b, &
682 use_subpatch=use_subpatch, &
690 offset = offset + nsgfa(iset)
694 force(ikind)%rho_elec(:, atom_a) = &
695 force(ikind)%rho_elec(:, atom_a) + force_a(:) + force_b(:)
697 h_stress = h_stress + my_virial_a + my_virial_b
701 CALL timestop(handle)
720 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(INOUT) :: h_stress
724 CHARACTER(LEN=*),
PARAMETER :: routinen =
'virial_gpw_potential'
726 INTEGER :: alpha, beta, handle
727 INTEGER,
DIMENSION(3) :: comp
728 REAL(kind=
dp) :: e_hartree
731 CALL timeset(routinen, handle)
740 CALL factor_virial_gpw(rho_g, potential_parameter)
741 h_stress(alpha, alpha) = h_stress(alpha, alpha) - e_hartree/real(para_env_sub%num_pe,
dp)
743 h_stress(alpha, beta) = h_stress(alpha, beta) &
745 h_stress(beta, alpha) = h_stress(alpha, beta)
749 CALL timestop(handle)
758 SUBROUTINE factor_virial_gpw(pw, potential_parameter)
762 SELECT CASE (potential_parameter%potential_type)
771 potential_parameter%scale_coulomb, potential_parameter%scale_longrange)
777 cpabort(
"Unknown potential type")
780 END SUBROUTINE factor_virial_gpw
798 SUBROUTINE integrate_potential(pw_env_sub, pot_r, kind_of, atom_of_kind, particle_set, qs_kind_set, &
799 G_PQ_local, cell, force, use_virial, h_stress, para_env_sub, dft_control)
801 TYPE(
pw_env_type),
INTENT(IN),
POINTER :: pw_env_sub
803 INTEGER,
DIMENSION(:),
INTENT(IN) :: kind_of, atom_of_kind
805 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
806 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: g_pq_local
807 TYPE(
cell_type),
INTENT(IN),
POINTER :: cell
809 LOGICAL,
INTENT(IN) :: use_virial
810 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(INOUT) :: h_stress
814 CHARACTER(LEN=*),
PARAMETER :: routinen =
'integrate_potential'
816 INTEGER :: atom_a, handle, iatom, igrid_level, &
817 ikind, ipgf, iset, na1, na2, ncoa, &
819 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, npgfa, nsgfa
820 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa
821 LOGICAL :: use_subpatch
822 REAL(kind=
dp) :: radius
823 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: i_ab
824 REAL(kind=
dp),
DIMENSION(3) :: force_a, force_b, ra
825 REAL(kind=
dp),
DIMENSION(3, 3) :: my_virial_a, my_virial_b
826 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a
827 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: i_tmp2, pab, rpgfa, sphi_a, zeta
833 CALL timeset(routinen, handle)
837 CALL pw_env_get(pw_env_sub, rs_descs=rs_descs, rs_grids=rs_v)
841 DO iatom = 1,
SIZE(kind_of)
842 ikind = kind_of(iatom)
843 atom_a = atom_of_kind(iatom)
844 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), basis_set=basis_set_a, &
847 first_sgfa => basis_set_a%first_sgf
848 la_max => basis_set_a%lmax
849 la_min => basis_set_a%lmin
850 npgfa => basis_set_a%npgf
851 nseta = basis_set_a%nset
852 nsgfa => basis_set_a%nsgf_set
853 rpgfa => basis_set_a%pgf_radius
854 set_radius_a => basis_set_a%set_radius
855 sphi_a => basis_set_a%sphi
856 zeta => basis_set_a%zet
858 ra(:) =
pbc(particle_set(iatom)%r, cell)
868 ncoa = npgfa(iset)*
ncoset(la_max(iset))
869 sgfa = first_sgfa(1, iset)
871 ALLOCATE (i_tmp2(ncoa, 1))
873 ALLOCATE (i_ab(nsgfa(iset), 1))
875 ALLOCATE (pab(ncoa, 1))
878 i_ab(1:nsgfa(iset), 1) = -4.0_dp*g_pq_local(offset + 1:offset + nsgfa(iset))
880 CALL dgemm(
"N",
"N", ncoa, 1, nsgfa(iset), &
881 1.0_dp, sphi_a(1, sgfa),
SIZE(sphi_a, 1), &
882 i_ab(1, 1),
SIZE(i_ab, 1), &
883 0.0_dp, pab(1, 1),
SIZE(pab, 1))
888 use_subpatch = .NOT. all(rs_v(igrid_level)%desc%perd == 1)
890 IF (
map_gaussian_here(rs_v(igrid_level), cell%h_inv, ra, offset, para_env_sub%num_pe, para_env_sub%mepos))
THEN
891 DO ipgf = 1, npgfa(iset)
892 na1 = (ipgf - 1)*
ncoset(la_max(iset)) + 1
893 na2 = ipgf*
ncoset(la_max(iset))
897 lb_min=0, lb_max=0, ra=ra, rb=ra, rp=ra, &
898 zetp=zeta(ipgf, iset), &
899 eps=dft_control%qs_control%eps_gvg_rspace, &
900 prefactor=1.0_dp, cutoff=1.0_dp)
902 CALL integrate_pgf_product(la_max=la_max(iset), zeta=zeta(ipgf, iset)/2.0_dp, la_min=la_min(iset), &
903 lb_max=0, zetb=zeta(ipgf, iset)/2.0_dp, lb_min=0, &
904 ra=ra, rab=(/0.0_dp, 0.0_dp, 0.0_dp/), &
905 rsgrid=rs_v(igrid_level), &
911 calculate_forces=.true., &
912 force_a=force_a, force_b=force_b, &
913 use_virial=use_virial, &
914 my_virial_a=my_virial_a, &
915 my_virial_b=my_virial_b, &
916 use_subpatch=use_subpatch, &
927 offset = offset + nsgfa(iset)
931 force(ikind)%rho_elec(:, atom_a) = &
932 force(ikind)%rho_elec(:, atom_a) + force_a(:) + force_b
934 h_stress = h_stress + my_virial_a + my_virial_b
938 CALL timestop(handle)
960 SUBROUTINE prepare_gpw(qs_env, dft_control, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, &
961 auxbas_pw_pool, poisson_env, task_list_sub, rho_r, rho_g, pot_g, psi_L, sab_orb_sub)
964 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
965 INTENT(OUT) :: e_cutoff_old
966 REAL(kind=
dp),
INTENT(OUT) :: cutoff_old, relative_cutoff_old
969 TYPE(
pw_pool_type),
INTENT(IN),
POINTER :: auxbas_pw_pool
976 INTENT(IN),
POINTER :: sab_orb_sub
978 CHARACTER(LEN=*),
PARAMETER :: routinen =
'prepare_gpw'
980 INTEGER :: handle, i_multigrid, n_multigrid
981 LOGICAL :: skip_load_balance_distributed
982 REAL(kind=
dp) :: progression_factor
985 CALL timeset(routinen, handle)
987 CALL get_qs_env(qs_env, dft_control=dft_control, ks_env=ks_env)
990 progression_factor = dft_control%qs_control%progression_factor
991 n_multigrid =
SIZE(dft_control%qs_control%e_cutoff)
992 ALLOCATE (e_cutoff_old(n_multigrid))
993 e_cutoff_old(:) = dft_control%qs_control%e_cutoff
994 cutoff_old = dft_control%qs_control%cutoff
996 dft_control%qs_control%cutoff = qs_env%mp2_env%mp2_gpw%cutoff*0.5_dp
997 dft_control%qs_control%e_cutoff(1) = dft_control%qs_control%cutoff
998 DO i_multigrid = 2, n_multigrid
999 dft_control%qs_control%e_cutoff(i_multigrid) = dft_control%qs_control%e_cutoff(i_multigrid - 1) &
1003 relative_cutoff_old = dft_control%qs_control%relative_cutoff
1004 dft_control%qs_control%relative_cutoff = qs_env%mp2_env%mp2_gpw%relative_cutoff*0.5_dp
1007 NULLIFY (pw_env_sub)
1011 CALL pw_env_get(pw_env_sub, auxbas_pw_pool=auxbas_pw_pool, &
1012 poisson_env=poisson_env)
1016 NULLIFY (task_list_sub)
1017 skip_load_balance_distributed = dft_control%qs_control%skip_load_balance_distributed
1020 reorder_rs_grid_ranks=.true., soft_valid=.false., &
1021 skip_load_balance_distributed=skip_load_balance_distributed, &
1022 pw_env_external=pw_env_sub, sab_orb_external=sab_orb_sub)
1025 CALL auxbas_pw_pool%create_pw(rho_r)
1026 CALL auxbas_pw_pool%create_pw(rho_g)
1027 CALL auxbas_pw_pool%create_pw(pot_g)
1028 CALL auxbas_pw_pool%create_pw(psi_l)
1034 CALL timestop(handle)
1053 SUBROUTINE cleanup_gpw(qs_env, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, &
1054 task_list_sub, auxbas_pw_pool, rho_r, rho_g, pot_g, psi_L)
1056 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
1057 INTENT(IN) :: e_cutoff_old
1058 REAL(kind=
dp),
INTENT(IN) :: cutoff_old, relative_cutoff_old
1062 TYPE(
pw_pool_type),
INTENT(IN),
POINTER :: auxbas_pw_pool
1067 CHARACTER(LEN=*),
PARAMETER :: routinen =
'cleanup_gpw'
1072 CALL timeset(routinen, handle)
1075 CALL auxbas_pw_pool%give_back_pw(rho_r)
1076 CALL auxbas_pw_pool%give_back_pw(rho_g)
1077 CALL auxbas_pw_pool%give_back_pw(pot_g)
1078 CALL auxbas_pw_pool%give_back_pw(psi_l)
1083 CALL get_qs_env(qs_env, dft_control=dft_control)
1086 dft_control%qs_control%e_cutoff = e_cutoff_old
1087 dft_control%qs_control%cutoff = cutoff_old
1088 dft_control%qs_control%relative_cutoff = relative_cutoff_old
1090 CALL timestop(handle)
1111 INTENT(INOUT),
OPTIONAL :: dvg
1112 LOGICAL,
INTENT(IN),
OPTIONAL :: no_transfer
1114 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_potential_gpw'
1116 INTEGER :: comp(3), handle, idir, my_potential_type
1117 LOGICAL :: my_transfer
1119 CALL timeset(routinen, handle)
1122 IF (
PRESENT(potential_parameter))
THEN
1123 my_potential_type = potential_parameter%potential_type
1126 my_transfer = .true.
1127 IF (
PRESENT(no_transfer)) my_transfer = .NOT. no_transfer
1132 IF (
PRESENT(dvg))
THEN
1141 potential_parameter%scale_coulomb, &
1142 potential_parameter%scale_longrange)
1147 IF (
PRESENT(dvg))
THEN
1149 CALL pw_copy(pot_g, dvg(idir))
1158 IF (my_transfer)
CALL pw_scale(pot_r, pot_r%pw_grid%dvol)
1159 CALL timestop(handle)
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.
All kind of helpful little routines.
real(kind=dp) function, public exp_radius_very_extended(la_min, la_max, lb_min, lb_max, pab, o1, o2, ra, rb, rp, zetp, eps, prefactor, cutoff, epsabs)
computes the radius of the Gaussian outside of which it is smaller than eps
Define the atomic kind types and their sub types.
Handles all functions related to the CELL.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_set(matrix, alpha)
...
integer function, public gaussian_gridlevel(gridlevel_info, exponent)
...
Defines the basic variable types.
integer, parameter, public dp
2- and 3-center electron repulsion integral routines based on libint2 Currently available operators: ...
Definition of mathematical constants and functions.
real(kind=dp), parameter, public fourpi
Interface to the message passing library MPI.
Routines to calculate 2c- and 3c-integrals for RI with GPW.
subroutine, public integrate_potential_forces_3c_2c(matrix_p_munu, rho_r, rho_g, task_list_sub, pw_env_sub, potential_parameter, ks_env, poisson_env, pot_g, use_virial, rho_g_copy, dvg, h_stress, para_env_sub, kind_of, atom_of_kind, qs_kind_set, particle_set, cell, lll, force, dft_control)
Integrates potential of two Gaussians to a potential.
subroutine, public mp2_eri_2c_integrate_gpw(qs_env, para_env_sub, my_group_l_start, my_group_l_end, natom, potential_parameter, sab_orb_sub, l_local_col, kind_of)
Integrates the potential of an RI function.
subroutine, public prepare_gpw(qs_env, dft_control, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, auxbas_pw_pool, poisson_env, task_list_sub, rho_r, rho_g, pot_g, psi_l, sab_orb_sub)
Prepares GPW calculation for RI-MP2/RI-RPA.
subroutine, public integrate_potential_forces_2c(rho_r, lll, rho_g, atomic_kind_set, qs_kind_set, particle_set, cell, pw_env_sub, poisson_env, pot_g, potential_parameter, use_virial, rho_g_copy, dvg, kind_of, atom_of_kind, g_pq_local, force, h_stress, para_env_sub, dft_control, psi_l, factor)
Integrates the potential of a RI function obtaining the forces and stress tensor.
subroutine, public virial_gpw_potential(rho_g_copy, pot_g, rho_g, dvg, h_stress, potential_parameter, para_env_sub)
Calculates stress tensor contribution from the operator.
subroutine, public mp2_eri_3c_integrate_gpw(psi_l, rho_g, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, pw_env_sub, external_vector, poisson_env, rho_r, pot_g, potential_parameter, mat_munu, qs_env, task_list_sub)
...
subroutine, public calc_potential_gpw(pot_r, rho_g, poisson_env, pot_g, potential_parameter, dvg, no_transfer)
Calculates potential from a given density in g-space.
subroutine, public integrate_potential_forces_3c_1c(mat_munu, rho_r, matrix_p_munu, qs_env, pw_env_sub, task_list_sub)
Takes the precomputed potential of an RI wave-function and determines matrix element and gradients wi...
subroutine, public cleanup_gpw(qs_env, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, task_list_sub, auxbas_pw_pool, rho_r, rho_g, pot_g, psi_l)
Cleanup GPW integration for RI-MP2/RI-RPA.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public ncoset
Define the data structure for the particle information.
methods of pw_env that have dependence on qs_env
subroutine, public pw_env_rebuild(pw_env, qs_env, external_para_env)
rebuilds the pw_env data (necessary if cell or cutoffs change)
subroutine, public pw_env_create(pw_env)
creates a pw_env, if qs_env is given calls pw_env_rebuild
container for various plainwaves related things
subroutine, public pw_env_release(pw_env, para_env)
releases the given pw_env (see doc/ReferenceCounting.html)
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
subroutine, public pw_log_deriv_trunc(pw, rcutoff)
Multiply all data points with the logarithmic derivative of the complementary cosine This function is...
subroutine, public pw_gauss_damp(pw, omega)
Multiply all data points with a Gaussian damping factor Needed for longrange Coulomb potential V(\vec...
subroutine, public pw_log_deriv_compl_gauss(pw, omega)
Multiply all data points with the logarithmic derivative of the complementary Gaussian damping factor...
subroutine, public pw_log_deriv_gauss(pw, omega)
Multiply all data points with the logarithmic derivative of a Gaussian.
subroutine, public pw_gauss_damp_mix(pw, omega, scale_coul, scale_long)
Multiply all data points with a Gaussian damping factor and mixes it with the original function Neede...
subroutine, public pw_truncated(pw, rcutoff)
Multiply all data points with a complementary cosine Needed for truncated Coulomb potential V(\vec r)...
subroutine, public pw_derive(pw, n)
Calculate the derivative of a plane wave vector.
subroutine, public pw_compl_gauss_damp(pw, omega)
Multiply all data points with a Gaussian damping factor Needed for longrange Coulomb potential V(\vec...
subroutine, public pw_log_deriv_mix_cl(pw, omega, scale_coul, scale_long)
Multiply all data points with the logarithmic derivative of the mixed longrange/Coulomb potential Nee...
functions related to the poisson solver on regular grids
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_rho_elec(matrix_p, matrix_p_kp, rho, rho_gspace, total_rho, ks_env, soft_valid, compute_tau, compute_grad, basis_type, der_type, idir, task_list_external, pw_env_external)
computes the density corresponding to a given density matrix on the grid
subroutine, public collocate_function(vector, rho, rho_gspace, atomic_kind_set, qs_kind_set, cell, particle_set, pw_env, eps_rho_rspace, basis_type)
maps a given function on the grid
subroutine, public collocate_single_gaussian(rho, rho_gspace, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, pw_env, required_function, basis_type)
maps a single gaussian on the grid
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.
Integrate single or product functions over a potential on a RS grid.
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.
pure logical function, public map_gaussian_here(rs_grid, h_inv, ra, offset, group_size, my_pos)
...
Transfers densities from PW to RS grids and potentials from PW to RS.
subroutine, public potential_pw2rs(rs_v, v_rspace, pw_env)
transfers a potential from a pw_grid to a vector of realspace multigrids
generate the tasks lists used by collocate and integrate routines
subroutine, public generate_qs_task_list(ks_env, task_list, reorder_rs_grid_ranks, skip_load_balance_distributed, soft_valid, basis_type, pw_env_external, sab_orb_external)
...
subroutine, public deallocate_task_list(task_list)
deallocates the components and the object itself
subroutine, public allocate_task_list(task_list)
allocates and initialised the components of the task_list_type
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
stores all the informations relevant to an mpi environment
contained for different pw related things
environment for the poisson solver
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Provides all information about a quickstep kind.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...