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))
THEN
375 cpabort(
"Tau-dependent functionals requires allocated kinetic energy density grid")
377 ALLOCATE (fxc_tau(spindim), gxc_tau(nspins))
378 DO ispin = 1, spindim
379 CALL pw_pool%create_pw(fxc_tau(ispin))
383 CALL pw_pool%create_pw(gxc_tau(ispin))
398 xc_section, tau_r=tau0_r, do_sf=do_sf)
402 CALL qs_rho_get(rho1_struct, rho_r=rho1_r, rho_g=rho1_g, tau_r=tau1_r)
403 bo = rho1_r(1)%pw_grid%bounds_local
421 pw_pool, spinflip=do_sf)
432 xc_section, .false., spinflip=do_sf, tddfpt_fac=
fac)
435 xc_section, spinflip=do_sf)
441 CALL timestop(handle)
461 SUBROUTINE qs_fgxc_gdiff(ks_env, rho0_struct, rho1_struct, xc_section, accuracy, epsrho, &
462 is_triplet, weights, fxc_rho, fxc_tau, gxc_rho, gxc_tau, spinflip)
465 TYPE(
qs_rho_type),
POINTER :: rho0_struct, rho1_struct
467 INTEGER,
INTENT(IN) :: accuracy
468 REAL(kind=
dp),
INTENT(IN) :: epsrho
469 LOGICAL,
INTENT(IN) :: is_triplet
471 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: fxc_rho, fxc_tau, gxc_rho, gxc_tau
472 LOGICAL,
OPTIONAL :: spinflip
474 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_fgxc_gdiff'
476 INTEGER :: handle, ispin, istep, nspins, nstep
478 REAL(kind=
dp) :: alpha, beta, exc, oeps1
479 REAL(kind=
dp),
DIMENSION(-4:4) :: ak
483 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho1_r, tau1_r, v_tau_rspace, vxc00, &
487 CALL timeset(routinen, handle)
489 cpassert(.NOT.
ASSOCIATED(fxc_rho))
490 cpassert(.NOT.
ASSOCIATED(fxc_tau))
491 cpassert(.NOT.
ASSOCIATED(gxc_rho))
492 cpassert(.NOT.
ASSOCIATED(gxc_tau))
493 cpassert(
ASSOCIATED(rho0_struct))
494 cpassert(
ASSOCIATED(rho1_struct))
497 IF (
PRESENT(spinflip)) do_sf = spinflip
500 SELECT CASE (accuracy)
503 ak(-2:2) = [1.0_dp, -8.0_dp, 0.0_dp, 8.0_dp, -1.0_dp]/12.0_dp
506 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
509 ak(-4:4) = [1.0_dp, -32.0_dp/3.0_dp, 56.0_dp, -224.0_dp, 0.0_dp, &
510 224.0_dp, -56.0_dp, 32.0_dp/3.0_dp, -1.0_dp]/280.0_dp
513 CALL get_ks_env(ks_env, dft_control=dft_control, pw_env=pw_env)
514 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
516 nspins = dft_control%nspins
520 CALL qs_rho_get(rho1_struct, rho_r=rho1_r, tau_r=tau1_r)
522 weights, auxbas_pw_pool, is_triplet, &
523 fxc_rho, fxc_tau, spinflip=do_sf)
525 CALL qs_fxc_fdiff(ks_env, rho0_struct, rho1_struct, xc_section, accuracy, is_triplet, &
529 DO istep = -nstep, nstep
531 IF (ak(istep) /= 0.0_dp)
THEN
533 beta = real(istep, kind=
dp)*epsrho
537 NULLIFY (vxc00, vxc00b, v_tau_rspace)
538 CALL qs_rho_copy(rho0_struct, rhoin, auxbas_pw_pool, nspins)
543 xc_section, weights, auxbas_pw_pool, is_triplet, &
544 vxc00, v_tau_rspace, spinflip=do_sf)
546 CALL qs_rho_copy(rho0_struct, rhoin, auxbas_pw_pool, nspins)
549 xc_section, weights, auxbas_pw_pool, is_triplet, &
550 vxc00b, v_tau_rspace, spinflip=do_sf)
552 CALL qs_fxc_fdiff(ks_env=ks_env, rho0_struct=rhoin, rho1_struct=rho1_struct, &
553 xc_section=xc_section, accuracy=accuracy, is_triplet=is_triplet, &
554 fxc_rho=vxc00, fxc_tau=v_tau_rspace)
558 IF (.NOT.
ASSOCIATED(gxc_rho))
THEN
559 ALLOCATE (gxc_rho(nspins))
561 CALL auxbas_pw_pool%create_pw(gxc_rho(ispin))
566 CALL pw_axpy(vxc00(1), gxc_rho(1), ak(istep))
567 CALL pw_axpy(vxc00b(1), gxc_rho(2), ak(istep))
570 CALL pw_axpy(vxc00(ispin), gxc_rho(ispin), ak(istep))
573 DO ispin = 1,
SIZE(vxc00)
574 CALL auxbas_pw_pool%give_back_pw(vxc00(ispin))
577 IF (
ASSOCIATED(vxc00b))
THEN
578 CALL auxbas_pw_pool%give_back_pw(vxc00b(1))
581 IF (
ASSOCIATED(v_tau_rspace))
THEN
582 IF (.NOT.
ASSOCIATED(gxc_tau))
THEN
583 ALLOCATE (gxc_tau(nspins))
585 CALL auxbas_pw_pool%create_pw(gxc_tau(ispin))
590 CALL pw_axpy(v_tau_rspace(ispin), gxc_tau(ispin), ak(istep))
592 DO ispin = 1,
SIZE(v_tau_rspace)
593 CALL auxbas_pw_pool%give_back_pw(v_tau_rspace(ispin))
595 DEALLOCATE (v_tau_rspace)
601 oeps1 = 1.0_dp/epsrho
603 CALL pw_scale(gxc_rho(ispin), oeps1)
605 IF (
ASSOCIATED(gxc_tau))
THEN
607 CALL pw_scale(gxc_tau(ispin), oeps1)
611 CALL timestop(handle)
628 SUBROUTINE qs_fgxc_create(ks_env, rho0_struct, rho1_struct, xc_section, accuracy, is_triplet, &
629 fxc_rho, fxc_tau, gxc_rho, gxc_tau)
632 TYPE(
qs_rho_type),
POINTER :: rho0_struct, rho1_struct
634 INTEGER,
INTENT(IN) :: accuracy
635 LOGICAL,
INTENT(IN) :: is_triplet
636 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: fxc_rho, fxc_tau, gxc_rho, gxc_tau
638 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_fgxc_create'
639 REAL(kind=
dp),
PARAMETER :: epsrho = 5.e-4_dp
641 INTEGER :: handle, ispin, istep, nspins, nstep
642 REAL(kind=
dp) :: alpha, beta, exc, oeps1, oeps2
643 REAL(kind=
dp),
DIMENSION(-4:4) :: ak, bl
647 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: v_tau_rspace, vxc00
650 CALL timeset(routinen, handle)
652 cpassert(.NOT.
ASSOCIATED(fxc_rho))
653 cpassert(.NOT.
ASSOCIATED(fxc_tau))
654 cpassert(.NOT.
ASSOCIATED(gxc_rho))
655 cpassert(.NOT.
ASSOCIATED(gxc_tau))
656 cpassert(
ASSOCIATED(rho0_struct))
657 cpassert(
ASSOCIATED(rho1_struct))
661 SELECT CASE (accuracy)
664 ak(-2:2) = [1.0_dp, -8.0_dp, 0.0_dp, 8.0_dp, -1.0_dp]/12.0_dp
665 bl(-2:2) = [-1.0_dp, 16.0_dp, -30.0_dp, 16.0_dp, -1.0_dp]/12.0_dp
668 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
669 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
672 ak(-4:4) = [1.0_dp, -32.0_dp/3.0_dp, 56.0_dp, -224.0_dp, 0.0_dp, &
673 224.0_dp, -56.0_dp, 32.0_dp/3.0_dp, -1.0_dp]/280.0_dp
674 bl(-4:4) = [-1.0_dp, 128.0_dp/9.0_dp, -112.0_dp, 896.0_dp, -14350.0_dp/9.0_dp, &
675 896.0_dp, -112.0_dp, 128.0_dp/9.0_dp, -1.0_dp]/560.0_dp
678 CALL get_ks_env(ks_env, dft_control=dft_control, pw_env=pw_env)
679 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
681 nspins = dft_control%nspins
684 DO istep = -nstep, nstep
687 beta = real(istep, kind=
dp)*epsrho
691 NULLIFY (vxc00, v_tau_rspace)
693 cpassert(nspins == 1)
695 CALL qs_rho_copy(rho0_struct, rhoin, auxbas_pw_pool, 2)
698 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rhoin, xc_section=xc_section, &
699 vxc_rho=vxc00, vxc_tau=v_tau_rspace, exc=exc, just_energy=.false.)
700 CALL pw_axpy(vxc00(2), vxc00(1), -1.0_dp)
702 CALL qs_rho_copy(rho0_struct, rhoin, auxbas_pw_pool, nspins)
704 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rhoin, xc_section=xc_section, &
705 vxc_rho=vxc00, vxc_tau=v_tau_rspace, exc=exc, just_energy=.false.)
709 IF (.NOT.
ASSOCIATED(fxc_rho))
THEN
710 ALLOCATE (fxc_rho(nspins))
712 CALL auxbas_pw_pool%create_pw(fxc_rho(ispin))
716 IF (.NOT.
ASSOCIATED(gxc_rho))
THEN
717 ALLOCATE (gxc_rho(nspins))
719 CALL auxbas_pw_pool%create_pw(gxc_rho(ispin))
723 cpassert(.NOT.
ASSOCIATED(v_tau_rspace))
725 IF (ak(istep) /= 0.0_dp)
THEN
726 CALL pw_axpy(vxc00(ispin), fxc_rho(ispin), ak(istep))
728 IF (bl(istep) /= 0.0_dp)
THEN
729 CALL pw_axpy(vxc00(ispin), gxc_rho(ispin), bl(istep))
732 DO ispin = 1,
SIZE(vxc00)
733 CALL auxbas_pw_pool%give_back_pw(vxc00(ispin))
739 oeps1 = 1.0_dp/epsrho
740 oeps2 = 1.0_dp/(epsrho**2)
742 CALL pw_scale(fxc_rho(ispin), oeps1)
743 CALL pw_scale(gxc_rho(ispin), oeps2)
746 CALL timestop(handle)
761 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: fxc_rho, fxc_tau, gxc_rho, gxc_tau
768 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
770 IF (
ASSOCIATED(fxc_rho))
THEN
771 DO ispin = 1,
SIZE(fxc_rho)
772 CALL auxbas_pw_pool%give_back_pw(fxc_rho(ispin))
776 IF (
ASSOCIATED(fxc_tau))
THEN
777 DO ispin = 1,
SIZE(fxc_tau)
778 CALL auxbas_pw_pool%give_back_pw(fxc_tau(ispin))
782 IF (
ASSOCIATED(gxc_rho))
THEN
783 DO ispin = 1,
SIZE(gxc_rho)
784 CALL auxbas_pw_pool%give_back_pw(gxc_rho(ispin))
788 IF (
ASSOCIATED(gxc_tau))
THEN
789 DO ispin = 1,
SIZE(gxc_tau)
790 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_vhxc, 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, native_skala_atom_force, qs_env_external, native_gapw_composite_override, native_skala_defer_to_atom_composite)
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