71#include "./base/base_uses.f90"
77 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .false.
79 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_integrate_potential_single'
104 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_ppl_rspace'
106 INTEGER :: atom_a, handle, iatom, ikind, j, lppl, &
107 n, natom_of_kind, ni, npme
108 INTEGER,
DIMENSION(:),
POINTER :: atom_list, cores
109 LOGICAL :: use_virial
110 REAL(kind=
dp) :: alpha, eps_rho_rspace, radius
111 REAL(kind=
dp),
DIMENSION(3) :: force_a, force_b, ra
112 REAL(kind=
dp),
DIMENSION(3, 3) :: my_virial_a, my_virial_b
113 REAL(kind=
dp),
DIMENSION(:),
POINTER :: cexp_ppl
114 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: hab, pab
122 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
126 CALL timeset(routinen, handle)
128 NULLIFY (pw_env, cores)
131 CALL pw_env_get(pw_env=pw_env, auxbas_rs_grid=rs_v)
136 atomic_kind_set=atomic_kind_set, &
137 qs_kind_set=qs_kind_set, &
139 dft_control=dft_control, &
140 particle_set=particle_set, &
142 force=force, virial=virial)
144 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
146 eps_rho_rspace = dft_control%qs_control%eps_rho_rspace
148 DO ikind = 1,
SIZE(atomic_kind_set)
150 CALL get_atomic_kind(atomic_kind_set(ikind), natom=natom_of_kind, atom_list=atom_list)
151 CALL get_qs_kind(qs_kind_set(ikind), gth_potential=gth_potential)
153 IF (.NOT.
ASSOCIATED(gth_potential)) cycle
154 CALL get_potential(potential=gth_potential, alpha_ppl=alpha, nexp_ppl=lppl, cexp_ppl=cexp_ppl)
159 ALLOCATE (hab(ni, 1), pab(ni, 1))
170 pab(1, 1) = cexp_ppl(1)
173 pab(n, 1) = cexp_ppl(2)
175 pab(n, 1) = cexp_ppl(2)
177 pab(n, 1) = cexp_ppl(2)
180 pab(n, 1) = cexp_ppl(3)
182 pab(n, 1) = cexp_ppl(3)
184 pab(n, 1) = cexp_ppl(3)
186 pab(n, 1) = 2._dp*cexp_ppl(3)
188 pab(n, 1) = 2._dp*cexp_ppl(3)
190 pab(n, 1) = 2._dp*cexp_ppl(3)
193 pab(n, 1) = cexp_ppl(4)
195 pab(n, 1) = cexp_ppl(4)
197 pab(n, 1) = cexp_ppl(4)
199 pab(n, 1) = 3._dp*cexp_ppl(4)
201 pab(n, 1) = 3._dp*cexp_ppl(4)
203 pab(n, 1) = 3._dp*cexp_ppl(4)
205 pab(n, 1) = 3._dp*cexp_ppl(4)
207 pab(n, 1) = 3._dp*cexp_ppl(4)
209 pab(n, 1) = 3._dp*cexp_ppl(4)
211 pab(n, 1) = 6._dp*cexp_ppl(4)
217 DO iatom = 1, natom_of_kind
218 atom_a = atom_list(iatom)
219 ra(:) =
pbc(particle_set(atom_a)%r, cell)
220 IF (rs_v%desc%parallel .AND. .NOT. rs_v%desc%distributed)
THEN
222 IF (
modulo(iatom, rs_v%desc%group_size) == rs_v%desc%my_pos)
THEN
235 atom_a = atom_list(iatom)
236 ra(:) =
pbc(particle_set(atom_a)%r, cell)
247 ra=ra, rb=ra, rp=ra, &
248 zetp=alpha, eps=eps_rho_rspace, &
249 pab=pab, o1=0, o2=0, &
250 prefactor=1.0_dp, cutoff=1.0_dp)
253 0, 0.0_dp, 0, ra, (/0.0_dp, 0.0_dp, 0.0_dp/), &
254 rs_v, hab, pab=pab, o1=0, o2=0, &
256 calculate_forces=.true., force_a=force_a, &
257 force_b=force_b, use_virial=use_virial, my_virial_a=my_virial_a, &
258 my_virial_b=my_virial_b, use_subpatch=.true., subpatch_pattern=0)
260 force(ikind)%gth_ppl(:, iatom) = &
261 force(ikind)%gth_ppl(:, iatom) + force_a(:)*rho_rspace%pw_grid%dvol
264 virial%pv_ppl = virial%pv_ppl + my_virial_a*rho_rspace%pw_grid%dvol
265 virial%pv_virial = virial%pv_virial + my_virial_a*rho_rspace%pw_grid%dvol
266 cpabort(
"Virial not debuged for CORE_PPL")
270 DEALLOCATE (hab, pab)
276 CALL timestop(handle)
289 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_rho_nlcc'
291 INTEGER :: atom_a, handle, iatom, iexp_nlcc, ikind, &
292 ithread, j, n, natom, nc, nexp_nlcc, &
294 INTEGER,
DIMENSION(:),
POINTER :: atom_list, cores, nct_nlcc
295 LOGICAL :: nlcc, use_virial
296 REAL(kind=
dp) :: alpha, eps_rho_rspace, radius
297 REAL(kind=
dp),
DIMENSION(3) :: force_a, force_b, ra
298 REAL(kind=
dp),
DIMENSION(3, 3) :: my_virial_a, my_virial_b
299 REAL(kind=
dp),
DIMENSION(:),
POINTER :: alpha_nlcc
300 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: cval_nlcc, hab, pab
308 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
312 CALL timeset(routinen, handle)
314 NULLIFY (pw_env, cores)
317 CALL pw_env_get(pw_env=pw_env, auxbas_rs_grid=rs_v)
322 atomic_kind_set=atomic_kind_set, &
323 qs_kind_set=qs_kind_set, &
325 dft_control=dft_control, &
326 particle_set=particle_set, &
328 force=force, virial=virial)
330 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
332 eps_rho_rspace = dft_control%qs_control%eps_rho_rspace
334 DO ikind = 1,
SIZE(atomic_kind_set)
336 CALL get_atomic_kind(atomic_kind_set(ikind), natom=natom, atom_list=atom_list)
337 CALL get_qs_kind(qs_kind_set(ikind), gth_potential=gth_potential)
339 IF (.NOT.
ASSOCIATED(gth_potential)) cycle
340 CALL get_potential(potential=gth_potential, nlcc_present=nlcc, nexp_nlcc=nexp_nlcc, &
341 alpha_nlcc=alpha_nlcc, nct_nlcc=nct_nlcc, cval_nlcc=cval_nlcc)
343 IF (.NOT. nlcc) cycle
345 DO iexp_nlcc = 1, nexp_nlcc
347 alpha = alpha_nlcc(iexp_nlcc)
348 nc = nct_nlcc(iexp_nlcc)
355 ALLOCATE (hab(ni, 1), pab(ni, 1))
366 pab(1, 1) = cval_nlcc(1, iexp_nlcc)
369 pab(n, 1) = cval_nlcc(2, iexp_nlcc)/alpha**2
371 pab(n, 1) = cval_nlcc(2, iexp_nlcc)/alpha**2
373 pab(n, 1) = cval_nlcc(2, iexp_nlcc)/alpha**2
376 pab(n, 1) = cval_nlcc(3, iexp_nlcc)/alpha**4
378 pab(n, 1) = cval_nlcc(3, iexp_nlcc)/alpha**4
380 pab(n, 1) = cval_nlcc(3, iexp_nlcc)/alpha**4
382 pab(n, 1) = 2._dp*cval_nlcc(3, iexp_nlcc)/alpha**4
384 pab(n, 1) = 2._dp*cval_nlcc(3, iexp_nlcc)/alpha**4
386 pab(n, 1) = 2._dp*cval_nlcc(3, iexp_nlcc)/alpha**4
389 pab(n, 1) = cval_nlcc(4, iexp_nlcc)/alpha**6
391 pab(n, 1) = cval_nlcc(4, iexp_nlcc)/alpha**6
393 pab(n, 1) = cval_nlcc(4, iexp_nlcc)/alpha**6
395 pab(n, 1) = 3._dp*cval_nlcc(4, iexp_nlcc)/alpha**6
397 pab(n, 1) = 3._dp*cval_nlcc(4, iexp_nlcc)/alpha**6
399 pab(n, 1) = 3._dp*cval_nlcc(4, iexp_nlcc)/alpha**6
401 pab(n, 1) = 3._dp*cval_nlcc(4, iexp_nlcc)/alpha**6
403 pab(n, 1) = 3._dp*cval_nlcc(4, iexp_nlcc)/alpha**6
405 pab(n, 1) = 3._dp*cval_nlcc(4, iexp_nlcc)/alpha**6
407 pab(n, 1) = 6._dp*cval_nlcc(4, iexp_nlcc)/alpha**6
412 IF (dft_control%nspins == 2) pab = pab*0.5_dp
415 atom_a = atom_list(iatom)
416 ra(:) =
pbc(particle_set(atom_a)%r, cell)
417 IF (rs_v%desc%parallel .AND. .NOT. rs_v%desc%distributed)
THEN
419 IF (
modulo(iatom, rs_v%desc%group_size) == rs_v%desc%my_pos)
THEN
432 atom_a = atom_list(iatom)
433 ra(:) =
pbc(particle_set(atom_a)%r, cell)
444 ra=ra, rb=ra, rp=ra, &
445 zetp=1/(2*alpha**2), eps=eps_rho_rspace, &
446 pab=pab, o1=0, o2=0, &
447 prefactor=1.0_dp, cutoff=1.0_dp)
450 0, 0.0_dp, 0, ra, (/0.0_dp, 0.0_dp, 0.0_dp/), &
451 rs_v, hab, pab=pab, o1=0, o2=0, &
453 calculate_forces=.true., force_a=force_a, &
454 force_b=force_b, use_virial=use_virial, my_virial_a=my_virial_a, &
455 my_virial_b=my_virial_b, use_subpatch=.true., subpatch_pattern=0)
457 force(ikind)%gth_nlcc(:, iatom) = &
458 force(ikind)%gth_nlcc(:, iatom) + force_a(:)*rho_rspace%pw_grid%dvol
461 virial%pv_nlcc = virial%pv_nlcc + my_virial_a*rho_rspace%pw_grid%dvol
462 virial%pv_virial = virial%pv_virial + my_virial_a*rho_rspace%pw_grid%dvol
466 DEALLOCATE (hab, pab)
474 CALL timestop(handle)
488 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL :: atecc
490 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_v_core_rspace'
492 INTEGER :: atom_a, handle, iatom, ikind, j, natom, &
494 INTEGER,
DIMENSION(:),
POINTER :: atom_list, cores
495 LOGICAL :: paw_atom, skip_fcore, use_virial
496 REAL(kind=
dp) :: alpha_core_charge, ccore_charge, &
497 eps_rho_rspace, radius
498 REAL(kind=
dp),
DIMENSION(3) :: force_a, force_b, ra
499 REAL(kind=
dp),
DIMENSION(3, 3) :: my_virial_a, my_virial_b
500 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: hab, pab
508 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
512 CALL timeset(routinen, handle)
513 NULLIFY (virial, force, atprop, dft_control)
515 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
519 IF (dft_control%qs_control%gapw)
THEN
520 IF (.NOT. dft_control%qs_control%gapw_control%nopaw_as_gpw) skip_fcore = .true.
523 IF (.NOT. skip_fcore)
THEN
530 CALL pw_env_get(pw_env=pw_env, auxbas_rs_grid=rs_v)
535 atomic_kind_set=atomic_kind_set, &
536 qs_kind_set=qs_kind_set, &
538 dft_control=dft_control, &
539 particle_set=particle_set, &
546 natom =
SIZE(particle_set)
547 IF (
ASSOCIATED(atprop))
THEN
551 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
553 eps_rho_rspace = dft_control%qs_control%eps_rho_rspace
555 DO ikind = 1,
SIZE(atomic_kind_set)
557 CALL get_atomic_kind(atomic_kind_set(ikind), natom=natom_of_kind, atom_list=atom_list)
558 CALL get_qs_kind(qs_kind_set(ikind), paw_atom=paw_atom, &
559 alpha_core_charge=alpha_core_charge, &
560 ccore_charge=ccore_charge)
562 IF (dft_control%qs_control%gapw .AND. paw_atom) cycle
564 pab(1, 1) = -ccore_charge
565 IF (alpha_core_charge == 0.0_dp .OR. pab(1, 1) == 0.0_dp) cycle
571 DO iatom = 1, natom_of_kind
572 atom_a = atom_list(iatom)
573 ra(:) =
pbc(particle_set(atom_a)%r, cell)
574 IF (rs_v%desc%parallel .AND. .NOT. rs_v%desc%distributed)
THEN
576 IF (
modulo(iatom, rs_v%desc%group_size) == rs_v%desc%my_pos)
THEN
589 atom_a = atom_list(iatom)
590 ra(:) =
pbc(particle_set(atom_a)%r, cell)
600 ra=ra, rb=ra, rp=ra, &
601 zetp=alpha_core_charge, eps=eps_rho_rspace, &
602 pab=pab, o1=0, o2=0, &
603 prefactor=1.0_dp, cutoff=1.0_dp)
606 0, 0.0_dp, 0, ra, (/0.0_dp, 0.0_dp, 0.0_dp/), &
607 rs_v, hab, pab=pab, o1=0, o2=0, &
609 calculate_forces=.true., force_a=force_a, &
610 force_b=force_b, use_virial=use_virial, my_virial_a=my_virial_a, &
611 my_virial_b=my_virial_b, use_subpatch=.true., subpatch_pattern=0)
613 IF (
ASSOCIATED(force))
THEN
614 force(ikind)%rho_core(:, iatom) = force(ikind)%rho_core(:, iatom) + force_a(:)
617 virial%pv_ehartree = virial%pv_ehartree + my_virial_a
618 virial%pv_virial = virial%pv_virial + my_virial_a
620 IF (
ASSOCIATED(atprop))
THEN
621 atprop%ateb(atom_a) = atprop%ateb(atom_a) + 0.5_dp*hab(1, 1)*pab(1, 1)
623 IF (
PRESENT(atecc))
THEN
624 atecc(atom_a) = atecc(atom_a) + 0.5_dp*hab(1, 1)*pab(1, 1)
631 DEALLOCATE (hab, pab, cores)
635 CALL timestop(handle)
650 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: alpha, ccore
651 REAL(kind=
dp),
DIMENSION(:) :: atecc
653 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_v_gaussian_rspace'
655 INTEGER :: atom_a, handle, iatom, ikind, j, natom, &
657 INTEGER,
DIMENSION(:),
POINTER :: atom_list, cores
658 REAL(kind=
dp) :: alpha_core_charge, eps_rho_rspace, radius
659 REAL(kind=
dp),
DIMENSION(3) :: ra
660 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: hab, pab
666 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
669 CALL timeset(routinen, handle)
671 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
674 cpassert(.NOT. dft_control%qs_control%gapw)
682 CALL pw_env_get(pw_env=pw_env, auxbas_rs_grid=rs_v)
687 atomic_kind_set=atomic_kind_set, &
688 qs_kind_set=qs_kind_set, &
690 dft_control=dft_control, &
691 particle_set=particle_set, &
695 natom =
SIZE(particle_set)
696 eps_rho_rspace = dft_control%qs_control%eps_rho_rspace
698 DO ikind = 1,
SIZE(atomic_kind_set)
700 CALL get_atomic_kind(atomic_kind_set(ikind), natom=natom_of_kind, atom_list=atom_list)
701 pab(1, 1) = -ccore(ikind)
702 alpha_core_charge = alpha(ikind)
703 IF (alpha_core_charge == 0.0_dp .OR. pab(1, 1) == 0.0_dp) cycle
709 DO iatom = 1, natom_of_kind
710 atom_a = atom_list(iatom)
711 ra(:) =
pbc(particle_set(atom_a)%r, cell)
712 IF (rs_v%desc%parallel .AND. .NOT. rs_v%desc%distributed)
THEN
714 IF (
modulo(iatom, rs_v%desc%group_size) == rs_v%desc%my_pos)
THEN
727 atom_a = atom_list(iatom)
728 ra(:) =
pbc(particle_set(atom_a)%r, cell)
732 ra=ra, rb=ra, rp=ra, &
733 zetp=alpha_core_charge, eps=eps_rho_rspace, &
734 pab=pab, o1=0, o2=0, &
735 prefactor=1.0_dp, cutoff=1.0_dp)
738 0, 0.0_dp, 0, ra, (/0.0_dp, 0.0_dp, 0.0_dp/), &
739 rs_v, hab, pab=pab, o1=0, o2=0, &
740 radius=radius, calculate_forces=.false., &
741 use_subpatch=.true., subpatch_pattern=0)
742 atecc(atom_a) = atecc(atom_a) + 0.5_dp*hab(1, 1)*pab(1, 1)
748 DEALLOCATE (hab, pab, cores)
750 CALL timestop(handle)
765 calculate_forces, basis_type, atomlist)
769 LOGICAL,
INTENT(IN) :: calculate_forces
770 CHARACTER(len=*),
INTENT(IN) :: basis_type
771 INTEGER,
DIMENSION(:),
OPTIONAL :: atomlist
773 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_v_rspace_one_center'
775 INTEGER :: atom_a, group_size, handle, i, iatom, igrid_level, ikind, ipgf, iset, m1, maxco, &
776 maxsgf_set, my_pos, na1, natom_of_kind, ncoa, nkind, nseta, offset, sgfa
777 INTEGER,
DIMENSION(:),
POINTER :: atom_list, la_max, la_min, npgfa, &
779 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa
780 LOGICAL :: use_virial
781 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: map_it
782 REAL(kind=
dp) :: eps_rho_rspace, radius
783 REAL(kind=
dp),
DIMENSION(3) :: force_a, force_b, ra
784 REAL(kind=
dp),
DIMENSION(3, 3) :: my_virial_a, my_virial_b
785 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a
786 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: hab, pab, rpgfa, sphi_a, work_f, work_i, &
795 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
800 CALL timeset(routinen, handle)
802 NULLIFY (atomic_kind_set, qs_kind_set, atom_list, cell, dft_control, &
803 first_sgfa, gridlevel_info, hab, la_max, la_min, lri_basis_set, &
804 npgfa, nsgf_seta, pab, particle_set, pw_env, rpgfa, &
805 rs_grid, rs_v, virial, set_radius_a, sphi_a, work_f, &
815 gridlevel_info => pw_env%gridlevel_info
820 atomic_kind_set=atomic_kind_set, &
821 qs_kind_set=qs_kind_set, &
823 dft_control=dft_control, &
825 particle_set=particle_set, &
829 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
831 eps_rho_rspace = dft_control%qs_control%eps_rho_rspace
834 my_pos = v_rspace%pw_grid%para%group%mepos
835 group_size = v_rspace%pw_grid%para%group%num_pe
839 CALL get_atomic_kind(atomic_kind_set(ikind), natom=natom_of_kind, atom_list=atom_list)
840 CALL get_qs_kind(qs_kind_set(ikind), basis_set=lri_basis_set, basis_type=basis_type)
842 first_sgf=first_sgfa, &
846 maxsgf_set=maxsgf_set, &
849 nsgf_set=nsgf_seta, &
851 set_radius=set_radius_a, &
855 ALLOCATE (hab(maxco, 1), pab(maxco, 1))
859 DO iatom = 1, natom_of_kind
861 atom_a = atom_list(iatom)
862 IF (
PRESENT(atomlist))
THEN
863 IF (atomlist(atom_a) == 0) cycle
865 ra(:) =
pbc(particle_set(atom_a)%r, cell)
868 my_virial_a(:, :) = 0._dp
869 my_virial_b(:, :) = 0._dp
871 m1 = maxval(npgfa(1:nseta))
872 ALLOCATE (map_it(m1))
877 DO ipgf = 1, npgfa(iset)
879 rs_grid => rs_v(igrid_level)
880 map_it(ipgf) =
map_gaussian_here(rs_grid, cell%h_inv, ra, offset, group_size, my_pos)
884 IF (any(map_it(1:npgfa(iset))))
THEN
885 sgfa = first_sgfa(1, iset)
886 ncoa = npgfa(iset)*
ncoset(la_max(iset))
888 ALLOCATE (work_i(nsgf_seta(iset), 1))
892 IF (calculate_forces)
THEN
893 m1 = sgfa + nsgf_seta(iset) - 1
894 ALLOCATE (work_f(nsgf_seta(iset), 1))
895 work_f(1:nsgf_seta(iset), 1) = int_res(ikind)%acoef(iatom, sgfa:m1)
896 CALL dgemm(
"N",
"N", ncoa, 1, nsgf_seta(iset), 1.0_dp, sphi_a(1, sgfa), &
897 SIZE(sphi_a, 1), work_f(1, 1),
SIZE(work_f, 1), 0.0_dp, pab(1, 1), &
902 DO ipgf = 1, npgfa(iset)
903 na1 = (ipgf - 1)*
ncoset(la_max(iset))
905 rs_grid => rs_v(igrid_level)
908 lb_min=0, lb_max=0, ra=ra, rb=ra, rp=ra, &
909 zetp=zeta(ipgf, iset), eps=eps_rho_rspace, &
910 prefactor=1.0_dp, cutoff=1.0_dp)
912 IF (map_it(ipgf))
THEN
913 IF (.NOT. calculate_forces)
THEN
915 zeta=zeta(ipgf, iset), la_min=la_min(iset), &
916 lb_max=0, zetb=0.0_dp, lb_min=0, &
917 ra=ra, rab=(/0.0_dp, 0.0_dp, 0.0_dp/), &
919 hab=hab, o1=na1, o2=0, radius=radius, &
920 calculate_forces=calculate_forces)
923 zeta=zeta(ipgf, iset), la_min=la_min(iset), &
924 lb_max=0, zetb=0.0_dp, lb_min=0, &
925 ra=ra, rab=(/0.0_dp, 0.0_dp, 0.0_dp/), &
927 hab=hab, pab=pab, o1=na1, o2=0, radius=radius, &
928 calculate_forces=calculate_forces, &
929 force_a=force_a, force_b=force_b, &
930 use_virial=use_virial, &
931 my_virial_a=my_virial_a, my_virial_b=my_virial_b)
936 CALL dgemm(
"T",
"N", nsgf_seta(iset), 1, ncoa, 1.0_dp, sphi_a(1, sgfa), &
937 SIZE(sphi_a, 1), hab(1, 1),
SIZE(hab, 1), 0.0_dp, work_i(1, 1),
SIZE(work_i, 1))
939 int_res(ikind)%v_int(iatom, sgfa:sgfa - 1 + nsgf_seta(iset)) = &
940 int_res(ikind)%v_int(iatom, sgfa:sgfa - 1 + nsgf_seta(iset)) + work_i(1:nsgf_seta(iset), 1)
945 IF (calculate_forces)
THEN
946 int_res(ikind)%v_dfdr(iatom, :) = int_res(ikind)%v_dfdr(iatom, :) + force_a(:)
948 virial%pv_lrigpw = virial%pv_lrigpw + my_virial_a
949 virial%pv_virial = virial%pv_virial + my_virial_a
957 DEALLOCATE (hab, pab)
960 CALL timestop(handle)
977 TYPE(
dbcsr_type),
INTENT(INOUT) :: ksmat, pmat
979 LOGICAL,
INTENT(IN) :: calculate_forces
980 CHARACTER(len=*),
INTENT(IN) :: basis_type
982 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_v_rspace_diagonal'
984 INTEGER :: atom_a, group_size, handle, iatom, igrid_level, ikind, ipgf, iset, jpgf, jset, &
985 m1, maxco, maxsgf_set, my_pos, na1, na2, natom_of_kind, nb1, nb2, ncoa, ncob, nkind, &
986 nseta, nsgfa, offset, sgfa, sgfb
987 INTEGER,
DIMENSION(:),
POINTER :: atom_list, la_max, la_min, npgfa, &
989 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa
990 LOGICAL :: found, use_virial
991 LOGICAL,
ALLOCATABLE,
DIMENSION(:, :) :: map_it2
992 REAL(kind=
dp) :: eps_rho_rspace, radius, zetp
993 REAL(kind=
dp),
DIMENSION(3) :: force_a, force_b, ra
994 REAL(kind=
dp),
DIMENSION(3, 3) :: my_virial_a, my_virial_b
995 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a
996 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: h_block, hab, hmat, p_block, pab, pblk, &
997 rpgfa, sphi_a, work, zeta
1007 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1012 CALL timeset(routinen, handle)
1014 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1018 gridlevel_info => pw_env%gridlevel_info
1021 atomic_kind_set=atomic_kind_set, &
1022 qs_kind_set=qs_kind_set, &
1024 dft_control=dft_control, &
1026 particle_set=particle_set, &
1031 eps_rho_rspace = dft_control%qs_control%eps_rho_rspace
1032 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
1035 my_pos = v_rspace%pw_grid%para%group%mepos
1036 group_size = v_rspace%pw_grid%para%group%num_pe
1040 CALL get_atomic_kind(atomic_kind_set(ikind), natom=natom_of_kind, atom_list=atom_list)
1041 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set, basis_type=basis_type)
1043 lmax=la_max, lmin=la_min, maxco=maxco, maxsgf_set=maxsgf_set, &
1044 npgf=npgfa, nset=nseta, nsgf_set=nsgf_seta, nsgf=nsgfa, &
1045 first_sgf=first_sgfa, pgf_radius=rpgfa, set_radius=set_radius_a, &
1046 sphi=sphi_a, zet=zeta)
1048 ALLOCATE (hab(maxco, maxco), work(maxco, maxsgf_set), hmat(nsgfa, nsgfa))
1049 IF (calculate_forces)
ALLOCATE (pab(maxco, maxco), pblk(nsgfa, nsgfa))
1051 DO iatom = 1, natom_of_kind
1052 atom_a = atom_list(iatom)
1053 ra(:) =
pbc(particle_set(atom_a)%r, cell)
1055 IF (calculate_forces)
THEN
1056 CALL dbcsr_get_block_p(matrix=pmat, row=atom_a, col=atom_a, block=p_block, found=found)
1058 pblk(1:nsgfa, 1:nsgfa) = p_block(1:nsgfa, 1:nsgfa)
1062 CALL para_env%sum(pblk)
1065 IF (use_virial)
THEN
1066 my_virial_a = 0.0_dp
1067 my_virial_b = 0.0_dp
1070 m1 = maxval(npgfa(1:nseta))
1071 ALLOCATE (map_it2(m1, m1))
1073 sgfa = first_sgfa(1, iset)
1074 ncoa = npgfa(iset)*
ncoset(la_max(iset))
1076 sgfb = first_sgfa(1, jset)
1077 ncob = npgfa(jset)*
ncoset(la_max(jset))
1080 DO ipgf = 1, npgfa(iset)
1081 DO jpgf = 1, npgfa(jset)
1082 zetp = zeta(ipgf, iset) + zeta(jpgf, jset)
1084 rs_grid => rs_v(igrid_level)
1085 map_it2(ipgf, jpgf) =
map_gaussian_here(rs_grid, cell%h_inv, ra, offset, group_size, my_pos)
1090 IF (any(map_it2(1:npgfa(iset), 1:npgfa(jset))))
THEN
1092 IF (calculate_forces)
THEN
1093 CALL dgemm(
"N",
"N", ncoa, nsgf_seta(jset), nsgf_seta(iset), &
1094 1.0_dp, sphi_a(1, sgfa),
SIZE(sphi_a, 1), &
1095 pblk(sgfa, sgfb),
SIZE(pblk, 1), &
1096 0.0_dp, work(1, 1),
SIZE(work, 1))
1097 CALL dgemm(
"N",
"T", ncoa, ncob, nsgf_seta(jset), &
1098 1.0_dp, work(1, 1),
SIZE(work, 1), &
1099 sphi_a(1, sgfb),
SIZE(sphi_a, 1), &
1100 0.0_dp, pab(1, 1),
SIZE(pab, 1))
1103 DO ipgf = 1, npgfa(iset)
1104 na1 = (ipgf - 1)*
ncoset(la_max(iset))
1105 na2 = ipgf*
ncoset(la_max(iset))
1106 DO jpgf = 1, npgfa(jset)
1107 nb1 = (jpgf - 1)*
ncoset(la_max(jset))
1108 nb2 = jpgf*
ncoset(la_max(jset))
1109 zetp = zeta(ipgf, iset) + zeta(jpgf, jset)
1111 rs_grid => rs_v(igrid_level)
1114 lb_min=la_min(jset), lb_max=la_max(jset), &
1115 ra=ra, rb=ra, rp=ra, &
1116 zetp=zetp, eps=eps_rho_rspace, &
1117 prefactor=1.0_dp, cutoff=1.0_dp)
1119 IF (map_it2(ipgf, jpgf))
THEN
1120 IF (calculate_forces)
THEN
1122 la_max(iset), zeta(ipgf, iset), la_min(iset), &
1123 la_max(jset), zeta(jpgf, jset), la_min(jset), &
1124 ra=ra, rab=(/0.0_dp, 0.0_dp, 0.0_dp/), &
1125 rsgrid=rs_v(igrid_level), &
1126 hab=hab, pab=pab, o1=na1, o2=nb1, &
1128 calculate_forces=.true., &
1129 force_a=force_a, force_b=force_b, &
1130 use_virial=use_virial, my_virial_a=my_virial_a, my_virial_b=my_virial_b)
1133 la_max(iset), zeta(ipgf, iset), la_min(iset), &
1134 la_max(jset), zeta(jpgf, jset), la_min(jset), &
1135 ra=ra, rab=(/0.0_dp, 0.0_dp, 0.0_dp/), &
1136 rsgrid=rs_v(igrid_level), &
1137 hab=hab, o1=na1, o2=nb1, &
1139 calculate_forces=.false.)
1145 CALL dgemm(
"N",
"N", ncoa, nsgf_seta(jset), ncob, &
1146 1.0_dp, hab(1, 1),
SIZE(hab, 1), &
1147 sphi_a(1, sgfb),
SIZE(sphi_a, 1), &
1148 0.0_dp, work(1, 1),
SIZE(work, 1))
1149 CALL dgemm(
"T",
"N", nsgf_seta(iset), nsgf_seta(jset), ncoa, &
1150 1.0_dp, sphi_a(1, sgfa),
SIZE(sphi_a, 1), &
1151 work(1, 1),
SIZE(work, 1), &
1152 1.0_dp, hmat(sgfa, sgfb),
SIZE(hmat, 1))
1156 DEALLOCATE (map_it2)
1158 CALL para_env%sum(hmat)
1159 CALL dbcsr_get_block_p(matrix=ksmat, row=atom_a, col=atom_a, block=h_block, found=found)
1161 h_block(1:nsgfa, 1:nsgfa) = h_block(1:nsgfa, 1:nsgfa) + hmat(1:nsgfa, 1:nsgfa)
1163 IF (calculate_forces)
THEN
1164 force(ikind)%rho_elec(:, iatom) = force(ikind)%rho_elec(:, iatom) + 2.0_dp*force_a(:)
1165 IF (use_virial)
THEN
1166 IF (use_virial .AND. calculate_forces)
THEN
1167 virial%pv_lrigpw = virial%pv_lrigpw + 2.0_dp*my_virial_a
1168 virial%pv_virial = virial%pv_virial + 2.0_dp*my_virial_a
1173 DEALLOCATE (hab, work, hmat)
1174 IF (calculate_forces)
DEALLOCATE (pab, pblk)
1177 CALL timestop(handle)
1195 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: f_coef
1196 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: f_integral
1197 LOGICAL,
INTENT(IN) :: calculate_forces
1198 CHARACTER(len=*),
INTENT(IN) :: basis_type
1200 CHARACTER(len=*),
PARAMETER :: routinen =
'integrate_function'
1202 INTEGER :: atom_a, group_size, handle, i, iatom, igrid_level, ikind, ipgf, iset, maxco, &
1203 maxsgf_set, my_pos, na1, natom, ncoa, nkind, nseta, offset, sgfa
1204 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind
1205 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, npgfa, nsgfa
1206 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa
1207 LOGICAL :: use_virial
1208 REAL(kind=
dp) :: eps_rho_rspace, radius
1209 REAL(kind=
dp),
DIMENSION(3) :: force_a, force_b, ra
1210 REAL(kind=
dp),
DIMENSION(3, 3) :: my_virial_a, my_virial_b
1211 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: hab, pab, sphi_a, work, zeta
1220 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1225 CALL timeset(routinen, handle)
1227 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1228 gridlevel_info => pw_env%gridlevel_info
1234 atomic_kind_set=atomic_kind_set, &
1235 qs_kind_set=qs_kind_set, &
1238 dft_control=dft_control, &
1241 particle_set=particle_set, &
1246 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
1247 IF (use_virial)
THEN
1248 cpabort(
"Virial NYA")
1251 eps_rho_rspace = dft_control%qs_control%eps_rho_rspace
1254 maxco=maxco, maxsgf_set=maxsgf_set, basis_type=basis_type)
1255 ALLOCATE (hab(maxco, 1), pab(maxco, 1), work(maxco, 1))
1258 my_pos = v_rspace%pw_grid%para%group%mepos
1259 group_size = v_rspace%pw_grid%para%group%num_pe
1262 ikind = particle_set(iatom)%atomic_kind%kind_number
1263 atom_a = atom_of_kind(iatom)
1264 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set, basis_type=basis_type)
1266 first_sgf=first_sgfa, &
1274 ra(:) =
pbc(particle_set(iatom)%r, cell)
1278 my_virial_a(:, :) = 0._dp
1279 my_virial_b(:, :) = 0._dp
1283 ncoa = npgfa(iset)*
ncoset(la_max(iset))
1284 sgfa = first_sgfa(1, iset)
1289 DO i = 1, nsgfa(iset)
1290 work(i, 1) = f_coef(offset + i)
1293 CALL dgemm(
"N",
"N", ncoa, 1, nsgfa(iset), &
1294 1.0_dp, sphi_a(1, sgfa),
SIZE(sphi_a, 1), &
1295 work(1, 1),
SIZE(work, 1), &
1296 0.0_dp, pab(1, 1),
SIZE(pab, 1))
1298 DO ipgf = 1, npgfa(iset)
1300 na1 = (ipgf - 1)*
ncoset(la_max(iset))
1303 rs_grid => rs_v(igrid_level)
1305 IF (
map_gaussian_here(rs_grid, cell%h_inv, ra, offset, group_size, my_pos))
THEN
1307 lb_min=0, lb_max=0, ra=ra, rb=ra, rp=ra, &
1308 zetp=zeta(ipgf, iset), eps=eps_rho_rspace, &
1309 prefactor=1.0_dp, cutoff=1.0_dp)
1311 IF (calculate_forces)
THEN
1313 zeta=zeta(ipgf, iset), la_min=la_min(iset), &
1314 lb_max=0, zetb=0.0_dp, lb_min=0, &
1315 ra=ra, rab=(/0.0_dp, 0.0_dp, 0.0_dp/), &
1317 hab=hab, pab=pab, o1=na1, o2=0, radius=radius, &
1318 calculate_forces=.true., &
1319 force_a=force_a, force_b=force_b, &
1320 use_virial=use_virial, &
1321 my_virial_a=my_virial_a, my_virial_b=my_virial_b)
1324 zeta=zeta(ipgf, iset), la_min=la_min(iset), &
1325 lb_max=0, zetb=0.0_dp, lb_min=0, &
1326 ra=ra, rab=(/0.0_dp, 0.0_dp, 0.0_dp/), &
1328 hab=hab, o1=na1, o2=0, radius=radius, &
1329 calculate_forces=.false.)
1336 CALL dgemm(
"T",
"N", nsgfa(iset), 1, ncoa, 1.0_dp, sphi_a(1, sgfa), &
1337 SIZE(sphi_a, 1), hab(1, 1),
SIZE(hab, 1), 0.0_dp, work(1, 1),
SIZE(work, 1))
1338 DO i = 1, nsgfa(iset)
1339 f_integral(offset + i) = work(i, 1)
1342 offset = offset + nsgfa(iset)
1346 IF (calculate_forces)
THEN
1347 force(ikind)%rho_elec(:, atom_a) = force(ikind)%rho_elec(:, atom_a) + force_a(:)
1348 IF (use_virial)
THEN
1349 virial%pv_virial = virial%pv_virial + my_virial_a
1355 DEALLOCATE (hab, pab, work)
1357 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.
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.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Holds information on atomic properties.
subroutine, public atprop_array_init(atarray, natom)
...
subroutine, public get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius, npgf_seg_sum)
...
Handles all functions related to the CELL.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
Definition of the atomic potential types.
integer function, public gaussian_gridlevel(gridlevel_info, exponent)
...
Fortran API for the grid package, which is written in C.
subroutine, public integrate_pgf_product(la_max, zeta, la_min, lb_max, zetb, lb_min, ra, rab, rsgrid, hab, pab, o1, o2, radius, calculate_forces, force_a, force_b, compute_tau, use_virial, my_virial_a, my_virial_b, hdab, hadb, a_hdab, use_subpatch, subpatch_pattern)
low level function to compute matrix elements of primitive gaussian functions
Defines the basic variable types.
integer, parameter, public dp
contains the types and subroutines for dealing with the lri_env lri : local resolution of the identit...
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 ncoset
integer, dimension(:, :, :), allocatable, public coset
Define the data structure for the particle information.
container for various plainwaves related things
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 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.
Build up the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public integrate_function(qs_env, v_rspace, f_coef, f_integral, calculate_forces, basis_type)
computes integrals of product of v_rspace times a basis function (vector function) and possible force...
subroutine, public integrate_v_gaussian_rspace(v_rspace, qs_env, alpha, ccore, atecc)
computes the overlap of a set of Gaussians with a potential on grid
subroutine, public integrate_v_rspace_diagonal(v_rspace, ksmat, pmat, qs_env, calculate_forces, basis_type)
computes integrals of product of v_rspace times the diagonal block basis functions required for LRIGP...
subroutine, public integrate_v_core_rspace(v_rspace, qs_env, atecc)
computes the forces/virial due to the ionic cores with a potential on grid
subroutine, public integrate_v_rspace_one_center(v_rspace, qs_env, int_res, calculate_forces, basis_type, atomlist)
computes integrals of product of v_rspace times a one-center function required for LRIGPW
subroutine, public integrate_ppl_rspace(rho_rspace, qs_env)
computes the forces/virial due to the local pseudopotential
subroutine, public integrate_rho_nlcc(rho_rspace, qs_env)
computes the forces/virial due to the nlcc pseudopotential
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.
subroutine, public transfer_pw2rs(rs, pw)
...
pure logical function, public map_gaussian_here(rs_grid, h_inv, ra, offset, group_size, my_pos)
...
subroutine, public rs_grid_zero(rs)
Initialize grid to zero.
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
Provides all information about an atomic kind.
type for the atomic properties
Type defining parameters related to the simulation cell.
stores all the informations relevant to an mpi environment
contained for different pw related things
Provides all information about a quickstep kind.