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
205 IF (myfun /=
xc_none .OR. vdw_nl)
THEN
208 cpassert(
ASSOCIATED(rho_struct))
209 IF (dft_control%nspins /= 1 .AND. dft_control%nspins /= 2)
THEN
210 cpabort(
"nspins must be 1 or 2")
212 mspin =
SIZE(rho_struct_r)
213 IF (dft_control%nspins == 2 .AND. mspin == 1)
THEN
214 cpabort(
"Spin count mismatch")
224 SELECT CASE (dft_control%sic_method_id)
229 cpassert(.NOT. tau_r_valid)
231 my_scaling = 1.0_dp - dft_control%sic_scaling_b
233 cpassert(.NOT. tau_r_valid)
241 IF (dft_control%sic_scaling_b == 0.0_dp)
THEN
242 sic_scaling_b_zero = .true.
244 sic_scaling_b_zero = .false.
247 IF (
PRESENT(pw_env_external))
THEN
248 pw_env => pw_env_external
250 CALL pw_env_get(pw_env, xc_pw_pool=xc_pw_pool, auxbas_pw_pool=auxbas_pw_pool)
251 uf_grid = .NOT.
pw_grid_compare(auxbas_pw_pool%pw_grid, xc_pw_pool%pw_grid)
253 IF (.NOT. uf_grid)
THEN
254 rho_r => rho_struct_r
256 IF (tau_r_valid)
THEN
262 IF (rho_g_valid)
THEN
263 rho_g => rho_struct_g
266 cpassert(rho_g_valid)
267 ALLOCATE (rho_r(mspin))
268 ALLOCATE (rho_g(mspin))
270 CALL xc_pw_pool%create_pw(rho_g(ispin))
271 CALL pw_transfer(rho_struct_g(ispin), rho_g(ispin))
274 CALL xc_pw_pool%create_pw(rho_r(ispin))
277 IF (tau_r_valid)
THEN
278 ALLOCATE (tau(mspin))
280 CALL xc_pw_pool%create_pw(tau(ispin))
283 CALL xc_pw_pool%create_pw(tau_g_xc)
284 IF (tau_g_valid)
THEN
287 CALL auxbas_pw_pool%create_pw(tau_g_aux)
290 CALL auxbas_pw_pool%give_back_pw(tau_g_aux)
293 CALL xc_pw_pool%give_back_pw(tau_g_xc)
297 IF (
ASSOCIATED(weights))
THEN
298 ALLOCATE (weights_xc)
299 CALL xc_pw_pool%create_pw(weights_xc)
302 CALL auxbas_pw_pool%create_pw(weights_g_aux)
303 CALL xc_pw_pool%create_pw(weights_g_xc)
307 CALL xc_pw_pool%give_back_pw(weights_g_xc)
308 CALL auxbas_pw_pool%give_back_pw(weights_g_aux)
310 weights_use => weights_xc
312 IF (
ASSOCIATED(rho_nlcc))
THEN
313 cpassert(
ASSOCIATED(rho_nlcc_g))
314 ALLOCATE (rho_nlcc_g_xc, rho_nlcc_xc)
315 CALL xc_pw_pool%create_pw(rho_nlcc_g_xc)
316 CALL xc_pw_pool%create_pw(rho_nlcc_xc)
317 CALL pw_transfer(rho_nlcc_g, rho_nlcc_g_xc)
318 CALL pw_transfer(rho_nlcc_g_xc, rho_nlcc_xc)
319 rho_nlcc_use => rho_nlcc_xc
320 rho_nlcc_g_use => rho_nlcc_g_xc
325 IF (
ASSOCIATED(rho_nlcc_use))
THEN
328 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
329 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
337 IF (native_skala_grid)
THEN
338 CALL skala_gpw_eval(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, exc=exc, &
339 rho_r=rho_r, rho_g=rho_g, tau=tau, xc_section=xc_section, &
340 weights=weights_use, pw_pool=xc_pw_pool, &
341 particle_set=particle_set, cell=cell, &
342 compute_virial=compute_virial, virial_xc=virial%pv_xc, &
343 just_energy=my_just_energy, atom_force=native_skala_atom_force)
344 ELSE IF (my_just_energy)
THEN
345 exc = xc_exc_calc(rho_r=rho_r, tau=tau, &
346 rho_g=rho_g, xc_section=xc_section, &
347 weights=weights_use, pw_pool=xc_pw_pool)
350 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_r, &
351 rho_g=rho_g, tau=tau, exc=exc, &
352 xc_section=xc_section, &
353 weights=weights_use, pw_pool=xc_pw_pool, &
354 compute_virial=compute_virial, &
355 virial_xc=virial%pv_xc)
359 IF (
ASSOCIATED(rho_nlcc_use))
THEN
362 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
363 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
372 CALL get_ks_env(ks_env=ks_env, para_env=para_env)
374 cpassert(dft_control%sic_method_id == sic_none)
376 CALL pw_env_get(pw_env, vdw_pw_pool=vdw_pw_pool)
377 IF (my_just_energy)
THEN
378 CALL calculate_dispersion_nonloc(my_vxc_rho, rho_r, rho_g, edisp, dispersion_env, &
379 my_just_energy, vdw_pw_pool, xc_pw_pool, para_env)
381 CALL calculate_dispersion_nonloc(my_vxc_rho, rho_r, rho_g, edisp, dispersion_env, &
382 my_just_energy, vdw_pw_pool, xc_pw_pool, para_env, virial=virial)
387 IF (.NOT. my_just_energy)
THEN
388 IF (do_adiabatic_rescaling)
THEN
389 IF (
ASSOCIATED(my_vxc_rho))
THEN
390 DO ispin = 1,
SIZE(my_vxc_rho)
391 CALL pw_scale(my_vxc_rho(ispin), my_adiabatic_rescale_factor)
397 IF (my_scaling /= 1.0_dp)
THEN
399 IF (
ASSOCIATED(my_vxc_rho))
THEN
400 DO ispin = 1,
SIZE(my_vxc_rho)
401 CALL pw_scale(my_vxc_rho(ispin), my_scaling)
404 IF (
ASSOCIATED(my_vxc_tau))
THEN
405 DO ispin = 1,
SIZE(my_vxc_tau)
406 CALL pw_scale(my_vxc_tau(ispin), my_scaling)
413 IF (
ASSOCIATED(my_vxc_rho))
THEN
414 vxc_rho => my_vxc_rho
417 IF (
ASSOCIATED(my_vxc_tau))
THEN
418 vxc_tau => my_vxc_tau
422 DO ispin = 1,
SIZE(rho_r)
423 CALL xc_pw_pool%give_back_pw(rho_r(ispin))
426 IF (
ASSOCIATED(rho_g))
THEN
427 DO ispin = 1,
SIZE(rho_g)
428 CALL xc_pw_pool%give_back_pw(rho_g(ispin))
435 IF (dft_control%sic_method_id == sic_mauri_spz .AND. .NOT. sic_scaling_b_zero)
THEN
436 ALLOCATE (rho_m_rspace(2), rho_m_gspace(2))
437 CALL xc_pw_pool%create_pw(rho_m_gspace(1))
438 CALL xc_pw_pool%create_pw(rho_m_rspace(1))
439 CALL pw_copy(rho_struct_r(1), rho_m_rspace(1))
440 CALL pw_axpy(rho_struct_r(2), rho_m_rspace(1), alpha=-1._dp)
441 CALL pw_copy(rho_struct_g(1), rho_m_gspace(1))
442 CALL pw_axpy(rho_struct_g(2), rho_m_gspace(1), alpha=-1._dp)
444 CALL xc_pw_pool%create_pw(rho_m_gspace(2))
445 CALL xc_pw_pool%create_pw(rho_m_rspace(2))
446 CALL pw_zero(rho_m_rspace(2))
447 CALL pw_zero(rho_m_gspace(2))
449 IF (my_just_energy)
THEN
450 exc_m = xc_exc_calc(rho_r=rho_m_rspace, tau=tau, &
451 rho_g=rho_m_gspace, xc_section=xc_section, &
452 weights=weights_use, pw_pool=xc_pw_pool)
455 cpassert(.NOT. compute_virial)
456 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_m_rspace, &
457 rho_g=rho_m_gspace, tau=tau, exc=exc_m, &
458 xc_section=xc_section, &
459 weights=weights_use, pw_pool=xc_pw_pool, &
460 compute_virial=.false., &
461 virial_xc=virial_xc_tmp)
464 exc = exc - dft_control%sic_scaling_b*exc_m
467 IF (.NOT. my_just_energy)
THEN
468 CALL pw_axpy(my_vxc_rho(1), vxc_rho(1), -dft_control%sic_scaling_b)
469 CALL pw_axpy(my_vxc_rho(1), vxc_rho(2), dft_control%sic_scaling_b)
470 CALL my_vxc_rho(1)%release()
471 CALL my_vxc_rho(2)%release()
472 DEALLOCATE (my_vxc_rho)
476 CALL xc_pw_pool%give_back_pw(rho_m_rspace(ispin))
477 CALL xc_pw_pool%give_back_pw(rho_m_gspace(ispin))
479 DEALLOCATE (rho_m_rspace)
480 DEALLOCATE (rho_m_gspace)
485 IF (dft_control%sic_method_id == sic_ad .AND. .NOT. sic_scaling_b_zero)
THEN
488 CALL get_ks_env(ks_env, nelectron_spin=nelec_spin)
490 ALLOCATE (rho_m_rspace(2), rho_m_gspace(2))
492 CALL xc_pw_pool%create_pw(rho_m_gspace(ispin))
493 CALL xc_pw_pool%create_pw(rho_m_rspace(ispin))
497 IF (nelec_spin(ispin) > 0.0_dp)
THEN
498 nelec_s_inv = 1.0_dp/nelec_spin(ispin)
503 CALL pw_copy(rho_struct_r(ispin), rho_m_rspace(1))
504 CALL pw_copy(rho_struct_g(ispin), rho_m_gspace(1))
505 CALL pw_scale(rho_m_rspace(1), nelec_s_inv)
506 CALL pw_scale(rho_m_gspace(1), nelec_s_inv)
507 CALL pw_zero(rho_m_rspace(2))
508 CALL pw_zero(rho_m_gspace(2))
510 IF (my_just_energy)
THEN
511 exc_m = xc_exc_calc(rho_r=rho_m_rspace, tau=tau, &
512 rho_g=rho_m_gspace, xc_section=xc_section, &
513 weights=weights_use, pw_pool=xc_pw_pool)
516 cpassert(.NOT. compute_virial)
517 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_m_rspace, &
518 rho_g=rho_m_gspace, tau=tau, exc=exc_m, &
519 xc_section=xc_section, &
520 weights=weights_use, pw_pool=xc_pw_pool, &
521 compute_virial=.false., &
522 virial_xc=virial_xc_tmp)
525 exc = exc - dft_control%sic_scaling_b*nelec_spin(ispin)*exc_m
528 IF (.NOT. my_just_energy)
THEN
529 CALL pw_axpy(my_vxc_rho(1), vxc_rho(ispin), -dft_control%sic_scaling_b)
530 CALL my_vxc_rho(1)%release()
531 CALL my_vxc_rho(2)%release()
532 DEALLOCATE (my_vxc_rho)
537 CALL xc_pw_pool%give_back_pw(rho_m_rspace(ispin))
538 CALL xc_pw_pool%give_back_pw(rho_m_gspace(ispin))
540 DEALLOCATE (rho_m_rspace)
541 DEALLOCATE (rho_m_gspace)
546 IF (dft_control%sic_method_id == sic_mauri_us .AND. .NOT. sic_scaling_b_zero)
THEN
548 rho_r(1) = rho_struct_r(2)
549 rho_r(2) = rho_struct_r(2)
550 IF (rho_g_valid)
THEN
552 rho_g(1) = rho_struct_g(2)
553 rho_g(2) = rho_struct_g(2)
556 IF (my_just_energy)
THEN
557 exc_m = xc_exc_calc(rho_r=rho_r, tau=tau, &
558 rho_g=rho_g, xc_section=xc_section, &
559 weights=weights_use, pw_pool=xc_pw_pool)
562 cpassert(.NOT. compute_virial)
563 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_r, &
564 rho_g=rho_g, tau=tau, exc=exc_m, &
565 xc_section=xc_section, &
566 weights=weights_use, pw_pool=xc_pw_pool, &
567 compute_virial=.false., &
568 virial_xc=virial_xc_tmp)
571 exc = exc + dft_control%sic_scaling_b*exc_m
574 IF (.NOT. my_just_energy)
THEN
576 CALL pw_axpy(my_vxc_rho(1), vxc_rho(2), 2.0_dp*dft_control%sic_scaling_b)
577 CALL my_vxc_rho(1)%release()
578 CALL my_vxc_rho(2)%release()
579 DEALLOCATE (my_vxc_rho)
581 DEALLOCATE (rho_r, rho_g)
588 IF (uf_grid .AND. (
ASSOCIATED(vxc_rho) .OR.
ASSOCIATED(vxc_tau)))
THEN
590 TYPE(pw_r3d_rs_type) :: tmp_pw
591 TYPE(pw_c1d_gs_type) :: tmp_g, tmp_g2
592 CALL xc_pw_pool%create_pw(tmp_g)
593 CALL auxbas_pw_pool%create_pw(tmp_g2)
594 IF (
ASSOCIATED(vxc_rho))
THEN
595 DO ispin = 1,
SIZE(vxc_rho)
596 CALL auxbas_pw_pool%create_pw(tmp_pw)
597 CALL pw_transfer(vxc_rho(ispin), tmp_g)
598 CALL pw_transfer(tmp_g, tmp_g2)
599 CALL pw_transfer(tmp_g2, tmp_pw)
600 CALL xc_pw_pool%give_back_pw(vxc_rho(ispin))
601 vxc_rho(ispin) = tmp_pw
604 IF (
ASSOCIATED(vxc_tau))
THEN
605 DO ispin = 1,
SIZE(vxc_tau)
606 CALL auxbas_pw_pool%create_pw(tmp_pw)
607 CALL pw_transfer(vxc_tau(ispin), tmp_g)
608 CALL pw_transfer(tmp_g, tmp_g2)
609 CALL pw_transfer(tmp_g2, tmp_pw)
610 CALL xc_pw_pool%give_back_pw(vxc_tau(ispin))
611 vxc_tau(ispin) = tmp_pw
614 CALL auxbas_pw_pool%give_back_pw(tmp_g2)
615 CALL xc_pw_pool%give_back_pw(tmp_g)
618 IF (
ASSOCIATED(tau) .AND. uf_grid)
THEN
619 DO ispin = 1,
SIZE(tau)
620 CALL xc_pw_pool%give_back_pw(tau(ispin))
624 IF (
ASSOCIATED(weights_xc))
THEN
625 CALL xc_pw_pool%give_back_pw(weights_xc)
626 DEALLOCATE (weights_xc)
628 IF (
ASSOCIATED(rho_nlcc_xc))
THEN
629 CALL xc_pw_pool%give_back_pw(rho_nlcc_xc)
630 DEALLOCATE (rho_nlcc_xc)
632 IF (
ASSOCIATED(rho_nlcc_g_xc))
THEN
633 CALL xc_pw_pool%give_back_pw(rho_nlcc_g_xc)
634 DEALLOCATE (rho_nlcc_g_xc)
639 CALL timestop(handle)
657 xc_ener, xc_den, exc, vxc, vtau)
659 TYPE(qs_ks_env_type),
POINTER :: ks_env
660 TYPE(qs_rho_type),
POINTER :: rho_struct
661 TYPE(section_vals_type),
POINTER :: xc_section
662 TYPE(qs_dispersion_type),
OPTIONAL,
POINTER :: dispersion_env
663 TYPE(pw_r3d_rs_type),
INTENT(INOUT),
OPTIONAL :: xc_ener, xc_den
664 TYPE(pw_r3d_rs_type),
OPTIONAL :: exc
665 TYPE(pw_r3d_rs_type),
DIMENSION(:),
OPTIONAL :: vxc, vtau
667 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_xc_density'
669 INTEGER :: handle, ispin, mspin, myfun, nspins, vdw
670 LOGICAL :: rho_g_valid, tau_g_valid, tau_r_valid, &
672 REAL(kind=dp) :: edisp, excint, factor, rho_cutoff
673 REAL(kind=dp),
DIMENSION(3, 3) :: vdum
674 TYPE(cell_type),
POINTER :: cell
675 TYPE(dft_control_type),
POINTER :: dft_control
676 TYPE(mp_para_env_type),
POINTER :: para_env
677 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g, rho_struct_g, tau_g, tau_struct_g
678 TYPE(pw_c1d_gs_type),
POINTER :: rho_nlcc_g, rho_nlcc_g_use, rho_nlcc_g_xc
679 TYPE(pw_env_type),
POINTER :: pw_env
680 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool, vdw_pw_pool, xc_pw_pool
681 TYPE(pw_r3d_rs_type) :: exc_r
682 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, rho_struct_r, tau_r, &
683 tau_struct_r, vxc_rho, vxc_tau
684 TYPE(pw_r3d_rs_type),
POINTER :: rho_nlcc, rho_nlcc_use, rho_nlcc_xc, &
685 weights, weights_use, weights_xc
687 CALL timeset(routinen, handle)
689 NULLIFY (dft_control, pw_env, auxbas_pw_pool, xc_pw_pool, vdw_pw_pool, cell, &
690 rho_g, rho_struct_g, tau_g, tau_struct_g, rho_nlcc, rho_nlcc_g, &
691 rho_nlcc_g_use, rho_nlcc_g_xc, rho_nlcc_use, rho_nlcc_xc, rho_r, &
692 rho_struct_r, tau_r, tau_struct_r, vxc_rho, vxc_tau, weights, &
693 weights_use, weights_xc)
695 CALL get_ks_env(ks_env, &
696 dft_control=dft_control, &
699 xcint_weights=weights, &
701 rho_nlcc_g=rho_nlcc_g)
703 CALL qs_rho_get(rho_struct, &
704 tau_r_valid=tau_r_valid, &
705 tau_g_valid=tau_g_valid, &
706 rho_g_valid=rho_g_valid, &
707 rho_r=rho_struct_r, &
708 rho_g=rho_struct_g, &
709 tau_r=tau_struct_r, &
711 nspins = dft_control%nspins
712 mspin =
SIZE(rho_struct_r)
713 rho_r => rho_struct_r
714 rho_g => rho_struct_g
715 tau_r => tau_struct_r
716 tau_g => tau_struct_g
717 rho_nlcc_use => rho_nlcc
718 rho_nlcc_g_use => rho_nlcc_g
719 weights_use => weights
721 CALL section_vals_val_get(xc_section,
"XC_FUNCTIONAL%_SECTION_PARAMETERS_", i_val=myfun)
722 CALL section_vals_val_get(xc_section,
"VDW_POTENTIAL%POTENTIAL_TYPE", i_val=vdw)
723 vdw_nl = (vdw == xc_vdw_fun_nonloc)
724 IF (
PRESENT(xc_ener))
THEN
725 IF (tau_r_valid)
THEN
726 CALL cp_warn(__location__,
"Tau contribution will not be correctly handled")
730 CALL cp_warn(__location__,
"vdW functional contribution will be ignored")
733 CALL pw_env_get(pw_env, xc_pw_pool=xc_pw_pool, auxbas_pw_pool=auxbas_pw_pool)
734 uf_grid = .NOT. pw_grid_compare(auxbas_pw_pool%pw_grid, xc_pw_pool%pw_grid)
736 IF (
PRESENT(xc_ener))
THEN
737 CALL pw_zero(xc_ener)
739 IF (
PRESENT(xc_den))
THEN
742 IF (
PRESENT(exc))
THEN
745 IF (
PRESENT(vxc))
THEN
747 CALL pw_zero(vxc(ispin))
750 IF (
PRESENT(vtau))
THEN
752 CALL pw_zero(vtau(ispin))
756 IF (myfun /= xc_none)
THEN
758 cpassert(
ASSOCIATED(rho_struct))
759 cpassert(dft_control%sic_method_id == sic_none)
762 NULLIFY (rho_r, rho_g, tau_r, tau_g)
763 IF (rho_g_valid)
THEN
764 CALL create_density_on_pool(xc_pw_pool, rho_struct_g, rho_r, rho_g)
765 ELSE IF (
ASSOCIATED(rho_struct_r))
THEN
766 CALL create_density_on_pool_from_r(auxbas_pw_pool, xc_pw_pool, rho_struct_r, rho_r, rho_g)
768 cpabort(
"Fine Grid in qs_xc_density requires rho_r or rho_g")
770 IF (tau_r_valid)
THEN
771 IF (tau_g_valid)
THEN
772 CALL create_density_on_pool(xc_pw_pool, tau_struct_g, tau_r, tau_g)
773 ELSE IF (
ASSOCIATED(tau_struct_r))
THEN
774 CALL create_density_on_pool_from_r(auxbas_pw_pool, xc_pw_pool, tau_struct_r, tau_r, tau_g)
776 cpabort(
"Fine Grid in qs_xc_density requires tau_r or tau_g")
779 IF (
ASSOCIATED(weights))
THEN
780 ALLOCATE (weights_xc)
781 CALL xc_pw_pool%create_pw(weights_xc)
782 CALL transfer_rspace_between_pools(auxbas_pw_pool, xc_pw_pool, weights, weights_xc)
783 weights_use => weights_xc
785 IF (
ASSOCIATED(rho_nlcc))
THEN
786 cpassert(
ASSOCIATED(rho_nlcc_g))
787 ALLOCATE (rho_nlcc_g_xc, rho_nlcc_xc)
788 CALL xc_pw_pool%create_pw(rho_nlcc_g_xc)
789 CALL xc_pw_pool%create_pw(rho_nlcc_xc)
790 CALL pw_transfer(rho_nlcc_g, rho_nlcc_g_xc)
791 CALL pw_transfer(rho_nlcc_g_xc, rho_nlcc_xc)
792 rho_nlcc_use => rho_nlcc_xc
793 rho_nlcc_g_use => rho_nlcc_g_xc
798 IF (
ASSOCIATED(rho_nlcc_use))
THEN
801 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
802 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
805 NULLIFY (vxc_rho, vxc_tau)
806 CALL xc_vxc_pw_create(vxc_rho=vxc_rho, vxc_tau=vxc_tau, rho_r=rho_r, &
807 rho_g=rho_g, tau=tau_r, exc=excint, &
808 xc_section=xc_section, &
809 weights=weights_use, pw_pool=xc_pw_pool, &
810 compute_virial=.false., &
818 CALL get_ks_env(ks_env=ks_env, para_env=para_env)
820 cpassert(dft_control%sic_method_id == sic_none)
822 CALL pw_env_get(pw_env, vdw_pw_pool=vdw_pw_pool)
823 CALL calculate_dispersion_nonloc(vxc_rho, rho_r, rho_g, edisp, dispersion_env, &
824 .false., vdw_pw_pool, xc_pw_pool, para_env)
828 IF (
ASSOCIATED(rho_nlcc_use))
THEN
831 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
832 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
836 IF (
PRESENT(xc_den))
THEN
837 rho_cutoff = 1.e-14_dp
840 TYPE(pw_r3d_rs_type) :: tmp_pw
841 CALL xc_pw_pool%create_pw(tmp_pw)
842 CALL pw_copy(exc_r, tmp_pw)
843 CALL calc_xc_density(tmp_pw, rho_r, rho_cutoff)
844 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, tmp_pw, xc_den)
845 CALL xc_pw_pool%give_back_pw(tmp_pw)
848 CALL pw_copy(exc_r, xc_den)
849 CALL calc_xc_density(xc_den, rho_r, rho_cutoff)
852 IF (
PRESENT(xc_ener))
THEN
855 TYPE(pw_r3d_rs_type) :: tmp_pw
856 CALL xc_pw_pool%create_pw(tmp_pw)
857 CALL pw_copy(exc_r, tmp_pw)
859 CALL pw_multiply(tmp_pw, vxc_rho(ispin), rho_r(ispin), alpha=-1.0_dp)
861 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, tmp_pw, xc_ener)
862 CALL xc_pw_pool%give_back_pw(tmp_pw)
865 CALL pw_copy(exc_r, xc_ener)
867 CALL pw_multiply(xc_ener, vxc_rho(ispin), rho_r(ispin), alpha=-1.0_dp)
871 IF (
PRESENT(exc))
THEN
873 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, exc_r, exc)
875 CALL pw_copy(exc_r, exc)
878 IF (
PRESENT(vxc))
THEN
881 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, vxc_rho(ispin), vxc(ispin))
883 CALL pw_copy(vxc_rho(ispin), vxc(ispin))
887 IF (
PRESENT(vtau) .AND.
ASSOCIATED(vxc_tau))
THEN
890 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, vxc_tau(ispin), vtau(ispin))
892 CALL pw_copy(vxc_tau(ispin), vtau(ispin))
897 IF (
ASSOCIATED(vxc_rho))
THEN
899 CALL vxc_rho(ispin)%release()
903 IF (
ASSOCIATED(vxc_tau))
THEN
905 CALL vxc_tau(ispin)%release()
911 CALL give_back_density_on_pool(xc_pw_pool, rho_r, rho_g)
912 IF (
ASSOCIATED(tau_r))
CALL give_back_density_on_pool(xc_pw_pool, tau_r, tau_g)
913 IF (
ASSOCIATED(weights_xc))
THEN
914 CALL xc_pw_pool%give_back_pw(weights_xc)
915 DEALLOCATE (weights_xc)
917 IF (
ASSOCIATED(rho_nlcc_xc))
THEN
918 CALL xc_pw_pool%give_back_pw(rho_nlcc_xc)
919 DEALLOCATE (rho_nlcc_xc)
921 IF (
ASSOCIATED(rho_nlcc_g_xc))
THEN
922 CALL xc_pw_pool%give_back_pw(rho_nlcc_g_xc)
923 DEALLOCATE (rho_nlcc_g_xc)
929 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)
...