99 SUBROUTINE qs_vxc_create(ks_env, rho_struct, xc_section, vxc_rho, vxc_tau, exc, &
100 just_energy, edisp, dispersion_env, adiabatic_rescale_factor, &
101 pw_env_external, native_skala_atom_force)
107 REAL(kind=
dp),
INTENT(out) :: exc
108 LOGICAL,
INTENT(in),
OPTIONAL :: just_energy
109 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: edisp
111 REAL(kind=
dp),
INTENT(in),
OPTIONAL :: adiabatic_rescale_factor
112 TYPE(
pw_env_type),
OPTIONAL,
POINTER :: pw_env_external
113 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT), &
114 OPTIONAL :: native_skala_atom_force
116 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_vxc_create'
118 INTEGER :: handle, ispin, mspin, myfun, &
120 LOGICAL :: compute_virial, do_adiabatic_rescaling, my_just_energy, native_skala_grid, &
121 rho_g_valid, sic_scaling_b_zero, tau_g_valid, tau_r_valid, uf_grid, vdw_nl
122 REAL(kind=
dp) :: exc_m, factor, &
123 my_adiabatic_rescale_factor, &
124 my_scaling, nelec_s_inv
125 REAL(kind=
dp),
DIMENSION(3, 3) :: virial_xc_tmp
130 TYPE(
pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g, rho_m_gspace, rho_struct_g, &
133 rho_nlcc_g_xc, tmp_g, tmp_g2
135 TYPE(
pw_pool_type),
POINTER :: auxbas_pw_pool, vdw_pw_pool, xc_pw_pool
136 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: my_vxc_rho, my_vxc_tau, rho_m_rspace, &
137 rho_r, rho_struct_r, tau, tau_struct_r
138 TYPE(
pw_r3d_rs_type),
POINTER :: rho_nlcc, rho_nlcc_use, rho_nlcc_xc, &
139 tmp_pw, weights, weights_use, &
143 CALL timeset(routinen, handle)
145 cpassert(.NOT.
ASSOCIATED(vxc_rho))
146 cpassert(.NOT.
ASSOCIATED(vxc_tau))
147 NULLIFY (dft_control, pw_env, auxbas_pw_pool, xc_pw_pool, vdw_pw_pool, cell, my_vxc_rho, &
148 tmp_pw, tmp_g, tmp_g2, my_vxc_tau, rho_g, rho_r, tau, rho_m_rspace, &
149 rho_m_gspace, rho_nlcc, rho_nlcc_g, rho_nlcc_g_use, rho_nlcc_g_xc, &
150 rho_nlcc_use, rho_nlcc_xc, rho_struct_r, rho_struct_g, tau_struct_g, tau_struct_r, &
151 weights_use, weights_xc, particle_set)
154 my_just_energy = .false.
155 IF (
PRESENT(just_energy)) my_just_energy = just_energy
156 my_adiabatic_rescale_factor = 1.0_dp
157 do_adiabatic_rescaling = .false.
158 IF (
PRESENT(adiabatic_rescale_factor))
THEN
159 my_adiabatic_rescale_factor = adiabatic_rescale_factor
160 do_adiabatic_rescaling = .true.
164 dft_control=dft_control, &
167 particle_set=particle_set, &
168 xcint_weights=weights, &
171 rho_nlcc_g=rho_nlcc_g)
172 rho_nlcc_use => rho_nlcc
173 rho_nlcc_g_use => rho_nlcc_g
174 weights_use => weights
177 tau_r_valid=tau_r_valid, &
178 tau_g_valid=tau_g_valid, &
179 rho_g_valid=rho_g_valid, &
180 rho_r=rho_struct_r, &
181 rho_g=rho_struct_g, &
182 tau_g=tau_struct_g, &
185 compute_virial = virial%pv_calculate .AND. (.NOT. virial%pv_numer)
186 IF (compute_virial)
THEN
187 virial%pv_xc = 0.0_dp
197 cpassert(.NOT. (do_adiabatic_rescaling .AND. vdw_nl))
199 IF (.NOT. (
PRESENT(dispersion_env) .AND.
PRESENT(edisp)))
THEN
202 IF (
PRESENT(edisp)) edisp = 0.0_dp
204 IF (native_skala_grid .AND.
ASSOCIATED(rho_nlcc_use))
THEN
205 CALL cp_abort(__location__, &
206 "Native SKALA grid evaluation with NLCC pseudopotentials is not implemented. "// &
207 "The frozen core density would need a SKALA-consistent feature definition.")
210 IF (myfun /=
xc_none .OR. vdw_nl)
THEN
213 cpassert(
ASSOCIATED(rho_struct))
214 IF (dft_control%nspins /= 1 .AND. dft_control%nspins /= 2) &
215 cpabort(
"nspins must be 1 or 2")
216 mspin =
SIZE(rho_struct_r)
217 IF (dft_control%nspins == 2 .AND. mspin == 1) &
218 cpabort(
"Spin count mismatch")
227 SELECT CASE (dft_control%sic_method_id)
232 cpassert(.NOT. tau_r_valid)
234 my_scaling = 1.0_dp - dft_control%sic_scaling_b
236 cpassert(.NOT. tau_r_valid)
244 IF (dft_control%sic_scaling_b == 0.0_dp)
THEN
245 sic_scaling_b_zero = .true.
247 sic_scaling_b_zero = .false.
250 IF (
PRESENT(pw_env_external)) &
251 pw_env => pw_env_external
252 CALL pw_env_get(pw_env, xc_pw_pool=xc_pw_pool, auxbas_pw_pool=auxbas_pw_pool)
253 uf_grid = .NOT.
pw_grid_compare(auxbas_pw_pool%pw_grid, xc_pw_pool%pw_grid)
255 IF (.NOT. uf_grid)
THEN
256 rho_r => rho_struct_r
258 IF (tau_r_valid)
THEN
264 IF (rho_g_valid)
THEN
265 rho_g => rho_struct_g
268 cpassert(rho_g_valid)
269 ALLOCATE (rho_r(mspin))
270 ALLOCATE (rho_g(mspin))
272 CALL xc_pw_pool%create_pw(rho_g(ispin))
273 CALL pw_transfer(rho_struct_g(ispin), rho_g(ispin))
276 CALL xc_pw_pool%create_pw(rho_r(ispin))
279 IF (tau_r_valid)
THEN
280 ALLOCATE (tau(mspin))
282 CALL xc_pw_pool%create_pw(tau(ispin))
285 CALL xc_pw_pool%create_pw(tau_g_xc)
286 IF (tau_g_valid)
THEN
289 CALL auxbas_pw_pool%create_pw(tau_g_aux)
292 CALL auxbas_pw_pool%give_back_pw(tau_g_aux)
295 CALL xc_pw_pool%give_back_pw(tau_g_xc)
299 IF (
ASSOCIATED(weights))
THEN
300 ALLOCATE (weights_xc)
301 CALL xc_pw_pool%create_pw(weights_xc)
304 CALL auxbas_pw_pool%create_pw(weights_g_aux)
305 CALL xc_pw_pool%create_pw(weights_g_xc)
309 CALL xc_pw_pool%give_back_pw(weights_g_xc)
310 CALL auxbas_pw_pool%give_back_pw(weights_g_aux)
312 weights_use => weights_xc
314 IF (
ASSOCIATED(rho_nlcc))
THEN
315 cpassert(
ASSOCIATED(rho_nlcc_g))
316 ALLOCATE (rho_nlcc_g_xc, rho_nlcc_xc)
317 CALL xc_pw_pool%create_pw(rho_nlcc_g_xc)
318 CALL xc_pw_pool%create_pw(rho_nlcc_xc)
319 CALL pw_transfer(rho_nlcc_g, rho_nlcc_g_xc)
320 CALL pw_transfer(rho_nlcc_g_xc, rho_nlcc_xc)
321 rho_nlcc_use => rho_nlcc_xc
322 rho_nlcc_g_use => rho_nlcc_g_xc
327 IF (
ASSOCIATED(rho_nlcc_use))
THEN
330 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
331 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
339 IF (native_skala_grid)
THEN
340 CALL skala_gpw_eval(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, exc=exc, &
341 rho_r=rho_r, rho_g=rho_g, tau=tau, xc_section=xc_section, &
342 weights=weights_use, pw_pool=xc_pw_pool, &
343 particle_set=particle_set, cell=cell, &
344 compute_virial=compute_virial, virial_xc=virial%pv_xc, &
345 just_energy=my_just_energy, atom_force=native_skala_atom_force)
346 ELSE IF (my_just_energy)
THEN
347 exc = xc_exc_calc(rho_r=rho_r, tau=tau, &
348 rho_g=rho_g, xc_section=xc_section, &
349 weights=weights_use, pw_pool=xc_pw_pool)
352 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_r, &
353 rho_g=rho_g, tau=tau, exc=exc, &
354 xc_section=xc_section, &
355 weights=weights_use, pw_pool=xc_pw_pool, &
356 compute_virial=compute_virial, &
357 virial_xc=virial%pv_xc)
361 IF (
ASSOCIATED(rho_nlcc_use))
THEN
364 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
365 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
374 CALL get_ks_env(ks_env=ks_env, para_env=para_env)
376 cpassert(dft_control%sic_method_id == sic_none)
378 CALL pw_env_get(pw_env, vdw_pw_pool=vdw_pw_pool)
379 IF (my_just_energy)
THEN
380 CALL calculate_dispersion_nonloc(my_vxc_rho, rho_r, rho_g, edisp, dispersion_env, &
381 my_just_energy, vdw_pw_pool, xc_pw_pool, para_env)
383 CALL calculate_dispersion_nonloc(my_vxc_rho, rho_r, rho_g, edisp, dispersion_env, &
384 my_just_energy, vdw_pw_pool, xc_pw_pool, para_env, virial=virial)
389 IF (.NOT. my_just_energy)
THEN
390 IF (do_adiabatic_rescaling)
THEN
391 IF (
ASSOCIATED(my_vxc_rho))
THEN
392 DO ispin = 1,
SIZE(my_vxc_rho)
393 CALL pw_scale(my_vxc_rho(ispin), my_adiabatic_rescale_factor)
399 IF (my_scaling /= 1.0_dp)
THEN
401 IF (
ASSOCIATED(my_vxc_rho))
THEN
402 DO ispin = 1,
SIZE(my_vxc_rho)
403 CALL pw_scale(my_vxc_rho(ispin), my_scaling)
406 IF (
ASSOCIATED(my_vxc_tau))
THEN
407 DO ispin = 1,
SIZE(my_vxc_tau)
408 CALL pw_scale(my_vxc_tau(ispin), my_scaling)
415 IF (
ASSOCIATED(my_vxc_rho))
THEN
416 vxc_rho => my_vxc_rho
419 IF (
ASSOCIATED(my_vxc_tau))
THEN
420 vxc_tau => my_vxc_tau
424 DO ispin = 1,
SIZE(rho_r)
425 CALL xc_pw_pool%give_back_pw(rho_r(ispin))
428 IF (
ASSOCIATED(rho_g))
THEN
429 DO ispin = 1,
SIZE(rho_g)
430 CALL xc_pw_pool%give_back_pw(rho_g(ispin))
437 IF (dft_control%sic_method_id == sic_mauri_spz .AND. .NOT. sic_scaling_b_zero)
THEN
438 ALLOCATE (rho_m_rspace(2), rho_m_gspace(2))
439 CALL xc_pw_pool%create_pw(rho_m_gspace(1))
440 CALL xc_pw_pool%create_pw(rho_m_rspace(1))
441 CALL pw_copy(rho_struct_r(1), rho_m_rspace(1))
442 CALL pw_axpy(rho_struct_r(2), rho_m_rspace(1), alpha=-1._dp)
443 CALL pw_copy(rho_struct_g(1), rho_m_gspace(1))
444 CALL pw_axpy(rho_struct_g(2), rho_m_gspace(1), alpha=-1._dp)
446 CALL xc_pw_pool%create_pw(rho_m_gspace(2))
447 CALL xc_pw_pool%create_pw(rho_m_rspace(2))
448 CALL pw_zero(rho_m_rspace(2))
449 CALL pw_zero(rho_m_gspace(2))
451 IF (my_just_energy)
THEN
452 exc_m = xc_exc_calc(rho_r=rho_m_rspace, tau=tau, &
453 rho_g=rho_m_gspace, xc_section=xc_section, &
454 weights=weights_use, pw_pool=xc_pw_pool)
457 cpassert(.NOT. compute_virial)
458 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_m_rspace, &
459 rho_g=rho_m_gspace, tau=tau, exc=exc_m, &
460 xc_section=xc_section, &
461 weights=weights_use, pw_pool=xc_pw_pool, &
462 compute_virial=.false., &
463 virial_xc=virial_xc_tmp)
466 exc = exc - dft_control%sic_scaling_b*exc_m
469 IF (.NOT. my_just_energy)
THEN
470 CALL pw_axpy(my_vxc_rho(1), vxc_rho(1), -dft_control%sic_scaling_b)
471 CALL pw_axpy(my_vxc_rho(1), vxc_rho(2), dft_control%sic_scaling_b)
472 CALL my_vxc_rho(1)%release()
473 CALL my_vxc_rho(2)%release()
474 DEALLOCATE (my_vxc_rho)
478 CALL xc_pw_pool%give_back_pw(rho_m_rspace(ispin))
479 CALL xc_pw_pool%give_back_pw(rho_m_gspace(ispin))
481 DEALLOCATE (rho_m_rspace)
482 DEALLOCATE (rho_m_gspace)
487 IF (dft_control%sic_method_id == sic_ad .AND. .NOT. sic_scaling_b_zero)
THEN
490 CALL get_ks_env(ks_env, nelectron_spin=nelec_spin)
492 ALLOCATE (rho_m_rspace(2), rho_m_gspace(2))
494 CALL xc_pw_pool%create_pw(rho_m_gspace(ispin))
495 CALL xc_pw_pool%create_pw(rho_m_rspace(ispin))
499 IF (nelec_spin(ispin) > 0.0_dp)
THEN
500 nelec_s_inv = 1.0_dp/nelec_spin(ispin)
505 CALL pw_copy(rho_struct_r(ispin), rho_m_rspace(1))
506 CALL pw_copy(rho_struct_g(ispin), rho_m_gspace(1))
507 CALL pw_scale(rho_m_rspace(1), nelec_s_inv)
508 CALL pw_scale(rho_m_gspace(1), nelec_s_inv)
509 CALL pw_zero(rho_m_rspace(2))
510 CALL pw_zero(rho_m_gspace(2))
512 IF (my_just_energy)
THEN
513 exc_m = xc_exc_calc(rho_r=rho_m_rspace, tau=tau, &
514 rho_g=rho_m_gspace, xc_section=xc_section, &
515 weights=weights_use, pw_pool=xc_pw_pool)
518 cpassert(.NOT. compute_virial)
519 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_m_rspace, &
520 rho_g=rho_m_gspace, tau=tau, exc=exc_m, &
521 xc_section=xc_section, &
522 weights=weights_use, pw_pool=xc_pw_pool, &
523 compute_virial=.false., &
524 virial_xc=virial_xc_tmp)
527 exc = exc - dft_control%sic_scaling_b*nelec_spin(ispin)*exc_m
530 IF (.NOT. my_just_energy)
THEN
531 CALL pw_axpy(my_vxc_rho(1), vxc_rho(ispin), -dft_control%sic_scaling_b)
532 CALL my_vxc_rho(1)%release()
533 CALL my_vxc_rho(2)%release()
534 DEALLOCATE (my_vxc_rho)
539 CALL xc_pw_pool%give_back_pw(rho_m_rspace(ispin))
540 CALL xc_pw_pool%give_back_pw(rho_m_gspace(ispin))
542 DEALLOCATE (rho_m_rspace)
543 DEALLOCATE (rho_m_gspace)
548 IF (dft_control%sic_method_id == sic_mauri_us .AND. .NOT. sic_scaling_b_zero)
THEN
550 rho_r(1) = rho_struct_r(2)
551 rho_r(2) = rho_struct_r(2)
552 IF (rho_g_valid)
THEN
554 rho_g(1) = rho_struct_g(2)
555 rho_g(2) = rho_struct_g(2)
558 IF (my_just_energy)
THEN
559 exc_m = xc_exc_calc(rho_r=rho_r, tau=tau, &
560 rho_g=rho_g, xc_section=xc_section, &
561 weights=weights_use, pw_pool=xc_pw_pool)
564 cpassert(.NOT. compute_virial)
565 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_r, &
566 rho_g=rho_g, tau=tau, exc=exc_m, &
567 xc_section=xc_section, &
568 weights=weights_use, pw_pool=xc_pw_pool, &
569 compute_virial=.false., &
570 virial_xc=virial_xc_tmp)
573 exc = exc + dft_control%sic_scaling_b*exc_m
576 IF (.NOT. my_just_energy)
THEN
578 CALL pw_axpy(my_vxc_rho(1), vxc_rho(2), 2.0_dp*dft_control%sic_scaling_b)
579 CALL my_vxc_rho(1)%release()
580 CALL my_vxc_rho(2)%release()
581 DEALLOCATE (my_vxc_rho)
583 DEALLOCATE (rho_r, rho_g)
590 IF (uf_grid .AND. (
ASSOCIATED(vxc_rho) .OR.
ASSOCIATED(vxc_tau)))
THEN
592 TYPE(pw_r3d_rs_type) :: tmp_pw
593 TYPE(pw_c1d_gs_type) :: tmp_g, tmp_g2
594 CALL xc_pw_pool%create_pw(tmp_g)
595 CALL auxbas_pw_pool%create_pw(tmp_g2)
596 IF (
ASSOCIATED(vxc_rho))
THEN
597 DO ispin = 1,
SIZE(vxc_rho)
598 CALL auxbas_pw_pool%create_pw(tmp_pw)
599 CALL pw_transfer(vxc_rho(ispin), tmp_g)
600 CALL pw_transfer(tmp_g, tmp_g2)
601 CALL pw_transfer(tmp_g2, tmp_pw)
602 CALL xc_pw_pool%give_back_pw(vxc_rho(ispin))
603 vxc_rho(ispin) = tmp_pw
606 IF (
ASSOCIATED(vxc_tau))
THEN
607 DO ispin = 1,
SIZE(vxc_tau)
608 CALL auxbas_pw_pool%create_pw(tmp_pw)
609 CALL pw_transfer(vxc_tau(ispin), tmp_g)
610 CALL pw_transfer(tmp_g, tmp_g2)
611 CALL pw_transfer(tmp_g2, tmp_pw)
612 CALL xc_pw_pool%give_back_pw(vxc_tau(ispin))
613 vxc_tau(ispin) = tmp_pw
616 CALL auxbas_pw_pool%give_back_pw(tmp_g2)
617 CALL xc_pw_pool%give_back_pw(tmp_g)
620 IF (
ASSOCIATED(tau) .AND. uf_grid)
THEN
621 DO ispin = 1,
SIZE(tau)
622 CALL xc_pw_pool%give_back_pw(tau(ispin))
626 IF (
ASSOCIATED(weights_xc))
THEN
627 CALL xc_pw_pool%give_back_pw(weights_xc)
628 DEALLOCATE (weights_xc)
630 IF (
ASSOCIATED(rho_nlcc_xc))
THEN
631 CALL xc_pw_pool%give_back_pw(rho_nlcc_xc)
632 DEALLOCATE (rho_nlcc_xc)
634 IF (
ASSOCIATED(rho_nlcc_g_xc))
THEN
635 CALL xc_pw_pool%give_back_pw(rho_nlcc_g_xc)
636 DEALLOCATE (rho_nlcc_g_xc)
641 CALL timestop(handle)
659 xc_ener, xc_den, exc, vxc, vtau)
661 TYPE(qs_ks_env_type),
POINTER :: ks_env
662 TYPE(qs_rho_type),
POINTER :: rho_struct
663 TYPE(section_vals_type),
POINTER :: xc_section
664 TYPE(qs_dispersion_type),
OPTIONAL,
POINTER :: dispersion_env
665 TYPE(pw_r3d_rs_type),
INTENT(INOUT),
OPTIONAL :: xc_ener, xc_den
666 TYPE(pw_r3d_rs_type),
OPTIONAL :: exc
667 TYPE(pw_r3d_rs_type),
DIMENSION(:),
OPTIONAL :: vxc, vtau
669 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_xc_density'
671 INTEGER :: handle, ispin, mspin, myfun, nspins, vdw
672 LOGICAL :: rho_g_valid, tau_g_valid, tau_r_valid, &
674 REAL(kind=dp) :: edisp, excint, factor, rho_cutoff
675 REAL(kind=dp),
DIMENSION(3, 3) :: vdum
676 TYPE(cell_type),
POINTER :: cell
677 TYPE(dft_control_type),
POINTER :: dft_control
678 TYPE(mp_para_env_type),
POINTER :: para_env
679 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g, rho_struct_g, tau_g, tau_struct_g
680 TYPE(pw_c1d_gs_type),
POINTER :: rho_nlcc_g, rho_nlcc_g_use, rho_nlcc_g_xc
681 TYPE(pw_env_type),
POINTER :: pw_env
682 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool, vdw_pw_pool, xc_pw_pool
683 TYPE(pw_r3d_rs_type) :: exc_r
684 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, rho_struct_r, tau_r, &
685 tau_struct_r, vxc_rho, vxc_tau
686 TYPE(pw_r3d_rs_type),
POINTER :: rho_nlcc, rho_nlcc_use, rho_nlcc_xc, &
687 weights, weights_use, weights_xc
689 CALL timeset(routinen, handle)
691 NULLIFY (dft_control, pw_env, auxbas_pw_pool, xc_pw_pool, vdw_pw_pool, cell, &
692 rho_g, rho_struct_g, tau_g, tau_struct_g, rho_nlcc, rho_nlcc_g, &
693 rho_nlcc_g_use, rho_nlcc_g_xc, rho_nlcc_use, rho_nlcc_xc, rho_r, &
694 rho_struct_r, tau_r, tau_struct_r, vxc_rho, vxc_tau, weights, &
695 weights_use, weights_xc)
697 CALL get_ks_env(ks_env, &
698 dft_control=dft_control, &
701 xcint_weights=weights, &
703 rho_nlcc_g=rho_nlcc_g)
705 CALL qs_rho_get(rho_struct, &
706 tau_r_valid=tau_r_valid, &
707 tau_g_valid=tau_g_valid, &
708 rho_g_valid=rho_g_valid, &
709 rho_r=rho_struct_r, &
710 rho_g=rho_struct_g, &
711 tau_r=tau_struct_r, &
713 nspins = dft_control%nspins
714 mspin =
SIZE(rho_struct_r)
715 rho_r => rho_struct_r
716 rho_g => rho_struct_g
717 tau_r => tau_struct_r
718 tau_g => tau_struct_g
719 rho_nlcc_use => rho_nlcc
720 rho_nlcc_g_use => rho_nlcc_g
721 weights_use => weights
723 CALL section_vals_val_get(xc_section,
"XC_FUNCTIONAL%_SECTION_PARAMETERS_", i_val=myfun)
724 CALL section_vals_val_get(xc_section,
"VDW_POTENTIAL%POTENTIAL_TYPE", i_val=vdw)
725 vdw_nl = (vdw == xc_vdw_fun_nonloc)
726 IF (
PRESENT(xc_ener))
THEN
727 IF (tau_r_valid)
THEN
728 CALL cp_warn(__location__,
"Tau contribution will not be correctly handled")
732 CALL cp_warn(__location__,
"vdW functional contribution will be ignored")
735 CALL pw_env_get(pw_env, xc_pw_pool=xc_pw_pool, auxbas_pw_pool=auxbas_pw_pool)
736 uf_grid = .NOT. pw_grid_compare(auxbas_pw_pool%pw_grid, xc_pw_pool%pw_grid)
738 IF (
PRESENT(xc_ener))
THEN
739 CALL pw_zero(xc_ener)
741 IF (
PRESENT(xc_den))
THEN
744 IF (
PRESENT(exc))
THEN
747 IF (
PRESENT(vxc))
THEN
749 CALL pw_zero(vxc(ispin))
752 IF (
PRESENT(vtau))
THEN
754 CALL pw_zero(vtau(ispin))
758 IF (myfun /= xc_none)
THEN
760 cpassert(
ASSOCIATED(rho_struct))
761 cpassert(dft_control%sic_method_id == sic_none)
764 NULLIFY (rho_r, rho_g, tau_r, tau_g)
765 IF (rho_g_valid)
THEN
766 CALL create_density_on_pool(xc_pw_pool, rho_struct_g, rho_r, rho_g)
767 ELSEIF (
ASSOCIATED(rho_struct_r))
THEN
768 CALL create_density_on_pool_from_r(auxbas_pw_pool, xc_pw_pool, rho_struct_r, rho_r, rho_g)
770 cpabort(
"Fine Grid in qs_xc_density requires rho_r or rho_g")
772 IF (tau_r_valid)
THEN
773 IF (tau_g_valid)
THEN
774 CALL create_density_on_pool(xc_pw_pool, tau_struct_g, tau_r, tau_g)
775 ELSEIF (
ASSOCIATED(tau_struct_r))
THEN
776 CALL create_density_on_pool_from_r(auxbas_pw_pool, xc_pw_pool, tau_struct_r, tau_r, tau_g)
778 cpabort(
"Fine Grid in qs_xc_density requires tau_r or tau_g")
781 IF (
ASSOCIATED(weights))
THEN
782 ALLOCATE (weights_xc)
783 CALL xc_pw_pool%create_pw(weights_xc)
784 CALL transfer_rspace_between_pools(auxbas_pw_pool, xc_pw_pool, weights, weights_xc)
785 weights_use => weights_xc
787 IF (
ASSOCIATED(rho_nlcc))
THEN
788 cpassert(
ASSOCIATED(rho_nlcc_g))
789 ALLOCATE (rho_nlcc_g_xc, rho_nlcc_xc)
790 CALL xc_pw_pool%create_pw(rho_nlcc_g_xc)
791 CALL xc_pw_pool%create_pw(rho_nlcc_xc)
792 CALL pw_transfer(rho_nlcc_g, rho_nlcc_g_xc)
793 CALL pw_transfer(rho_nlcc_g_xc, rho_nlcc_xc)
794 rho_nlcc_use => rho_nlcc_xc
795 rho_nlcc_g_use => rho_nlcc_g_xc
800 IF (
ASSOCIATED(rho_nlcc_use))
THEN
803 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
804 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
807 NULLIFY (vxc_rho, vxc_tau)
808 CALL xc_vxc_pw_create(vxc_rho=vxc_rho, vxc_tau=vxc_tau, rho_r=rho_r, &
809 rho_g=rho_g, tau=tau_r, exc=excint, &
810 xc_section=xc_section, &
811 weights=weights_use, pw_pool=xc_pw_pool, &
812 compute_virial=.false., &
820 CALL get_ks_env(ks_env=ks_env, para_env=para_env)
822 cpassert(dft_control%sic_method_id == sic_none)
824 CALL pw_env_get(pw_env, vdw_pw_pool=vdw_pw_pool)
825 CALL calculate_dispersion_nonloc(vxc_rho, rho_r, rho_g, edisp, dispersion_env, &
826 .false., vdw_pw_pool, xc_pw_pool, para_env)
830 IF (
ASSOCIATED(rho_nlcc_use))
THEN
833 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
834 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
838 IF (
PRESENT(xc_den))
THEN
839 rho_cutoff = 1.e-14_dp
842 TYPE(pw_r3d_rs_type) :: tmp_pw
843 CALL xc_pw_pool%create_pw(tmp_pw)
844 CALL pw_copy(exc_r, tmp_pw)
845 CALL calc_xc_density(tmp_pw, rho_r, rho_cutoff)
846 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, tmp_pw, xc_den)
847 CALL xc_pw_pool%give_back_pw(tmp_pw)
850 CALL pw_copy(exc_r, xc_den)
851 CALL calc_xc_density(xc_den, rho_r, rho_cutoff)
854 IF (
PRESENT(xc_ener))
THEN
857 TYPE(pw_r3d_rs_type) :: tmp_pw
858 CALL xc_pw_pool%create_pw(tmp_pw)
859 CALL pw_copy(exc_r, tmp_pw)
861 CALL pw_multiply(tmp_pw, vxc_rho(ispin), rho_r(ispin), alpha=-1.0_dp)
863 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, tmp_pw, xc_ener)
864 CALL xc_pw_pool%give_back_pw(tmp_pw)
867 CALL pw_copy(exc_r, xc_ener)
869 CALL pw_multiply(xc_ener, vxc_rho(ispin), rho_r(ispin), alpha=-1.0_dp)
873 IF (
PRESENT(exc))
THEN
875 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, exc_r, exc)
877 CALL pw_copy(exc_r, exc)
880 IF (
PRESENT(vxc))
THEN
883 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, vxc_rho(ispin), vxc(ispin))
885 CALL pw_copy(vxc_rho(ispin), vxc(ispin))
889 IF (
PRESENT(vtau) .AND.
ASSOCIATED(vxc_tau))
THEN
892 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, vxc_tau(ispin), vtau(ispin))
894 CALL pw_copy(vxc_tau(ispin), vtau(ispin))
899 IF (
ASSOCIATED(vxc_rho))
THEN
901 CALL vxc_rho(ispin)%release()
905 IF (
ASSOCIATED(vxc_tau))
THEN
907 CALL vxc_tau(ispin)%release()
913 CALL give_back_density_on_pool(xc_pw_pool, rho_r, rho_g)
914 IF (
ASSOCIATED(tau_r))
CALL give_back_density_on_pool(xc_pw_pool, tau_r, tau_g)
915 IF (
ASSOCIATED(weights_xc))
THEN
916 CALL xc_pw_pool%give_back_pw(weights_xc)
917 DEALLOCATE (weights_xc)
919 IF (
ASSOCIATED(rho_nlcc_xc))
THEN
920 CALL xc_pw_pool%give_back_pw(rho_nlcc_xc)
921 DEALLOCATE (rho_nlcc_xc)
923 IF (
ASSOCIATED(rho_nlcc_g_xc))
THEN
924 CALL xc_pw_pool%give_back_pw(rho_nlcc_g_xc)
925 DEALLOCATE (rho_nlcc_g_xc)
931 CALL timestop(handle)
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)
...