102#include "./base/base_uses.f90"
110 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xc_pot_saop'
113 REAL(KIND=
dp),
PARAMETER :: alpha = 1.19_dp, beta = 0.01_dp, k_rho = 0.42_dp
114 REAL(KIND=
dp),
PARAMETER :: kappa = 0.804_dp, mu = 0.21951_dp, &
115 beta_ec = 0.066725_dp, gamma_saop = 0.031091_dp
129 INTEGER,
INTENT(IN) :: oe_corr
131 INTEGER :: dft_method_id, homo, i, ispin, j, k, &
132 nspins, orb, xc_deriv_method_id, &
134 INTEGER,
DIMENSION(2) :: ncol, nrow
135 INTEGER,
DIMENSION(2, 3) :: bo
136 LOGICAL :: compute_virial, gapw, lsd
137 REAL(kind=
dp) :: density_cut, efac, gradient_cut, &
138 tau_cut, we_gllb, we_lb, xc_energy
139 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: coeff_col
140 REAL(kind=
dp),
DIMENSION(3, 3) :: virial_xc_tmp
141 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
142 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: e_uniform
143 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: single_mo_coeff
145 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: orbital_density_matrix, rho_struct_ao
146 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: molecular_orbitals
152 TYPE(
pw_r3d_rs_type),
ALLOCATABLE,
DIMENSION(:) :: vxc_gllb, vxc_saop
153 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, rho_struct_r, tau, vxc_lb, &
158 xc_fun_section_tmp, xc_section_orig, &
166 NULLIFY (ks_env, pw_env, auxbas_pw_pool, input)
167 NULLIFY (rho_g, rho_r, tau, rho_struct, e_uniform)
168 NULLIFY (vxc_lb, vxc_tmp, vxc_tau)
169 NULLIFY (mo_eigenvalues, deriv, rho_struct_r, rho_struct_ao)
170 NULLIFY (orbital_density_matrix, xc_section_tmp, xc_fun_section_tmp)
178 mos=molecular_orbitals)
179 compute_virial = virial%pv_calculate .AND. (.NOT. virial%pv_numer)
194 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
203 ALLOCATE (single_mo_coeff(nspins))
205 CALL qs_rho_get(rho_struct, rho_r=rho_struct_r, rho_ao=rho_struct_ao)
206 rho_r => rho_struct_r
208 ALLOCATE (orbital_density_matrix(ispin)%matrix)
209 CALL dbcsr_copy(orbital_density_matrix(ispin)%matrix, &
210 rho_struct_ao(ispin)%matrix,
"orbital density")
212 bo = rho_r(1)%pw_grid%bounds_local
224 needs%norm_drho = .true.
229 i_val=xc_deriv_method_id)
231 i_val=xc_rho_smooth_id)
233 xc_deriv_method_id, &
250 cpassert(.NOT. compute_virial)
255 xc_section_tmp, auxbas_pw_pool, &
256 compute_virial=.false., virial_xc=virial_xc_tmp)
263 cpassert(.NOT. compute_virial)
268 xc_section_tmp, auxbas_pw_pool, &
269 compute_virial=.false., virial_xc=virial_xc_tmp)
272 CALL pw_axpy(vxc_tmp(ispin), vxc_lb(ispin), alpha)
276 CALL add_lb_pot(vxc_tmp(ispin)%array, rho_set, lsd, ispin)
277 CALL pw_axpy(vxc_tmp(ispin), vxc_lb(ispin), -1.0_dp)
287 deriv_set=deriv_set, &
293 ALLOCATE (vxc_gllb(nspins))
295 CALL auxbas_pw_pool%create_pw(vxc_gllb(ispin))
299 CALL calc_2excpbe(vxc_gllb(ispin)%array, rho_set, e_uniform, lsd)
304 CALL auxbas_pw_pool%create_pw(
orbital)
305 CALL auxbas_pw_pool%create_pw(orbital_g)
311 eigenvalues=mo_eigenvalues, &
314 mo_coeff%matrix_struct, &
315 "orbital density matrix")
318 nrow_global=nrow(ispin), ncol_global=ncol(ispin))
319 ALLOCATE (coeff_col(nrow(ispin), 1))
325 efac = k_rho*sqrt(mo_eigenvalues(homo) - mo_eigenvalues(orb))
326 IF (.NOT. lsd) efac = 2.0_dp*efac
330 1, orb, nrow(ispin), 1)
333 CALL dbcsr_set(orbital_density_matrix(ispin)%matrix, 0.0_dp)
335 matrix_v=single_mo_coeff(ispin), &
341 rho=
orbital, rho_gspace=orbital_g, &
347 DEALLOCATE (coeff_col)
349 DO k = bo(1, 3), bo(2, 3)
350 DO j = bo(1, 2), bo(2, 2)
351 DO i = bo(1, 1), bo(2, 1)
352 IF (rho_r(ispin)%array(i, j, k) > density_cut)
THEN
353 vxc_tmp(ispin)%array(i, j, k) = vxc_tmp(ispin)%array(i, j, k)/ &
354 rho_r(ispin)%array(i, j, k)
356 vxc_tmp(ispin)%array(i, j, k) = 0.0_dp
362 CALL pw_axpy(vxc_tmp(ispin), vxc_gllb(ispin), 1.0_dp)
369 ALLOCATE (vxc_saop(nspins))
375 eigenvalues=mo_eigenvalues, &
377 CALL auxbas_pw_pool%create_pw(vxc_saop(ispin))
380 ALLOCATE (coeff_col(nrow(ispin), 1))
384 we_lb = exp(-2.0_dp*(mo_eigenvalues(homo) - mo_eigenvalues(orb))**2)
385 we_gllb = 1.0_dp - we_lb
388 we_gllb = 2.0_dp*we_gllb
391 vxc_tmp(ispin)%array = we_lb*vxc_lb(ispin)%array + &
392 we_gllb*vxc_gllb(ispin)%array
396 1, orb, nrow(ispin), 1)
399 CALL dbcsr_set(orbital_density_matrix(ispin)%matrix, 0.0_dp)
401 matrix_v=single_mo_coeff(ispin), &
407 rho=
orbital, rho_gspace=orbital_g, &
410 vxc_saop(ispin)%array = vxc_saop(ispin)%array + &
411 orbital%array*vxc_tmp(ispin)%array
417 DEALLOCATE (coeff_col)
419 DO k = bo(1, 3), bo(2, 3)
420 DO j = bo(1, 2), bo(2, 2)
421 DO i = bo(1, 1), bo(2, 1)
422 IF (rho_r(ispin)%array(i, j, k) > density_cut)
THEN
423 vxc_saop(ispin)%array(i, j, k) = vxc_saop(ispin)%array(i, j, k)/ &
424 rho_r(ispin)%array(i, j, k)
426 vxc_saop(ispin)%array(i, j, k) = 0.0_dp
437 CALL auxbas_pw_pool%give_back_pw(
orbital)
438 CALL auxbas_pw_pool%give_back_pw(orbital_g)
445 IF (oe_corr ==
oe_lb)
THEN
446 CALL pw_copy(vxc_lb(ispin), vxc_saop(ispin))
447 ELSE IF (oe_corr ==
oe_gllb)
THEN
448 CALL pw_copy(vxc_gllb(ispin), vxc_saop(ispin))
450 CALL pw_scale(vxc_saop(ispin), vxc_saop(ispin)%pw_grid%dvol)
452 CALL integrate_v_rspace(v_rspace=vxc_saop(ispin), pmat=rho_struct_ao(ispin), &
453 hmat=ks_matrix(ispin), qs_env=qs_env, &
454 calculate_forces=.false., &
460 CALL auxbas_pw_pool%give_back_pw(vxc_saop(ispin))
461 CALL auxbas_pw_pool%give_back_pw(vxc_gllb(ispin))
462 CALL vxc_lb(ispin)%release()
463 CALL vxc_tmp(ispin)%release()
465 DEALLOCATE (vxc_gllb, vxc_lb, vxc_tmp, orbital_density_matrix)
467 DEALLOCATE (vxc_saop)
477 CALL gapw_add_atomic_saop_pot(qs_env, oe_corr)
487 SUBROUTINE gapw_add_atomic_saop_pot(qs_env, oe_corr)
490 INTEGER,
INTENT(IN) :: oe_corr
492 INTEGER :: ia, iat, iatom, ikind, ir, ispin, na, &
493 natom, nr, ns, nspins, orb
494 INTEGER,
DIMENSION(2) :: bo, homo, ncol, nrow
495 INTEGER,
DIMENSION(2, 3) :: bounds
496 INTEGER,
DIMENSION(:),
POINTER :: atom_list
497 LOGICAL :: lsd, paw_atom
498 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: tau
499 REAL(kind=
dp) :: density_cut, efac, exc, gradient_cut, &
500 tau_cut, we_gllb, we_lb
501 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: coeff_col
502 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: weight
503 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: dummy, e_uniform, rho_h, rho_s, vtau, &
504 vxc_gllb_h, vxc_gllb_s, vxc_lb_h, vxc_lb_s, vxc_saop_h, vxc_saop_s, vxc_tmp_h, vxc_tmp_s
505 REAL(kind=
dp),
DIMENSION(:, :, :, :),
POINTER :: drho_h, drho_s, vxg
508 TYPE(
cp_fm_p_type),
ALLOCATABLE,
DIMENSION(:) :: mo_coeff
509 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: single_mo_coeff
510 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, orbital_density_matrix, &
512 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ksmat, psmat
518 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: molecular_orbitals
523 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
525 TYPE(
rho_atom_coeff),
DIMENSION(:),
POINTER :: dr_h, dr_s, int_hh, int_ss, r_h, r_s
530 xc_fun_section_tmp, xc_section_orig, &
538 NULLIFY (weight, rho_h, rho_s, vxc_lb_h, vxc_lb_s, vxc_gllb_h, vxc_gllb_s, &
539 vxc_tmp_h, vxc_tmp_s, vtau, dummy, e_uniform, drho_h, drho_s, vxg, atom_list, &
540 atomic_kind_set, qs_kind_set, deriv, atomic_grid, rho_struct_ao, &
541 harmonics, molecular_orbitals, rho_structure, r_h, r_s, dr_h, dr_s, &
542 r_h_d, r_s_d, rho_atom_set, rho_atom, para_env, &
543 mo_eigenvalues, local_rho_set, matrix_ks, &
544 orbital_density_matrix, vxc_saop_h, vxc_saop_s)
548 NULLIFY (dft_control, oce, sab)
552 mos=molecular_orbitals, &
553 atomic_kind_set=atomic_kind_set, &
554 qs_kind_set=qs_kind_set, &
555 rho_atom_set=rho_atom_set, &
556 matrix_ks=matrix_ks, &
557 dft_control=dft_control, &
559 oce=oce, sab_orb=sab)
561 CALL qs_rho_get(rho_structure, rho_ao=rho_struct_ao)
587 ns =
SIZE(rho_struct_ao)
588 psmat(1:ns, 1:1) => rho_struct_ao(1:ns)
592 ALLOCATE (mo_coeff(nspins), single_mo_coeff(nspins), mo_eigenvalues(nspins))
598 mo_coeff=mo_coeff(ispin)%matrix, &
599 eigenvalues=mo_eigenvalues(ispin)%array, &
602 mo_coeff(ispin)%matrix%matrix_struct, &
603 "orbital density matrix")
605 nrow_global=nrow(ispin), ncol_global=ncol(ispin))
606 ALLOCATE (orbital_density_matrix(ispin)%matrix)
607 CALL dbcsr_copy(orbital_density_matrix(ispin)%matrix, &
608 rho_struct_ao(ispin)%matrix, &
613 qs_kind_set, dft_control, para_env)
615 DO ikind = 1,
SIZE(atomic_kind_set)
616 CALL get_atomic_kind(atomic_kind_set(ikind), atom_list=atom_list, natom=natom)
618 CALL get_qs_kind(qs_kind_set(ikind), paw_atom=paw_atom, &
619 harmonics=harmonics, grid_atom=atomic_grid)
620 IF (.NOT. paw_atom) cycle
623 na = atomic_grid%ng_sphere
631 gradient_cut, tau_cut)
633 gradient_cut, tau_cut)
635 gradient_cut, tau_cut)
637 gradient_cut, tau_cut)
642 needs%norm_drho = .true.
649 needs_orbs%rho = .true.
650 IF (lsd) needs_orbs%rho_spin = .true.
654 ALLOCATE (rho_h(1:na, 1:nr, 1:nspins), rho_s(1:na, 1:nr, 1:nspins))
655 ALLOCATE (weight(1:na, 1:nr))
656 ALLOCATE (vxc_lb_h(1:na, 1:nr, 1:nspins), vxc_lb_s(1:na, 1:nr, 1:nspins))
657 ALLOCATE (vxc_gllb_h(1:na, 1:nr, 1:nspins), vxc_gllb_s(1:na, 1:nr, 1:nspins))
658 ALLOCATE (vxc_tmp_h(1:na, 1:nr, 1:nspins), vxc_tmp_s(1:na, 1:nr, 1:nspins))
659 ALLOCATE (vxc_saop_h(1:na, 1:nr, 1:nspins), vxc_saop_s(1:na, 1:nr, 1:nspins))
660 ALLOCATE (drho_h(1:4, 1:na, 1:nr, 1:nspins), drho_s(1:4, 1:na, 1:nr, 1:nspins))
663 bo =
get_limit(natom, para_env%num_pe, para_env%mepos)
666 iatom = atom_list(iat)
668 rho_atom => rho_atom_set(iatom)
669 NULLIFY (r_h, r_s, dr_h, dr_s, r_h_d, r_s_d)
671 rho_rad_s=r_s, drho_rad_h=dr_h, &
672 drho_rad_s=dr_s, rho_rad_h_d=r_h_d, &
680 ir, r_h, r_s, rho_h, rho_s, &
681 dr_h, dr_s, r_h_d, r_s_d, drho_h, drho_s)
684 CALL fill_rho_set(rho_set_h, lsd, nspins, needs, rho_h, drho_h, tau, na, ir)
685 CALL fill_rho_set(rho_set_s, lsd, nspins, needs, rho_s, drho_s, tau, na, ir)
689 weight(ia, ir) = atomic_grid%wr(ir)*atomic_grid%wa(ia)
710 CALL vxc_of_r_new(xc_fun_section_tmp, rho_set_h, deriv_set, 1, needs, &
711 weight, lsd, na, nr, exc, vxc_tmp_h, vxg, vtau)
713 CALL vxc_of_r_new(xc_fun_section_tmp, rho_set_s, deriv_set, 1, needs, &
714 weight, lsd, na, nr, exc, vxc_tmp_s, vxg, vtau)
728 CALL vxc_of_r_new(xc_fun_section_tmp, rho_set_h, deriv_set, 1, needs, &
729 weight, lsd, na, nr, exc, vxc_lb_h, vxg, vtau)
730 vxc_lb_h = vxc_lb_h + alpha*vxc_tmp_h
732 dummy => vxc_tmp_h(:, :, ispin:ispin)
733 CALL add_lb_pot(dummy, rho_set_h, lsd, ispin)
734 vxc_lb_h(:, :, ispin) = vxc_lb_h(:, :, ispin) - weight(:, :)*vxc_tmp_h(:, :, ispin)
740 cpassert(
ASSOCIATED(deriv))
743 dummy => vxc_gllb_h(:, :, ispin:ispin)
744 CALL calc_2excpbe(dummy, rho_set_h, e_uniform, lsd)
745 vxc_gllb_h(:, :, ispin) = vxc_gllb_h(:, :, ispin)*weight(:, :)
747 NULLIFY (deriv, dummy, e_uniform)
753 CALL vxc_of_r_new(xc_fun_section_tmp, rho_set_s, deriv_set, 1, needs, &
754 weight, lsd, na, nr, exc, vxc_lb_s, vxg, vtau)
756 vxc_lb_s = vxc_lb_s + alpha*vxc_tmp_s
758 dummy => vxc_tmp_s(:, :, ispin:ispin)
759 CALL add_lb_pot(dummy, rho_set_s, lsd, ispin)
760 vxc_lb_s(:, :, ispin) = vxc_lb_s(:, :, ispin) - weight(:, :)*vxc_tmp_s(:, :, ispin)
766 cpassert(
ASSOCIATED(deriv))
769 dummy => vxc_gllb_s(:, :, ispin:ispin)
770 CALL calc_2excpbe(dummy, rho_set_s, e_uniform, lsd)
771 vxc_gllb_s(:, :, ispin) = vxc_gllb_s(:, :, ispin)*weight(:, :)
773 NULLIFY (deriv, dummy, e_uniform)
778 vxc_tmp_h = 0.0_dp; vxc_tmp_s = 0.0_dp
782 DO orb = 1, homo(ispin) - 1
784 ALLOCATE (coeff_col(nrow(ispin), 1))
786 efac = k_rho*sqrt(mo_eigenvalues(ispin)%array(homo(ispin)) - &
787 mo_eigenvalues(ispin)%array(orb))
788 IF (.NOT. lsd) efac = 2.0_dp*efac
792 1, orb, nrow(ispin), 1)
795 CALL dbcsr_set(orbital_density_matrix(ispin)%matrix, 0.0_dp)
797 matrix_v=single_mo_coeff(ispin), &
801 DEALLOCATE (coeff_col)
807 ns =
SIZE(orbital_density_matrix)
808 psmat(1:ns, 1:1) => orbital_density_matrix(1:ns)
812 rho_atom => local_rho_set%rho_atom_set(iatom)
813 NULLIFY (r_h, r_s, dr_h, dr_s, r_h_d, r_s_d)
814 CALL get_rho_atom(rho_atom=rho_atom, rho_rad_h=r_h, rho_rad_s=r_s)
821 ir, r_h, r_s, rho_h, rho_s, &
822 dr_h, dr_s, r_h_d, r_s_d, drho_h, drho_s)
825 CALL fill_rho_set(orb_rho_set_h, lsd, nspins, needs_orbs, rho_h, drho_h, tau, na, ir)
826 CALL fill_rho_set(orb_rho_set_s, lsd, nspins, needs_orbs, rho_s, drho_s, tau, na, ir)
831 vxc_tmp_h(:, :, 1) = vxc_tmp_h(:, :, 1) + efac*orb_rho_set_h%rhoa(:, :, 1)
832 vxc_tmp_s(:, :, 1) = vxc_tmp_s(:, :, 1) + efac*orb_rho_set_s%rhoa(:, :, 1)
834 vxc_tmp_h(:, :, 2) = vxc_tmp_h(:, :, 2) + efac*orb_rho_set_h%rhob(:, :, 1)
835 vxc_tmp_s(:, :, 2) = vxc_tmp_s(:, :, 2) + efac*orb_rho_set_s%rhob(:, :, 1)
838 vxc_tmp_h(:, :, 1) = vxc_tmp_h(:, :, 1) + efac*orb_rho_set_h%rho(:, :, 1)
839 vxc_tmp_s(:, :, 1) = vxc_tmp_s(:, :, 1) + efac*orb_rho_set_s%rho(:, :, 1)
849 IF (rho_set_h%rhoa(ia, ir, 1) > rho_set_h%rho_cutoff) &
850 vxc_gllb_h(ia, ir, 1) = vxc_gllb_h(ia, ir, 1) + &
851 weight(ia, ir)*vxc_tmp_h(ia, ir, 1)/rho_set_h%rhoa(ia, ir, 1)
852 IF (rho_set_h%rhob(ia, ir, 1) > rho_set_h%rho_cutoff) &
853 vxc_gllb_h(ia, ir, 2) = vxc_gllb_h(ia, ir, 2) + &
854 weight(ia, ir)*vxc_tmp_h(ia, ir, 2)/rho_set_h%rhob(ia, ir, 1)
855 IF (rho_set_s%rhoa(ia, ir, 1) > rho_set_s%rho_cutoff) &
856 vxc_gllb_s(ia, ir, 1) = vxc_gllb_s(ia, ir, 1) + &
857 weight(ia, ir)*vxc_tmp_s(ia, ir, 1)/rho_set_s%rhoa(ia, ir, 1)
858 IF (rho_set_s%rhob(ia, ir, 1) > rho_set_s%rho_cutoff) &
859 vxc_gllb_s(ia, ir, 2) = vxc_gllb_s(ia, ir, 2) + &
860 weight(ia, ir)*vxc_tmp_s(ia, ir, 2)/rho_set_s%rhob(ia, ir, 1)
866 IF (rho_set_h%rho(ia, ir, 1) > rho_set_h%rho_cutoff) &
867 vxc_gllb_h(ia, ir, 1) = vxc_gllb_h(ia, ir, 1) + &
868 weight(ia, ir)*vxc_tmp_h(ia, ir, 1)/rho_set_h%rho(ia, ir, 1)
869 IF (rho_set_s%rho(ia, ir, 1) > rho_set_s%rho_cutoff) &
870 vxc_gllb_s(ia, ir, 1) = vxc_gllb_s(ia, ir, 1) + &
871 weight(ia, ir)*vxc_tmp_s(ia, ir, 1)/rho_set_s%rho(ia, ir, 1)
876 vxc_saop_h = 0.0_dp; vxc_saop_s = 0.0_dp
880 DO orb = 1, homo(ispin)
882 ALLOCATE (coeff_col(nrow(ispin), 1))
884 we_lb = exp(-2.0_dp*(mo_eigenvalues(ispin)%array(homo(ispin)) - &
885 mo_eigenvalues(ispin)%array(orb))**2)
886 we_gllb = 1.0_dp - we_lb
889 we_gllb = 2.0_dp*we_gllb
892 vxc_tmp_h(:, :, ispin) = we_lb*vxc_lb_h(:, :, ispin) + &
893 we_gllb*vxc_gllb_h(:, :, ispin)
894 vxc_tmp_s(:, :, ispin) = we_lb*vxc_lb_s(:, :, ispin) + &
895 we_gllb*vxc_gllb_s(:, :, ispin)
899 1, orb, nrow(ispin), 1)
902 CALL dbcsr_set(orbital_density_matrix(ispin)%matrix, 0.0_dp)
904 matrix_v=single_mo_coeff(ispin), &
908 DEALLOCATE (coeff_col)
914 ns =
SIZE(orbital_density_matrix)
915 psmat(1:ns, 1:1) => orbital_density_matrix(1:ns)
919 rho_atom => local_rho_set%rho_atom_set(iatom)
920 NULLIFY (r_h, r_s, dr_h, dr_s, r_h_d, r_s_d)
921 CALL get_rho_atom(rho_atom=rho_atom, rho_rad_h=r_h, rho_rad_s=r_s)
928 ir, r_h, r_s, rho_h, rho_s, &
929 dr_h, dr_s, r_h_d, r_s_d, drho_h, drho_s)
932 CALL fill_rho_set(orb_rho_set_h, lsd, nspins, needs_orbs, rho_h, drho_h, tau, na, ir)
933 CALL fill_rho_set(orb_rho_set_s, lsd, nspins, needs_orbs, rho_s, drho_s, tau, na, ir)
938 vxc_saop_h(:, :, 1) = vxc_saop_h(:, :, 1) + vxc_tmp_h(:, :, 1)*orb_rho_set_h%rhoa(:, :, 1)
939 vxc_saop_s(:, :, 1) = vxc_saop_s(:, :, 1) + vxc_tmp_s(:, :, 1)*orb_rho_set_s%rhoa(:, :, 1)
941 vxc_saop_h(:, :, 2) = vxc_saop_h(:, :, 2) + vxc_tmp_h(:, :, 2)*orb_rho_set_h%rhob(:, :, 1)
942 vxc_saop_s(:, :, 2) = vxc_saop_s(:, :, 2) + vxc_tmp_s(:, :, 2)*orb_rho_set_s%rhob(:, :, 1)
945 vxc_saop_h(:, :, 1) = vxc_saop_h(:, :, 1) + vxc_tmp_h(:, :, 1)*orb_rho_set_h%rho(:, :, 1)
946 vxc_saop_s(:, :, 1) = vxc_saop_s(:, :, 1) + vxc_tmp_s(:, :, 1)*orb_rho_set_s%rho(:, :, 1)
956 IF (rho_set_h%rhoa(ia, ir, 1) > rho_set_h%rho_cutoff)
THEN
957 vxc_saop_h(ia, ir, 1) = vxc_saop_h(ia, ir, 1)/rho_set_h%rhoa(ia, ir, 1)
959 vxc_saop_h(ia, ir, 1) = 0.0_dp
961 IF (rho_set_h%rhob(ia, ir, 1) > rho_set_h%rho_cutoff)
THEN
962 vxc_saop_h(ia, ir, 2) = vxc_saop_h(ia, ir, 2)/rho_set_h%rhob(ia, ir, 1)
964 vxc_saop_h(ia, ir, 2) = 0.0_dp
966 IF (rho_set_s%rhoa(ia, ir, 1) > rho_set_s%rho_cutoff)
THEN
967 vxc_saop_s(ia, ir, 1) = vxc_saop_s(ia, ir, 1)/rho_set_s%rhoa(ia, ir, 1)
969 vxc_saop_s(ia, ir, 1) = 0.0_dp
971 IF (rho_set_s%rhob(ia, ir, 1) > rho_set_s%rho_cutoff)
THEN
972 vxc_saop_s(ia, ir, 2) = vxc_saop_s(ia, ir, 2)/rho_set_s%rhob(ia, ir, 1)
974 vxc_saop_s(ia, ir, 2) = 0.0_dp
981 IF (rho_set_h%rho(ia, ir, 1) > rho_set_h%rho_cutoff)
THEN
982 vxc_saop_h(ia, ir, 1) = vxc_saop_h(ia, ir, 1)/rho_set_h%rho(ia, ir, 1)
984 vxc_saop_h(ia, ir, 1) = 0.0_dp
986 IF (rho_set_s%rho(ia, ir, 1) > rho_set_s%rho_cutoff)
THEN
987 vxc_saop_s(ia, ir, 1) = vxc_saop_s(ia, ir, 1)/rho_set_s%rho(ia, ir, 1)
989 vxc_saop_s(ia, ir, 1) = 0.0_dp
995 rho_atom => rho_atom_set(iatom)
996 CALL get_rho_atom(rho_atom=rho_atom, ga_vlocal_gb_h=int_hh, ga_vlocal_gb_s=int_ss)
997 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis, &
998 harmonics=harmonics, grid_atom=grid_atom)
999 SELECT CASE (oe_corr)
1001 CALL gavxcgb_nogc(vxc_lb_h, vxc_lb_s, int_hh, int_ss, grid_atom, orb_basis, harmonics, nspins)
1003 CALL gavxcgb_nogc(vxc_gllb_h, vxc_gllb_s, int_hh, int_ss, grid_atom, orb_basis, harmonics, nspins)
1005 CALL gavxcgb_nogc(vxc_saop_h, vxc_saop_s, int_hh, int_ss, grid_atom, orb_basis, harmonics, nspins)
1007 cpabort(
"Unknown correction!")
1012 DEALLOCATE (rho_h, rho_s, weight)
1013 DEALLOCATE (vxc_lb_h, vxc_lb_s)
1014 DEALLOCATE (vxc_gllb_h, vxc_gllb_s)
1015 DEALLOCATE (vxc_tmp_h, vxc_tmp_s)
1016 DEALLOCATE (vxc_saop_h, vxc_saop_s)
1017 DEALLOCATE (drho_h, drho_s)
1028 ns =
SIZE(matrix_ks)
1029 ksmat(1:ns, 1:1) => matrix_ks(1:ns)
1030 ns =
SIZE(rho_struct_ao)
1031 psmat(1:ns, 1:1) => rho_struct_ao(1:ns)
1044 DEALLOCATE (mo_coeff, mo_eigenvalues)
1047 END SUBROUTINE gapw_add_atomic_saop_pot
1056 SUBROUTINE add_lb_pot(pot, rho_set, lsd, spin)
1058 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: pot
1060 LOGICAL,
INTENT(IN) :: lsd
1061 INTEGER,
INTENT(IN) :: spin
1063 REAL(kind=
dp),
PARAMETER :: ob3 = 1.0_dp/3.0_dp
1066 INTEGER,
DIMENSION(2, 3) :: bo
1067 REAL(kind=
dp) :: n, n_13, x, x2
1069 bo = rho_set%local_bounds
1071 DO k = bo(1, 3), bo(2, 3)
1072 DO j = bo(1, 2), bo(2, 2)
1073 DO i = bo(1, 1), bo(2, 1)
1075 IF (rho_set%rho(i, j, k) > rho_set%rho_cutoff)
THEN
1076 n = rho_set%rho(i, j, k)/2.0_dp
1078 x = (rho_set%norm_drho(i, j, k)/2.0_dp)/(n*n_13)
1080 pot(i, j, k) = beta*x2*n_13/(1.0_dp + 3.0_dp*beta*x*log(x + sqrt(x2 + 1.0_dp)))
1084 IF (rho_set%rhoa(i, j, k) > rho_set%rho_cutoff)
THEN
1085 n_13 = rho_set%rhoa_1_3(i, j, k)
1086 x = rho_set%norm_drhoa(i, j, k)/(rho_set%rhoa(i, j, k)*n_13)
1088 pot(i, j, k) = beta*x2*n_13/(1.0_dp + 3.0_dp*beta*x*log(sqrt(x2 + 1.0_dp) + x))
1090 ELSE IF (spin == 2)
THEN
1091 IF (rho_set%rhob(i, j, k) > rho_set%rho_cutoff)
THEN
1092 n_13 = rho_set%rhob_1_3(i, j, k)
1093 x = rho_set%norm_drhob(i, j, k)/(rho_set%rhob(i, j, k)*n_13)
1095 pot(i, j, k) = beta*x2*n_13/(1.0_dp + 3.0_dp*beta*x*log(sqrt(x2 + 1.0_dp) + x))
1103 END SUBROUTINE add_lb_pot
1112 SUBROUTINE calc_2excpbe(pot, rho_set, e_uniform, lsd)
1114 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: pot
1116 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: e_uniform
1117 LOGICAL,
INTENT(IN) :: lsd
1120 INTEGER,
DIMENSION(2, 3) :: bo
1121 REAL(kind=
dp) :: e_unif, rho
1123 bo = rho_set%local_bounds
1125 DO k = bo(1, 3), bo(2, 3)
1126 DO j = bo(1, 2), bo(2, 2)
1127 DO i = bo(1, 1), bo(2, 1)
1129 IF (rho_set%rho(i, j, k) > rho_set%rho_cutoff)
THEN
1130 e_unif = e_uniform(i, j, k)/rho_set%rho(i, j, k)
1136 calc_ecpbe_r(rho_set%rho(i, j, k), rho_set%norm_drho(i, j, k), &
1137 e_unif, rho_set%rho_cutoff, rho_set%drho_cutoff) + &
1139 calc_expbe_r(rho_set%rho(i, j, k), rho_set%norm_drho(i, j, k), &
1140 rho_set%rho_cutoff, rho_set%drho_cutoff)
1142 rho = rho_set%rhoa(i, j, k) + rho_set%rhob(i, j, k)
1143 IF (rho > rho_set%rho_cutoff)
THEN
1144 e_unif = e_uniform(i, j, k)/rho
1150 calc_ecpbe_u(rho_set%rhoa(i, j, k), rho_set%rhob(i, j, k), rho_set%norm_drho(i, j, k), &
1152 rho_set%rho_cutoff, rho_set%drho_cutoff) + &
1154 calc_expbe_u(rho_set%rhoa(i, j, k), rho_set%rhob(i, j, k), rho_set%norm_drho(i, j, k), &
1155 rho_set%rho_cutoff, rho_set%drho_cutoff)
1161 END SUBROUTINE calc_2excpbe
1173 FUNCTION calc_ecpbe_u(ra, rb, ngr, ec_unif, rc, ngrc)
RESULT(res)
1175 REAL(kind=
dp),
INTENT(in) :: ra, rb, ngr, ec_unif, rc, ngrc
1176 REAL(kind=
dp) :: res
1178 REAL(kind=
dp),
PARAMETER :: ob3 = 1.0_dp/3.0_dp, tb3 = 2.0_dp/3.0_dp
1180 REAL(kind=
dp) :: a, at2, h, kf, kl, ks, phi, phi3, r, t2, &
1185 IF (r > rc .AND. ngr > ngrc)
THEN
1187 IF (zeta > 1.0_dp) zeta = 1.0_dp
1188 IF (zeta < -1.0_dp) zeta = -1.0_dp
1189 phi = ((1.0_dp + zeta)**tb3 + (1.0_dp - zeta)**tb3)/2.0_dp
1191 kf = (3.0_dp*r*
pi*
pi)**ob3
1192 ks = sqrt(4.0_dp*kf/
pi)
1193 t2 = (ngr/(2.0_dp*phi*ks*r))**2
1194 a = beta_ec/gamma_saop/(exp(-ec_unif/(gamma_saop*phi3)) - 1.0_dp)
1196 kl = (1.0_dp + at2)/(1.0_dp + at2 + at2*at2)
1197 h = gamma_saop*log(1.0_dp + beta_ec/gamma_saop*t2*kl)
1201 END FUNCTION calc_ecpbe_u
1212 FUNCTION calc_ecpbe_r(r, ngr, ec_unif, rc, ngrc)
RESULT(res)
1214 REAL(kind=
dp),
INTENT(in) :: r, ngr, ec_unif, rc, ngrc
1215 REAL(kind=
dp) :: res
1217 REAL(kind=
dp) :: a, at2, h, kf, kl, ks, t2
1220 IF (r > rc .AND. ngr > ngrc)
THEN
1221 kf = (3.0_dp*r*
pi*
pi)**(1.0_dp/3.0_dp)
1222 ks = sqrt(4.0_dp*kf/
pi)
1223 t2 = (ngr/(2.0_dp*ks*r))**2
1224 a = beta_ec/gamma_saop/(exp(-ec_unif/gamma_saop) - 1.0_dp)
1226 kl = (1.0_dp + at2)/(1.0_dp + at2 + at2*at2)
1227 h = gamma_saop*log(1.0_dp + beta_ec/gamma_saop*t2*kl)
1231 END FUNCTION calc_ecpbe_r
1242 FUNCTION calc_expbe_u(ra, rb, ngr, rc, ngrc)
RESULT(res)
1244 REAL(kind=
dp),
INTENT(in) :: ra, rb, ngr, rc, ngrc
1245 REAL(kind=
dp) :: res
1250 res = calc_expbe_r(r, ngr, rc, ngrc)
1252 END FUNCTION calc_expbe_u
1262 FUNCTION calc_expbe_r(r, ngr, rc, ngrc)
RESULT(res)
1264 REAL(kind=
dp),
INTENT(in) :: r, ngr, rc, ngrc
1265 REAL(kind=
dp) :: res
1267 REAL(kind=
dp) :: ex_unif, fx, kf, s
1270 kf = (3.0_dp*r*
pi*
pi)**(1.0_dp/3.0_dp)
1271 ex_unif = -3.0_dp*kf/(4.0_dp*
pi)
1273 IF (ngr > ngrc)
THEN
1274 s = ngr/(2.0_dp*kf*r)
1275 fx = fx + kappa - kappa/(1.0_dp + mu*s*s/kappa)
1282 END FUNCTION calc_expbe_r
Define the atomic kind types and their sub types.
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.
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_set_submatrix(fm, new_values, start_row, start_col, n_rows, n_cols, alpha, beta, transpose)
sets a submatrix of a full matrix fm(start_row:start_row+n_rows,start_col:start_col+n_cols) = alpha*o...
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_get_submatrix(fm, target_m, start_row, start_col, n_rows, n_cols, transpose)
gets a submatrix of a full matrix op(target_m)(1:n_rows,1:n_cols) =fm(start_row:start_row+n_rows,...
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
Interface to the message passing library MPI.
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
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 get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Get the QUICKSTEP environment.
subroutine, public prepare_gapw_den(qs_env, local_rho_set, do_rho0, kind_set_external, pw_env_sub)
...
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.
routines that build the Kohn-Sham matrix contributions coming from local atomic densities
subroutine, public update_ks_atom(qs_env, ksmat, pmat, forces, tddft, rho_atom_external, kind_set_external, oce_external, sab_external, kscale, kintegral, kforce, fscale)
The correction to the KS matrix due to the GAPW local terms to the hartree and XC contributions is he...
subroutine, public local_rho_set_create(local_rho_set)
...
subroutine, public local_rho_set_release(local_rho_set)
...
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
subroutine, public allocate_rho_atom_internals(rho_atom_set, atomic_kind_set, qs_kind_set, dft_control, para_env)
...
subroutine, public calculate_rho_atom_coeff(qs_env, rho_ao, rho_atom_set, qs_kind_set, oce, sab, para_env)
...
subroutine, public get_rho_atom(rho_atom, cpc_h, cpc_s, rho_rad_h, rho_rad_s, drho_rad_h, drho_rad_s, vrho_rad_h, vrho_rad_s, rho_rad_h_d, rho_rad_s_d, ga_vlocal_gb_h, ga_vlocal_gb_s, int_scr_h, int_scr_s)
...
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...
routines that build the integrals of the Vxc potential calculated for the atomic density in the basis...
subroutine, public calc_rho_angular(grid_atom, harmonics, nspins, grad_func, ir, r_h, r_s, rho_h, rho_s, dr_h, dr_s, r_h_d, r_s_d, drho_h, drho_s)
...
subroutine, public gavxcgb_nogc(vxc_h, vxc_s, int_hh, int_ss, grid_atom, basis_1c, harmonics, nspins)
...
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
subroutine, public xc_rho_set_atom_update(rho_set, needs, nspins, bo)
...
subroutine, public fill_rho_set(rho_set, lsd, nspins, needs, rho, drho, tau, na, ir)
...
subroutine, public vxc_of_r_new(xc_fun_section, rho_set, deriv_set, deriv_order, needs, w, lsd, na, nr, exc, vxc, vxg, vtau, energy_only, epr_xc, adiabatic_rescale_factor)
...
represent a group ofunctional derivatives
subroutine, public xc_dset_zero_all(deriv_set)
...
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
subroutine, public xc_functionals_eval(functionals, lsd, rho_set, deriv_set, deriv_order)
...
Calculate the saop potential.
subroutine, public add_saop_pot(ks_matrix, qs_env, oe_corr)
...
elemental subroutine, public xc_rho_cflags_setall(cflags, value)
sets all the flags to the given value
subroutine, public xc_rho_set_update(rho_set, rho_r, rho_g, tau, needs, xc_deriv_method_id, xc_rho_smooth_id, pw_pool)
updates the given rho set with the density given by rho_r (and rho_g). The rho set will contain the c...
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
calculates the Becke 88 exchange functional
subroutine, public xb88_lsd_info(reference, shortform, needs, max_deriv)
return various information on the functional
subroutine, public xb88_lda_info(reference, shortform, needs, max_deriv)
return various information on the functional
Exchange and Correlation functional calculations.
subroutine, public xc_vxc_pw_create1(vxc_rho, vxc_tau, rho_r, rho_g, tau, exc, xc_section, pw_pool, compute_virial, virial_xc, exc_r)
Exchange and Correlation functional calculations. depending on the selected functional_routine calls ...
Provides all information about an atomic kind.
represent a pointer to a 1d array
just to build arrays of pointers to matrices
stores all the informations relevant to an mpi environment
Orbital angular momentum.
contained for different pw related things
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 ...
keeps the density in various representations, keeping track of which ones are valid.
A derivative set contains the different derivatives of a xc-functional in form of a linked list.
represent a derivative of a functional
contains a flag for each component of xc_rho_set, so that you can use it to tell which components you...
represent a density, with all the representation and data needed to perform a functional evaluation