66#include "./base/base_uses.f90"
75 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_fxc'
94 SUBROUTINE qs_fxc_analytic(rho0, rho1_r, tau1_r, xc_section, weights, auxbas_pw_pool, &
95 is_triplet, v_xc, v_xc_tau, spinflip)
102 LOGICAL,
INTENT(IN) :: is_triplet
104 LOGICAL,
OPTIONAL :: spinflip
106 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_fxc_analytic'
108 INTEGER :: handle, nspins
109 INTEGER,
DIMENSION(2, 3) :: bo
110 LOGICAL :: do_sf, lsd
119 CALL timeset(routinen, handle)
121 cpassert(.NOT.
ASSOCIATED(v_xc))
122 cpassert(.NOT.
ASSOCIATED(v_xc_tau))
125 IF (
PRESENT(spinflip)) do_sf = spinflip
127 CALL qs_rho_get(rho0, rho_r=rho0_r, rho_g=rho0_g, tau_r=tau0_r)
128 nspins =
SIZE(rho0_r)
132 IF (is_triplet .AND. nspins == 1)
fac = -1.0_dp
135 bo = rho1_r(1)%pw_grid%bounds_local
140 xc_section=xc_section, tau_r=tau0_r)
142 CALL xc_calc_2nd_deriv(v_xc, v_xc_tau, deriv_set, rho0_set, rho1_r, rho1_g, tau1_r, &
143 auxbas_pw_pool, weights, xc_section=xc_section, &
144 gapw=.false., do_triplet=is_triplet, do_sf=do_sf)
148 CALL timestop(handle)
163 SUBROUTINE qs_fxc_fdiff(ks_env, rho0_struct, rho1_struct, xc_section, accuracy, &
164 is_triplet, fxc_rho, fxc_tau)
167 TYPE(
qs_rho_type),
POINTER :: rho0_struct, rho1_struct
169 INTEGER,
INTENT(IN) :: accuracy
170 LOGICAL,
INTENT(IN) :: is_triplet
173 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_fxc_fdiff'
174 REAL(kind=
dp),
PARAMETER :: epsrho = 5.e-4_dp
176 INTEGER :: handle, ispin, istep, nspins, nstep
177 REAL(kind=
dp) :: alpha, beta, exc, oeps1
178 REAL(kind=
dp),
DIMENSION(-4:4) :: ak
182 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: v_tau_rspace, vxc00
185 CALL timeset(routinen, handle)
187 cpassert(.NOT.
ASSOCIATED(fxc_rho))
188 cpassert(.NOT.
ASSOCIATED(fxc_tau))
189 cpassert(
ASSOCIATED(rho0_struct))
190 cpassert(
ASSOCIATED(rho1_struct))
193 SELECT CASE (accuracy)
196 ak(-2:2) = [1.0_dp, -8.0_dp, 0.0_dp, 8.0_dp, -1.0_dp]/12.0_dp
199 ak(-3:3) = [-1.0_dp, 9.0_dp, -45.0_dp, 0.0_dp, 45.0_dp, -9.0_dp, 1.0_dp]/60.0_dp
202 ak(-4:4) = [1.0_dp, -32.0_dp/3.0_dp, 56.0_dp, -224.0_dp, 0.0_dp, &
203 224.0_dp, -56.0_dp, 32.0_dp/3.0_dp, -1.0_dp]/280.0_dp
206 CALL get_ks_env(ks_env, dft_control=dft_control, pw_env=pw_env)
207 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
209 nspins = dft_control%nspins
212 DO istep = -nstep, nstep
214 IF (ak(istep) /= 0.0_dp)
THEN
216 beta = real(istep, kind=
dp)*epsrho
220 NULLIFY (vxc00, v_tau_rspace)
222 cpassert(nspins == 1)
224 CALL qs_rho_copy(rho0_struct, rhoin, auxbas_pw_pool, 2)
227 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rhoin, xc_section=xc_section, &
228 vxc_rho=vxc00, vxc_tau=v_tau_rspace, exc=exc, just_energy=.false.)
229 CALL pw_axpy(vxc00(2), vxc00(1), -1.0_dp)
230 IF (
ASSOCIATED(v_tau_rspace))
CALL pw_axpy(v_tau_rspace(2), v_tau_rspace(1), -1.0_dp)
232 CALL qs_rho_copy(rho0_struct, rhoin, auxbas_pw_pool, nspins)
234 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rhoin, xc_section=xc_section, &
235 vxc_rho=vxc00, vxc_tau=v_tau_rspace, exc=exc, just_energy=.false.)
239 IF (.NOT.
ASSOCIATED(fxc_rho))
THEN
240 ALLOCATE (fxc_rho(nspins))
242 CALL auxbas_pw_pool%create_pw(fxc_rho(ispin))
247 CALL pw_axpy(vxc00(ispin), fxc_rho(ispin), ak(istep))
249 DO ispin = 1,
SIZE(vxc00)
250 CALL auxbas_pw_pool%give_back_pw(vxc00(ispin))
253 IF (
ASSOCIATED(v_tau_rspace))
THEN
254 IF (.NOT.
ASSOCIATED(fxc_tau))
THEN
255 ALLOCATE (fxc_tau(nspins))
257 CALL auxbas_pw_pool%create_pw(fxc_tau(ispin))
262 CALL pw_axpy(v_tau_rspace(ispin), fxc_tau(ispin), ak(istep))
264 DO ispin = 1,
SIZE(v_tau_rspace)
265 CALL auxbas_pw_pool%give_back_pw(v_tau_rspace(ispin))
267 DEALLOCATE (v_tau_rspace)
273 oeps1 = 1.0_dp/epsrho
275 CALL pw_scale(fxc_rho(ispin), oeps1)
277 IF (
ASSOCIATED(fxc_tau))
THEN
279 CALL pw_scale(fxc_tau(ispin), oeps1)
283 CALL timestop(handle)
306 fxc_rho, fxc_tau, gxc_rho, gxc_tau, spinflip)
308 TYPE(
qs_rho_type),
POINTER :: rho0_struct, rho1_struct
312 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: fxc_rho, fxc_tau, gxc_rho, gxc_tau
313 LOGICAL,
INTENT(IN),
OPTIONAL :: spinflip
315 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_fgxc_analytic'
317 INTEGER :: handle, ispin, nspins, spindim
318 INTEGER,
DIMENSION(2, 3) :: bo
319 LOGICAL :: do_sf, lsd
322 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho0_r, rho1_r, tau0_r, tau1_r
328 CALL timeset(routinen, handle)
331 cpassert(.NOT.
ASSOCIATED(fxc_rho))
332 cpassert(.NOT.
ASSOCIATED(fxc_tau))
333 cpassert(.NOT.
ASSOCIATED(gxc_rho))
334 cpassert(.NOT.
ASSOCIATED(gxc_tau))
335 cpassert(
ASSOCIATED(rho0_struct))
336 cpassert(
ASSOCIATED(rho1_struct))
340 IF (
PRESENT(spinflip)) do_sf = spinflip
343 CALL qs_rho_get(rho0_struct, rho_r=rho0_r, rho_g=rho0_g, tau_r=tau0_r)
344 nspins =
SIZE(rho0_r)
354 IF (nspins == 1)
THEN
363 ALLOCATE (fxc_rho(spindim), gxc_rho(nspins))
364 DO ispin = 1, spindim
365 CALL pw_pool%create_pw(fxc_rho(ispin))
369 CALL pw_pool%create_pw(gxc_rho(ispin))
373 IF (needs%tau .OR. needs%tau_spin)
THEN
374 IF (.NOT.
ASSOCIATED(tau1_r)) &
375 cpabort(
"Tau-dependent functionals requires allocated kinetic energy density grid")
376 ALLOCATE (fxc_tau(spindim), gxc_tau(nspins))
377 DO ispin = 1, spindim
378 CALL pw_pool%create_pw(fxc_tau(ispin))
382 CALL pw_pool%create_pw(gxc_tau(ispin))
397 xc_section, tau_r=tau0_r, do_sf=do_sf)
401 CALL qs_rho_get(rho1_struct, rho_r=rho1_r, rho_g=rho1_g, tau_r=tau1_r)
402 bo = rho1_r(1)%pw_grid%bounds_local
420 pw_pool, spinflip=do_sf)
431 xc_section, .false., spinflip=do_sf, tddfpt_fac=
fac)
434 xc_section, spinflip=do_sf)
440 CALL timestop(handle)
460 SUBROUTINE qs_fgxc_gdiff(ks_env, rho0_struct, rho1_struct, xc_section, accuracy, epsrho, &
461 is_triplet, weights, fxc_rho, fxc_tau, gxc_rho, gxc_tau, spinflip)
464 TYPE(
qs_rho_type),
POINTER :: rho0_struct, rho1_struct
466 INTEGER,
INTENT(IN) :: accuracy
467 REAL(kind=
dp),
INTENT(IN) :: epsrho
468 LOGICAL,
INTENT(IN) :: is_triplet
470 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: fxc_rho, fxc_tau, gxc_rho, gxc_tau
471 LOGICAL,
OPTIONAL :: spinflip
473 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_fgxc_gdiff'
475 INTEGER :: handle, ispin, istep, nspins, nstep
477 REAL(kind=
dp) :: alpha, beta, exc, oeps1
478 REAL(kind=
dp),
DIMENSION(-4:4) :: ak
482 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho1_r, tau1_r, v_tau_rspace, vxc00, &
486 CALL timeset(routinen, handle)
488 cpassert(.NOT.
ASSOCIATED(fxc_rho))
489 cpassert(.NOT.
ASSOCIATED(fxc_tau))
490 cpassert(.NOT.
ASSOCIATED(gxc_rho))
491 cpassert(.NOT.
ASSOCIATED(gxc_tau))
492 cpassert(
ASSOCIATED(rho0_struct))
493 cpassert(
ASSOCIATED(rho1_struct))
496 IF (
PRESENT(spinflip)) do_sf = spinflip
499 SELECT CASE (accuracy)
502 ak(-2:2) = [1.0_dp, -8.0_dp, 0.0_dp, 8.0_dp, -1.0_dp]/12.0_dp
505 ak(-3:3) = [-1.0_dp, 9.0_dp, -45.0_dp, 0.0_dp, 45.0_dp, -9.0_dp, 1.0_dp]/60.0_dp
508 ak(-4:4) = [1.0_dp, -32.0_dp/3.0_dp, 56.0_dp, -224.0_dp, 0.0_dp, &
509 224.0_dp, -56.0_dp, 32.0_dp/3.0_dp, -1.0_dp]/280.0_dp
512 CALL get_ks_env(ks_env, dft_control=dft_control, pw_env=pw_env)
513 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
515 nspins = dft_control%nspins
519 CALL qs_rho_get(rho1_struct, rho_r=rho1_r, tau_r=tau1_r)
521 weights, auxbas_pw_pool, is_triplet, &
522 fxc_rho, fxc_tau, spinflip=do_sf)
524 CALL qs_fxc_fdiff(ks_env, rho0_struct, rho1_struct, xc_section, accuracy, is_triplet, &
528 DO istep = -nstep, nstep
530 IF (ak(istep) /= 0.0_dp)
THEN
532 beta = real(istep, kind=
dp)*epsrho
536 NULLIFY (vxc00, vxc00b, v_tau_rspace)
537 CALL qs_rho_copy(rho0_struct, rhoin, auxbas_pw_pool, nspins)
542 xc_section, weights, auxbas_pw_pool, is_triplet, &
543 vxc00, v_tau_rspace, spinflip=do_sf)
545 CALL qs_rho_copy(rho0_struct, rhoin, auxbas_pw_pool, nspins)
548 xc_section, weights, auxbas_pw_pool, is_triplet, &
549 vxc00b, v_tau_rspace, spinflip=do_sf)
551 CALL qs_fxc_fdiff(ks_env=ks_env, rho0_struct=rhoin, rho1_struct=rho1_struct, &
552 xc_section=xc_section, accuracy=accuracy, is_triplet=is_triplet, &
553 fxc_rho=vxc00, fxc_tau=v_tau_rspace)
557 IF (.NOT.
ASSOCIATED(gxc_rho))
THEN
558 ALLOCATE (gxc_rho(nspins))
560 CALL auxbas_pw_pool%create_pw(gxc_rho(ispin))
565 CALL pw_axpy(vxc00(1), gxc_rho(1), ak(istep))
566 CALL pw_axpy(vxc00b(1), gxc_rho(2), ak(istep))
569 CALL pw_axpy(vxc00(ispin), gxc_rho(ispin), ak(istep))
572 DO ispin = 1,
SIZE(vxc00)
573 CALL auxbas_pw_pool%give_back_pw(vxc00(ispin))
576 IF (
ASSOCIATED(vxc00b))
THEN
577 CALL auxbas_pw_pool%give_back_pw(vxc00b(1))
580 IF (
ASSOCIATED(v_tau_rspace))
THEN
581 IF (.NOT.
ASSOCIATED(gxc_tau))
THEN
582 ALLOCATE (gxc_tau(nspins))
584 CALL auxbas_pw_pool%create_pw(gxc_tau(ispin))
589 CALL pw_axpy(v_tau_rspace(ispin), gxc_tau(ispin), ak(istep))
591 DO ispin = 1,
SIZE(v_tau_rspace)
592 CALL auxbas_pw_pool%give_back_pw(v_tau_rspace(ispin))
594 DEALLOCATE (v_tau_rspace)
600 oeps1 = 1.0_dp/epsrho
602 CALL pw_scale(gxc_rho(ispin), oeps1)
604 IF (
ASSOCIATED(gxc_tau))
THEN
606 CALL pw_scale(gxc_tau(ispin), oeps1)
610 CALL timestop(handle)
627 SUBROUTINE qs_fgxc_create(ks_env, rho0_struct, rho1_struct, xc_section, accuracy, is_triplet, &
628 fxc_rho, fxc_tau, gxc_rho, gxc_tau)
631 TYPE(
qs_rho_type),
POINTER :: rho0_struct, rho1_struct
633 INTEGER,
INTENT(IN) :: accuracy
634 LOGICAL,
INTENT(IN) :: is_triplet
635 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: fxc_rho, fxc_tau, gxc_rho, gxc_tau
637 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_fgxc_create'
638 REAL(kind=
dp),
PARAMETER :: epsrho = 5.e-4_dp
640 INTEGER :: handle, ispin, istep, nspins, nstep
641 REAL(kind=
dp) :: alpha, beta, exc, oeps1, oeps2
642 REAL(kind=
dp),
DIMENSION(-4:4) :: ak, bl
646 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: v_tau_rspace, vxc00
649 CALL timeset(routinen, handle)
651 cpassert(.NOT.
ASSOCIATED(fxc_rho))
652 cpassert(.NOT.
ASSOCIATED(fxc_tau))
653 cpassert(.NOT.
ASSOCIATED(gxc_rho))
654 cpassert(.NOT.
ASSOCIATED(gxc_tau))
655 cpassert(
ASSOCIATED(rho0_struct))
656 cpassert(
ASSOCIATED(rho1_struct))
660 SELECT CASE (accuracy)
663 ak(-2:2) = [1.0_dp, -8.0_dp, 0.0_dp, 8.0_dp, -1.0_dp]/12.0_dp
664 bl(-2:2) = [-1.0_dp, 16.0_dp, -30.0_dp, 16.0_dp, -1.0_dp]/12.0_dp
667 ak(-3:3) = [-1.0_dp, 9.0_dp, -45.0_dp, 0.0_dp, 45.0_dp, -9.0_dp, 1.0_dp]/60.0_dp
668 bl(-3:3) = [2.0_dp, -27.0_dp, 270.0_dp, -490.0_dp, 270.0_dp, -27.0_dp, 2.0_dp]/180.0_dp
671 ak(-4:4) = [1.0_dp, -32.0_dp/3.0_dp, 56.0_dp, -224.0_dp, 0.0_dp, &
672 224.0_dp, -56.0_dp, 32.0_dp/3.0_dp, -1.0_dp]/280.0_dp
673 bl(-4:4) = [-1.0_dp, 128.0_dp/9.0_dp, -112.0_dp, 896.0_dp, -14350.0_dp/9.0_dp, &
674 896.0_dp, -112.0_dp, 128.0_dp/9.0_dp, -1.0_dp]/560.0_dp
677 CALL get_ks_env(ks_env, dft_control=dft_control, pw_env=pw_env)
678 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
680 nspins = dft_control%nspins
683 DO istep = -nstep, nstep
686 beta = real(istep, kind=
dp)*epsrho
690 NULLIFY (vxc00, v_tau_rspace)
692 cpassert(nspins == 1)
694 CALL qs_rho_copy(rho0_struct, rhoin, auxbas_pw_pool, 2)
697 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rhoin, xc_section=xc_section, &
698 vxc_rho=vxc00, vxc_tau=v_tau_rspace, exc=exc, just_energy=.false.)
699 CALL pw_axpy(vxc00(2), vxc00(1), -1.0_dp)
701 CALL qs_rho_copy(rho0_struct, rhoin, auxbas_pw_pool, nspins)
703 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rhoin, xc_section=xc_section, &
704 vxc_rho=vxc00, vxc_tau=v_tau_rspace, exc=exc, just_energy=.false.)
708 IF (.NOT.
ASSOCIATED(fxc_rho))
THEN
709 ALLOCATE (fxc_rho(nspins))
711 CALL auxbas_pw_pool%create_pw(fxc_rho(ispin))
715 IF (.NOT.
ASSOCIATED(gxc_rho))
THEN
716 ALLOCATE (gxc_rho(nspins))
718 CALL auxbas_pw_pool%create_pw(gxc_rho(ispin))
722 cpassert(.NOT.
ASSOCIATED(v_tau_rspace))
724 IF (ak(istep) /= 0.0_dp)
THEN
725 CALL pw_axpy(vxc00(ispin), fxc_rho(ispin), ak(istep))
727 IF (bl(istep) /= 0.0_dp)
THEN
728 CALL pw_axpy(vxc00(ispin), gxc_rho(ispin), bl(istep))
731 DO ispin = 1,
SIZE(vxc00)
732 CALL auxbas_pw_pool%give_back_pw(vxc00(ispin))
738 oeps1 = 1.0_dp/epsrho
739 oeps2 = 1.0_dp/(epsrho**2)
741 CALL pw_scale(fxc_rho(ispin), oeps1)
742 CALL pw_scale(gxc_rho(ispin), oeps2)
745 CALL timestop(handle)
760 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: fxc_rho, fxc_tau, gxc_rho, gxc_tau
767 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
769 IF (
ASSOCIATED(fxc_rho))
THEN
770 DO ispin = 1,
SIZE(fxc_rho)
771 CALL auxbas_pw_pool%give_back_pw(fxc_rho(ispin))
775 IF (
ASSOCIATED(fxc_tau))
THEN
776 DO ispin = 1,
SIZE(fxc_tau)
777 CALL auxbas_pw_pool%give_back_pw(fxc_tau(ispin))
781 IF (
ASSOCIATED(gxc_rho))
THEN
782 DO ispin = 1,
SIZE(gxc_rho)
783 CALL auxbas_pw_pool%give_back_pw(gxc_rho(ispin))
787 IF (
ASSOCIATED(gxc_tau))
THEN
788 DO ispin = 1,
SIZE(gxc_tau)
789 CALL auxbas_pw_pool%give_back_pw(gxc_tau(ispin))
static GRID_HOST_DEVICE double fac(const int i)
Factorial function, e.g. fac(5) = 5! = 120.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
Defines the basic variable types.
integer, parameter, public dp
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 ...
https://en.wikipedia.org/wiki/Finite_difference_coefficient
subroutine, public qs_fgxc_create(ks_env, rho0_struct, rho1_struct, xc_section, accuracy, is_triplet, fxc_rho, fxc_tau, gxc_rho, gxc_tau)
...
subroutine, public qs_fgxc_gdiff(ks_env, rho0_struct, rho1_struct, xc_section, accuracy, epsrho, is_triplet, weights, fxc_rho, fxc_tau, gxc_rho, gxc_tau, spinflip)
...
subroutine, public qs_fxc_analytic(rho0, rho1_r, tau1_r, xc_section, weights, auxbas_pw_pool, is_triplet, v_xc, v_xc_tau, spinflip)
...
subroutine, public qs_fgxc_release(ks_env, fxc_rho, fxc_tau, gxc_rho, gxc_tau)
...
subroutine, public qs_fxc_fdiff(ks_env, rho0_struct, rho1_struct, xc_section, accuracy, is_triplet, fxc_rho, fxc_tau)
...
subroutine, public qs_fgxc_analytic(rho0_struct, rho1_struct, xc_section, weights, pw_pool, fxc_rho, fxc_tau, gxc_rho, gxc_tau, spinflip)
Calculates the values at the grid points in real space (r_i), of the second and third functional deri...
subroutine, public get_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, rho, rho_xc, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, kpoints, do_kpoints, atomic_kind_set, qs_kind_set, cell, cell_ref, use_ref_cell, particle_set, energy, force, local_particles, local_molecules, molecule_kind_set, molecule_set, subsys, cp_subsys, virial, results, atprop, nkind, natom, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env, nelectron_total, nelectron_spin)
...
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_scale_and_add_b(rhoa, rhob, alpha, beta)
rhoa(2) = alpha*rhoa(2)+beta*rhob(1)
subroutine, public qs_rho_copy(rho_input, rho_output, auxbas_pw_pool, mspin)
Allocate a density structure and fill it with data from an input structure SIZE(rho_input) == mspin =...
subroutine, public qs_rho_scale_and_add(rhoa, rhob, alpha, beta)
rhoa = alpha*rhoa+beta*rhob
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...
subroutine, public qs_rho_create(rho)
Allocates a new instance of rho.
subroutine, public qs_rho_release(rho_struct)
releases a rho_struct by decreasing the reference count by one and deallocating if it reaches 0 (to b...
subroutine, public qs_vxc_create(ks_env, rho_struct, xc_section, vxc_rho, vxc_tau, exc, just_energy, edisp, dispersion_env, adiabatic_rescale_factor, pw_env_external)
calculates and allocates the xc potential, already reducing it to the dependence on rho and the one o...
represent a group ofunctional derivatives
subroutine, public xc_dset_release(derivative_set)
releases a derivative set
type(xc_rho_cflags_type) function, public xc_functionals_get_needs(functionals, lsd, calc_potential)
...
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
subroutine, public xc_rho_set_update(rho_set, rho_r, rho_g, tau, needs, xc_deriv_method_id, xc_rho_smooth_id, pw_pool, spinflip)
updates the given rho set with the density given by rho_r (and rho_g). The rho set will contain the c...
Exchange and Correlation functional calculations.
subroutine, public xc_prep_2nd_deriv(deriv_set, rho_set, rho_r, pw_pool, weights, xc_section, tau_r)
Prepare objects for the calculation of the 2nd derivatives of the density functional....
subroutine, public xc_calc_2nd_deriv_analytical(v_xc, v_xc_tau, deriv_set, rho_set, rho1_set, pw_pool, xc_section, gapw, vxg, tddfpt_fac, compute_virial, virial_xc, spinflip)
Calculates the second derivative of E_xc at rho in the direction rho1 (if you see the second derivati...
subroutine, public xc_calc_2nd_deriv(v_xc, v_xc_tau, deriv_set, rho_set, rho1_r, rho1_g, tau1_r, pw_pool, weights, xc_section, gapw, vxg, do_excitations, do_sf, do_triplet, compute_virial, virial_xc)
Caller routine to calculate the second order potential in the direction of rho1_r.
subroutine, public xc_calc_3rd_deriv_analytical(v_xc, v_xc_tau, deriv_set, rho_set, rho1_set, pw_pool, xc_section, spinflip)
Calculates the third functional derivative of the exchange-correlation functional,...
subroutine, public xc_prep_3rd_deriv(deriv_set, rho_set, rho_r, pw_pool, weights, xc_section, tau_r, do_sf)
Prepare deriv_set for the calculation of the 3rd derivatives of the density functional....
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 ...
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.
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