116 SUBROUTINE qs_vxc_create(ks_env, rho_struct, xc_section, vxc_rho, vxc_tau, exc, &
117 just_energy, edisp, dispersion_env, adiabatic_rescale_factor, &
118 pw_env_external, native_skala_atom_force, qs_env_external, &
119 native_gapw_composite_override, native_skala_defer_to_atom_composite)
125 REAL(kind=
dp),
INTENT(out) :: exc
126 LOGICAL,
INTENT(in),
OPTIONAL :: just_energy
127 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: edisp
129 REAL(kind=
dp),
INTENT(in),
OPTIONAL :: adiabatic_rescale_factor
130 TYPE(
pw_env_type),
OPTIONAL,
POINTER :: pw_env_external
131 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT), &
132 OPTIONAL :: native_skala_atom_force
134 LOGICAL,
INTENT(in),
OPTIONAL :: native_gapw_composite_override, &
135 native_skala_defer_to_atom_composite
137 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_vxc_create'
139 INTEGER :: handle, i, ispin, j, k, mspin, myfun, &
140 nelec_spin(2), np, output_unit, vdw
141 LOGICAL :: compute_virial, defer_native_skala_to_atom_composite, do_adiabatic_rescaling, &
142 my_just_energy, native_gapw_composite_direct_ao, native_gapw_composite_reference, &
143 native_grid_diagnostics, native_skala_grid, rho_g_valid, sic_scaling_b_zero, tau_g_valid, &
144 tau_r_valid, uf_grid, vdw_nl
145 REAL(kind=
dp) :: composite_hard_integral, composite_rho_max, composite_rho_min, &
146 composite_rho_r_integral, composite_soft_integral, composite_tau_max, composite_tau_min, &
147 composite_tau_r_integral, delta, direct_rho_integral, direct_tau_integral, exc_m, factor, &
148 my_adiabatic_rescale_factor, my_scaling, nelec_s_inv, q_max, rho_composite_hard, &
149 rho_composite_soft, rho_diff_l2, rho_diff_max, rho_ref_l2, tau_composite_hard, &
150 tau_composite_soft, tau_diff_l2, tau_diff_max, tau_ref_l2, volume
151 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: rhonl
152 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: drhonl
153 REAL(kind=
dp),
DIMENSION(3, 3) :: virial_xc_tmp
155 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
160 TYPE(
pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_direct_g, rho_g, rho_hard_g, &
161 rho_m_gspace, rho_smooth_g, rho_smooth_model_g, rho_struct_g, tau_direct_g, tau_hard_g, &
162 tau_smooth_g, tau_smooth_model_g, tau_struct_g
163 TYPE(
pw_c1d_gs_type),
POINTER :: rho_nlcc_g, rho_nlcc_g_use, rho_nlcc_g_xc
165 TYPE(
pw_pool_type),
POINTER :: auxbas_pw_pool, diagnostics_pw_pool, &
166 vdw_pw_pool, xc_pw_pool
168 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: my_vxc_rho, my_vxc_tau, rho_direct_r, &
169 rho_hard_r, rho_m_rspace, rho_r, rho_smooth_model_r, rho_smooth_r, rho_struct_r, tau, &
170 tau_direct_r, tau_hard_r, tau_smooth_model_r, tau_smooth_r, tau_struct_r
171 TYPE(
pw_r3d_rs_type),
POINTER :: rho_nlcc, rho_nlcc_use, rho_nlcc_xc, &
172 tmp_pw, weights, weights_use, &
177 CALL timeset(routinen, handle)
179 cpassert(.NOT.
ASSOCIATED(vxc_rho))
180 cpassert(.NOT.
ASSOCIATED(vxc_tau))
181 NULLIFY (dft_control, pw_env, auxbas_pw_pool, diagnostics_pw_pool, xc_pw_pool, vdw_pw_pool, &
183 tmp_pw, my_vxc_tau, rho_g, rho_r, tau, rho_m_rspace, &
184 rho_m_gspace, rho_nlcc, rho_nlcc_g, rho_nlcc_g_use, rho_nlcc_g_xc, &
185 rho_nlcc_use, rho_nlcc_xc, rho_struct_r, rho_struct_g, tau_struct_g, tau_struct_r, &
186 weights_use, weights_xc, particle_set, rho_ao_kp, rho_direct_g, rho_direct_r, &
187 rho_hard_g, rho_hard_r, rho_smooth_g, rho_smooth_model_g, rho_smooth_model_r, &
188 rho_smooth_r, tau_direct_g, tau_direct_r, tau_hard_g, tau_hard_r, tau_smooth_g, &
189 tau_smooth_model_g, tau_smooth_model_r, tau_smooth_r, gauxc_section)
192 my_just_energy = .false.
193 IF (
PRESENT(just_energy)) my_just_energy = just_energy
194 my_adiabatic_rescale_factor = 1.0_dp
195 do_adiabatic_rescaling = .false.
196 IF (
PRESENT(adiabatic_rescale_factor))
THEN
197 my_adiabatic_rescale_factor = adiabatic_rescale_factor
198 do_adiabatic_rescaling = .true.
202 dft_control=dft_control, &
206 particle_set=particle_set, &
207 xcint_weights=weights, &
210 rho_nlcc_g=rho_nlcc_g)
211 rho_nlcc_use => rho_nlcc
212 rho_nlcc_g_use => rho_nlcc_g
213 weights_use => weights
216 tau_r_valid=tau_r_valid, &
217 tau_g_valid=tau_g_valid, &
218 rho_g_valid=rho_g_valid, &
219 rho_r=rho_struct_r, &
220 rho_g=rho_struct_g, &
221 tau_g=tau_struct_g, &
223 rho_smooth_r => rho_struct_r
224 rho_smooth_g => rho_struct_g
225 tau_smooth_r => tau_struct_r
226 tau_smooth_g => tau_struct_g
228 compute_virial = virial%pv_calculate .AND. (.NOT. virial%pv_numer)
229 IF (compute_virial)
THEN
230 virial%pv_xc = 0.0_dp
240 cpassert(.NOT. (do_adiabatic_rescaling .AND. vdw_nl))
242 IF (.NOT. (
PRESENT(dispersion_env) .AND.
PRESENT(edisp)))
THEN
245 IF (
PRESENT(edisp)) edisp = 0.0_dp
247 defer_native_skala_to_atom_composite = .false.
248 IF (
PRESENT(native_skala_defer_to_atom_composite))
THEN
249 defer_native_skala_to_atom_composite = native_skala_defer_to_atom_composite
251 cpassert(.NOT. defer_native_skala_to_atom_composite .OR. native_skala_grid)
252 native_gapw_composite_reference = native_skala_grid .AND. &
254 (dft_control%qs_control%gapw .OR. &
255 dft_control%qs_control%gapw_xc)
256 IF (
PRESENT(native_gapw_composite_override))
THEN
257 native_gapw_composite_reference = native_skala_grid .AND. &
258 native_gapw_composite_override .AND. &
259 (dft_control%qs_control%gapw .OR. &
260 dft_control%qs_control%gapw_xc)
262 native_gapw_composite_direct_ao = native_gapw_composite_reference .AND. &
264 native_grid_diagnostics = .false.
265 IF (native_gapw_composite_reference)
THEN
267 cpassert(
ASSOCIATED(gauxc_section))
269 l_val=native_grid_diagnostics)
271 IF (native_gapw_composite_reference)
NULLIFY (weights_use)
273 IF (myfun /=
xc_none .OR. vdw_nl)
THEN
276 cpassert(
ASSOCIATED(rho_struct))
277 IF (dft_control%nspins /= 1 .AND. dft_control%nspins /= 2)
THEN
278 cpabort(
"nspins must be 1 or 2")
280 mspin =
SIZE(rho_struct_r)
281 IF (dft_control%nspins == 2 .AND. mspin == 1)
THEN
282 cpabort(
"Spin count mismatch")
292 SELECT CASE (dft_control%sic_method_id)
297 cpassert(.NOT. tau_r_valid)
299 my_scaling = 1.0_dp - dft_control%sic_scaling_b
301 cpassert(.NOT. tau_r_valid)
309 IF (dft_control%sic_scaling_b == 0.0_dp)
THEN
310 sic_scaling_b_zero = .true.
312 sic_scaling_b_zero = .false.
315 IF (
PRESENT(pw_env_external))
THEN
316 pw_env => pw_env_external
318 CALL pw_env_get(pw_env, xc_pw_pool=xc_pw_pool, auxbas_pw_pool=auxbas_pw_pool)
320 IF (native_gapw_composite_reference)
THEN
321 cpassert(tau_r_valid)
322 cpassert(
PRESENT(qs_env_external))
323 ALLOCATE (rho_hard_r(mspin), rho_hard_g(mspin), tau_hard_r(mspin), tau_hard_g(mspin))
325 CALL auxbas_pw_pool%create_pw(rho_hard_r(ispin))
326 CALL auxbas_pw_pool%create_pw(rho_hard_g(ispin))
327 CALL auxbas_pw_pool%create_pw(tau_hard_r(ispin))
328 CALL auxbas_pw_pool%create_pw(tau_hard_g(ispin))
330 IF (native_gapw_composite_direct_ao)
THEN
331 CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
332 cpassert(
ASSOCIATED(rho_ao_kp))
333 cpassert(
SIZE(rho_ao_kp, 2) == 1)
336 matrix_p=rho_ao_kp(ispin, 1)%matrix, rho=rho_hard_r(ispin), &
337 rho_gspace=rho_hard_g(ispin), ks_env=ks_env)
339 matrix_p=rho_ao_kp(ispin, 1)%matrix, rho=tau_hard_r(ispin), &
340 rho_gspace=tau_hard_g(ispin), ks_env=ks_env, compute_tau=.true.)
344 q_max = sqrt(maxval(rho_hard_g(1)%pw_grid%gsq))
346 qs_env=qs_env_external, auxbas_pw_pool=auxbas_pw_pool, &
347 rhotot_elec_gspace=rho_hard_g(1), q_max=q_max, &
348 rho_hard=composite_hard_integral, rho_soft=composite_soft_integral, &
349 rho_source=rho_struct, allow_nonorthorhombic=.true.)
350 rho_composite_hard = composite_hard_integral
351 rho_composite_soft = composite_soft_integral
353 qs_env=qs_env_external, auxbas_pw_pool=auxbas_pw_pool, &
354 rhotot_elec_gspace=tau_hard_g(1), q_max=q_max, &
355 rho_hard=composite_hard_integral, rho_soft=composite_soft_integral, &
356 compute_tau=.true., rho_source=rho_struct, allow_nonorthorhombic=.true.)
357 tau_composite_hard = composite_hard_integral
358 tau_composite_soft = composite_soft_integral
359 IF (para_env%mepos == 0)
THEN
361 IF (output_unit > 0)
THEN
362 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(1X,ES19.11))") &
363 "SKALA_GPW| Composite rho hard and soft integrals", &
364 rho_composite_hard, rho_composite_soft
365 WRITE (unit=output_unit, fmt=
"(T2,A,2(1X,ES19.11))") &
366 "SKALA_GPW| Composite tau hard and soft integrals", &
367 tau_composite_hard, tau_composite_soft
371 CALL pw_scale(rho_hard_g(1), 1.0_dp/volume)
372 CALL pw_scale(tau_hard_g(1), 1.0_dp/volume)
375 qs_env=qs_env_external, auxbas_pw_pool=auxbas_pw_pool, &
376 rhotot_elec_gspace=rho_hard_g(2), q_max=q_max, &
377 rho_hard=composite_hard_integral, rho_soft=composite_soft_integral, &
378 fsign=-1.0_dp, rho_source=rho_struct, allow_nonorthorhombic=.true.)
380 qs_env=qs_env_external, auxbas_pw_pool=auxbas_pw_pool, &
381 rhotot_elec_gspace=tau_hard_g(2), q_max=q_max, &
382 rho_hard=composite_hard_integral, rho_soft=composite_soft_integral, &
383 fsign=-1.0_dp, compute_tau=.true., rho_source=rho_struct, &
384 allow_nonorthorhombic=.true.)
385 CALL pw_scale(rho_hard_g(1), 0.5_dp/volume)
386 CALL pw_scale(rho_hard_g(2), 0.5_dp/volume)
387 CALL auxbas_pw_pool%create_pw(tmp_g)
388 CALL pw_copy(rho_hard_g(1), tmp_g)
389 CALL pw_axpy(rho_hard_g(2), rho_hard_g(1), 1.0_dp)
390 CALL pw_axpy(rho_hard_g(2), tmp_g, -1.0_dp)
391 CALL pw_copy(tmp_g, rho_hard_g(2))
392 CALL pw_scale(tau_hard_g(1), 0.5_dp/volume)
393 CALL pw_scale(tau_hard_g(2), 0.5_dp/volume)
394 CALL pw_copy(tau_hard_g(1), tmp_g)
395 CALL pw_axpy(tau_hard_g(2), tau_hard_g(1), 1.0_dp)
396 CALL pw_axpy(tau_hard_g(2), tmp_g, -1.0_dp)
397 CALL pw_copy(tmp_g, tau_hard_g(2))
398 CALL auxbas_pw_pool%give_back_pw(tmp_g)
402 CALL pw_transfer(rho_hard_g(ispin), rho_hard_r(ispin))
403 CALL pw_transfer(tau_hard_g(ispin), tau_hard_r(ispin))
405 IF (native_grid_diagnostics .AND. .NOT. native_gapw_composite_direct_ao)
THEN
406 CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
407 cpassert(
ASSOCIATED(rho_ao_kp))
408 cpassert(
SIZE(rho_ao_kp, 2) == 1)
409 ALLOCATE (rho_direct_r(mspin), rho_direct_g(mspin), &
410 tau_direct_r(mspin), tau_direct_g(mspin))
412 rho_diff_max = 0.0_dp
415 tau_diff_max = 0.0_dp
417 direct_rho_integral = 0.0_dp
418 direct_tau_integral = 0.0_dp
420 CALL auxbas_pw_pool%create_pw(rho_direct_r(ispin))
421 CALL auxbas_pw_pool%create_pw(rho_direct_g(ispin))
422 CALL auxbas_pw_pool%create_pw(tau_direct_r(ispin))
423 CALL auxbas_pw_pool%create_pw(tau_direct_g(ispin))
425 matrix_p=rho_ao_kp(ispin, 1)%matrix, rho=rho_direct_r(ispin), &
426 rho_gspace=rho_direct_g(ispin), ks_env=ks_env)
428 matrix_p=rho_ao_kp(ispin, 1)%matrix, rho=tau_direct_r(ispin), &
429 rho_gspace=tau_direct_g(ispin), ks_env=ks_env, compute_tau=.true.)
430 direct_rho_integral = direct_rho_integral + &
432 direct_tau_integral = direct_tau_integral + &
434 DO k = lbound(rho_direct_r(ispin)%array, 3), ubound(rho_direct_r(ispin)%array, 3)
435 DO j = lbound(rho_direct_r(ispin)%array, 2), ubound(rho_direct_r(ispin)%array, 2)
436 DO i = lbound(rho_direct_r(ispin)%array, 1), ubound(rho_direct_r(ispin)%array, 1)
437 delta = rho_hard_r(ispin)%array(i, j, k) - &
438 rho_direct_r(ispin)%array(i, j, k)
439 rho_diff_l2 = rho_diff_l2 + delta*delta
440 rho_diff_max = max(rho_diff_max, abs(delta))
441 rho_ref_l2 = rho_ref_l2 + rho_direct_r(ispin)%array(i, j, k)**2
442 delta = tau_hard_r(ispin)%array(i, j, k) - &
443 tau_direct_r(ispin)%array(i, j, k)
444 tau_diff_l2 = tau_diff_l2 + delta*delta
445 tau_diff_max = max(tau_diff_max, abs(delta))
446 tau_ref_l2 = tau_ref_l2 + tau_direct_r(ispin)%array(i, j, k)**2
451 CALL para_env%sum(rho_diff_l2)
452 CALL para_env%sum(rho_ref_l2)
453 CALL para_env%sum(tau_diff_l2)
454 CALL para_env%sum(tau_ref_l2)
455 CALL para_env%max(rho_diff_max)
456 CALL para_env%max(tau_diff_max)
457 rho_diff_l2 = sqrt(rho_diff_l2/max(rho_ref_l2, tiny(1.0_dp)))
458 tau_diff_l2 = sqrt(tau_diff_l2/max(tau_ref_l2, tiny(1.0_dp)))
459 IF (para_env%mepos == 0)
THEN
461 IF (output_unit > 0)
THEN
462 WRITE (unit=output_unit, fmt=
"(T2,A,2(1X,ES19.11))") &
463 "SKALA_GPW| Direct AO rho and tau integrals", &
464 direct_rho_integral, direct_tau_integral
465 WRITE (unit=output_unit, fmt=
"(T2,A,2(1X,ES19.11))") &
466 "SKALA_GPW| Composite/direct relative L2 rho and tau", &
467 rho_diff_l2, tau_diff_l2
468 WRITE (unit=output_unit, fmt=
"(T2,A,2(1X,ES19.11))") &
469 "SKALA_GPW| Composite/direct Linf rho and tau", &
470 rho_diff_max, tau_diff_max
474 CALL auxbas_pw_pool%give_back_pw(rho_direct_r(ispin))
475 CALL auxbas_pw_pool%give_back_pw(rho_direct_g(ispin))
476 CALL auxbas_pw_pool%give_back_pw(tau_direct_r(ispin))
477 CALL auxbas_pw_pool%give_back_pw(tau_direct_g(ispin))
479 DEALLOCATE (rho_direct_r, rho_direct_g, tau_direct_r, tau_direct_g)
481 composite_rho_r_integral = 0.0_dp
482 composite_tau_r_integral = 0.0_dp
483 composite_rho_min = huge(1.0_dp)
484 composite_rho_max = -huge(1.0_dp)
485 composite_tau_min = huge(1.0_dp)
486 composite_tau_max = -huge(1.0_dp)
488 composite_rho_r_integral = composite_rho_r_integral + &
490 composite_tau_r_integral = composite_tau_r_integral + &
492 composite_rho_min = min(composite_rho_min, minval(rho_hard_r(ispin)%array))
493 composite_rho_max = max(composite_rho_max, maxval(rho_hard_r(ispin)%array))
494 composite_tau_min = min(composite_tau_min, minval(tau_hard_r(ispin)%array))
495 composite_tau_max = max(composite_tau_max, maxval(tau_hard_r(ispin)%array))
497 CALL para_env%min(composite_rho_min)
498 CALL para_env%max(composite_rho_max)
499 CALL para_env%min(composite_tau_min)
500 CALL para_env%max(composite_tau_max)
501 IF (para_env%mepos == 0)
THEN
503 IF (output_unit > 0)
THEN
504 WRITE (unit=output_unit, fmt=
"(T2,A,1X,ES19.11)") &
505 "SKALA_GPW| Composite real-grid rho integral", composite_rho_r_integral
506 WRITE (unit=output_unit, fmt=
"(T2,A,1X,ES19.11)") &
507 "SKALA_GPW| Composite real-grid tau integral", composite_tau_r_integral
508 WRITE (unit=output_unit, fmt=
"(T2,A,2(1X,ES19.11))") &
509 "SKALA_GPW| Composite real-grid rho min and max", &
510 composite_rho_min, composite_rho_max
511 WRITE (unit=output_unit, fmt=
"(T2,A,2(1X,ES19.11))") &
512 "SKALA_GPW| Composite real-grid tau min and max", &
513 composite_tau_min, composite_tau_max
516 rho_struct_r => rho_hard_r
517 rho_struct_g => rho_hard_g
518 tau_struct_r => tau_hard_r
519 tau_struct_g => tau_hard_g
524 uf_grid = .NOT.
pw_grid_compare(auxbas_pw_pool%pw_grid, xc_pw_pool%pw_grid)
526 IF (.NOT. uf_grid)
THEN
527 rho_r => rho_struct_r
529 IF (tau_r_valid)
THEN
535 IF (rho_g_valid)
THEN
536 rho_g => rho_struct_g
539 cpassert(rho_g_valid)
540 ALLOCATE (rho_r(mspin))
541 ALLOCATE (rho_g(mspin))
543 CALL xc_pw_pool%create_pw(rho_g(ispin))
544 CALL pw_transfer(rho_struct_g(ispin), rho_g(ispin))
547 CALL xc_pw_pool%create_pw(rho_r(ispin))
550 IF (tau_r_valid)
THEN
551 ALLOCATE (tau(mspin))
553 CALL xc_pw_pool%create_pw(tau(ispin))
556 CALL xc_pw_pool%create_pw(tau_g_xc)
557 IF (tau_g_valid)
THEN
560 CALL auxbas_pw_pool%create_pw(tau_g_aux)
563 CALL auxbas_pw_pool%give_back_pw(tau_g_aux)
566 CALL xc_pw_pool%give_back_pw(tau_g_xc)
570 IF (
ASSOCIATED(weights) .AND. .NOT. native_gapw_composite_reference)
THEN
571 ALLOCATE (weights_xc)
572 CALL xc_pw_pool%create_pw(weights_xc)
575 CALL auxbas_pw_pool%create_pw(weights_g_aux)
576 CALL xc_pw_pool%create_pw(weights_g_xc)
580 CALL xc_pw_pool%give_back_pw(weights_g_xc)
581 CALL auxbas_pw_pool%give_back_pw(weights_g_aux)
583 weights_use => weights_xc
585 IF (
ASSOCIATED(rho_nlcc))
THEN
586 cpassert(
ASSOCIATED(rho_nlcc_g))
587 ALLOCATE (rho_nlcc_g_xc, rho_nlcc_xc)
588 CALL xc_pw_pool%create_pw(rho_nlcc_g_xc)
589 CALL xc_pw_pool%create_pw(rho_nlcc_xc)
590 CALL pw_transfer(rho_nlcc_g, rho_nlcc_g_xc)
591 CALL pw_transfer(rho_nlcc_g_xc, rho_nlcc_xc)
592 rho_nlcc_use => rho_nlcc_xc
593 rho_nlcc_g_use => rho_nlcc_g_xc
597 IF (native_gapw_composite_reference)
THEN
598 composite_rho_r_integral = 0.0_dp
599 composite_tau_r_integral = 0.0_dp
601 composite_rho_r_integral = composite_rho_r_integral + &
602 pw_integrate_function(rho_r(ispin))
603 composite_tau_r_integral = composite_tau_r_integral + &
604 pw_integrate_function(tau(ispin))
606 IF (para_env%mepos == 0)
THEN
607 output_unit = cp_logger_get_default_io_unit()
608 IF (output_unit > 0)
THEN
609 WRITE (unit=output_unit, fmt=
"(T2,A,1X,ES19.11)") &
610 "SKALA_GPW| Composite XC-grid rho integral", composite_rho_r_integral
611 WRITE (unit=output_unit, fmt=
"(T2,A,1X,ES19.11)") &
612 "SKALA_GPW| Composite XC-grid tau integral", composite_tau_r_integral
618 IF (
ASSOCIATED(rho_nlcc_use))
THEN
621 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
622 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
630 IF (defer_native_skala_to_atom_composite)
THEN
634 ALLOCATE (my_vxc_rho(mspin), my_vxc_tau(mspin))
636 CALL xc_pw_pool%create_pw(my_vxc_rho(ispin))
637 CALL xc_pw_pool%create_pw(my_vxc_tau(ispin))
638 CALL pw_zero(my_vxc_rho(ispin))
639 CALL pw_zero(my_vxc_tau(ispin))
641 ELSE IF (native_skala_grid)
THEN
642 CALL skala_gpw_eval(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, exc=exc, &
643 rho_r=rho_r, rho_g=rho_g, tau=tau, xc_section=xc_section, &
644 weights=weights_use, pw_pool=xc_pw_pool, &
645 particle_set=particle_set, cell=cell, &
646 compute_virial=compute_virial, virial_xc=virial%pv_xc, &
647 just_energy=my_just_energy, atom_force=native_skala_atom_force)
648 ELSE IF (my_just_energy)
THEN
649 exc = xc_exc_calc(rho_r=rho_r, tau=tau, &
650 rho_g=rho_g, xc_section=xc_section, &
651 weights=weights_use, pw_pool=xc_pw_pool)
654 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_r, &
655 rho_g=rho_g, tau=tau, exc=exc, &
656 xc_section=xc_section, &
657 weights=weights_use, pw_pool=xc_pw_pool, &
658 compute_virial=compute_virial, &
659 virial_xc=virial%pv_xc)
664 IF (native_gapw_composite_reference .AND. .NOT. my_just_energy)
THEN
666 diagnostics_pw_pool => xc_pw_pool
668 diagnostics_pw_pool => auxbas_pw_pool
670 CALL diagnostics_pw_pool%create_pw(tmp_g)
672 CALL pw_transfer(my_vxc_rho(ispin), tmp_g)
673 CALL pw_transfer(tmp_g, my_vxc_rho(ispin))
674 CALL pw_transfer(my_vxc_tau(ispin), tmp_g)
675 CALL pw_transfer(tmp_g, my_vxc_tau(ispin))
677 CALL diagnostics_pw_pool%give_back_pw(tmp_g)
678 NULLIFY (diagnostics_pw_pool)
681 IF (native_gapw_composite_reference .AND. native_grid_diagnostics .AND. &
682 .NOT. my_just_energy)
THEN
684 diagnostics_pw_pool => xc_pw_pool
686 diagnostics_pw_pool => auxbas_pw_pool
688 ALLOCATE (rho_smooth_model_g(mspin), rho_smooth_model_r(mspin), &
689 tau_smooth_model_g(mspin), tau_smooth_model_r(mspin))
691 CALL diagnostics_pw_pool%create_pw(rho_smooth_model_g(ispin))
692 CALL diagnostics_pw_pool%create_pw(rho_smooth_model_r(ispin))
693 CALL diagnostics_pw_pool%create_pw(tau_smooth_model_g(ispin))
694 CALL diagnostics_pw_pool%create_pw(tau_smooth_model_r(ispin))
696 IF (rho_g_valid)
THEN
697 CALL pw_transfer(rho_smooth_g(ispin), rho_smooth_model_g(ispin))
699 CALL auxbas_pw_pool%create_pw(tmp_g)
700 CALL pw_transfer(rho_smooth_r(ispin), tmp_g)
701 CALL pw_transfer(tmp_g, rho_smooth_model_g(ispin))
702 CALL auxbas_pw_pool%give_back_pw(tmp_g)
704 IF (tau_g_valid)
THEN
705 CALL pw_transfer(tau_smooth_g(ispin), tau_smooth_model_g(ispin))
707 CALL auxbas_pw_pool%create_pw(tmp_g)
708 CALL pw_transfer(tau_smooth_r(ispin), tmp_g)
709 CALL pw_transfer(tmp_g, tau_smooth_model_g(ispin))
710 CALL auxbas_pw_pool%give_back_pw(tmp_g)
713 IF (rho_g_valid)
THEN
714 CALL pw_copy(rho_smooth_g(ispin), rho_smooth_model_g(ispin))
716 CALL pw_transfer(rho_smooth_r(ispin), rho_smooth_model_g(ispin))
718 IF (tau_g_valid)
THEN
719 CALL pw_copy(tau_smooth_g(ispin), tau_smooth_model_g(ispin))
721 CALL pw_transfer(tau_smooth_r(ispin), tau_smooth_model_g(ispin))
724 CALL pw_transfer(rho_smooth_model_g(ispin), rho_smooth_model_r(ispin))
725 CALL pw_transfer(tau_smooth_model_g(ispin), tau_smooth_model_r(ispin))
726 IF (
ASSOCIATED(rho_nlcc_use))
THEN
727 CALL pw_axpy(rho_nlcc_use, rho_smooth_model_r(ispin), 1.0_dp)
728 CALL pw_axpy(rho_nlcc_g_use, rho_smooth_model_g(ispin), 1.0_dp)
731 CALL diagnose_gapw_composite_direction( &
732 rho_r, rho_g, tau, rho_smooth_model_r, rho_smooth_model_g, &
733 tau_smooth_model_r, my_vxc_rho, my_vxc_tau, xc_section, weights_use, &
734 diagnostics_pw_pool, particle_set, cell, para_env)
736 CALL diagnostics_pw_pool%give_back_pw(rho_smooth_model_g(ispin))
737 CALL diagnostics_pw_pool%give_back_pw(rho_smooth_model_r(ispin))
738 CALL diagnostics_pw_pool%give_back_pw(tau_smooth_model_g(ispin))
739 CALL diagnostics_pw_pool%give_back_pw(tau_smooth_model_r(ispin))
741 DEALLOCATE (rho_smooth_model_g, rho_smooth_model_r, &
742 tau_smooth_model_g, tau_smooth_model_r)
743 NULLIFY (diagnostics_pw_pool)
751 CALL get_ks_env(ks_env=ks_env, para_env=para_env)
753 cpassert(dft_control%sic_method_id == sic_none)
755 CALL pw_env_get(pw_env, vdw_pw_pool=vdw_pw_pool)
756 np = vdw_pw_pool%pw_grid%ngpts_local
757 ALLOCATE (rhonl(np), drhonl(np, 3))
758 CALL prepare_nlvdw_density(rho_r, rhonl, drhonl, vdw_pw_pool, xc_pw_pool)
759 IF (my_just_energy)
THEN
760 CALL calculate_vxc_nlvdw(vxcnl, rhonl, drhonl, edisp, dispersion_env, &
761 my_just_energy, vdw_pw_pool, para_env)
763 CALL vdw_pw_pool%create_pw(vxcnl)
764 CALL calculate_vxc_nlvdw(vxcnl, rhonl, drhonl, edisp, dispersion_env, &
765 my_just_energy, vdw_pw_pool, para_env, virial=virial)
766 CALL return_nlvdw_potential(my_vxc_rho, vxcnl, vdw_pw_pool, xc_pw_pool)
767 CALL vdw_pw_pool%give_back_pw(vxcnl)
769 DEALLOCATE (rhonl, drhonl)
773 IF (
ASSOCIATED(rho_nlcc_use))
THEN
776 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
777 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
782 IF (.NOT. my_just_energy)
THEN
783 IF (do_adiabatic_rescaling)
THEN
784 IF (
ASSOCIATED(my_vxc_rho))
THEN
785 DO ispin = 1,
SIZE(my_vxc_rho)
786 CALL pw_scale(my_vxc_rho(ispin), my_adiabatic_rescale_factor)
792 IF (my_scaling /= 1.0_dp)
THEN
794 IF (
ASSOCIATED(my_vxc_rho))
THEN
795 DO ispin = 1,
SIZE(my_vxc_rho)
796 CALL pw_scale(my_vxc_rho(ispin), my_scaling)
799 IF (
ASSOCIATED(my_vxc_tau))
THEN
800 DO ispin = 1,
SIZE(my_vxc_tau)
801 CALL pw_scale(my_vxc_tau(ispin), my_scaling)
808 IF (
ASSOCIATED(my_vxc_rho))
THEN
809 vxc_rho => my_vxc_rho
812 IF (
ASSOCIATED(my_vxc_tau))
THEN
813 vxc_tau => my_vxc_tau
817 DO ispin = 1,
SIZE(rho_r)
818 CALL xc_pw_pool%give_back_pw(rho_r(ispin))
821 IF (
ASSOCIATED(rho_g))
THEN
822 DO ispin = 1,
SIZE(rho_g)
823 CALL xc_pw_pool%give_back_pw(rho_g(ispin))
830 IF (dft_control%sic_method_id == sic_mauri_spz .AND. .NOT. sic_scaling_b_zero)
THEN
831 ALLOCATE (rho_m_rspace(2), rho_m_gspace(2))
832 CALL xc_pw_pool%create_pw(rho_m_gspace(1))
833 CALL xc_pw_pool%create_pw(rho_m_rspace(1))
834 CALL pw_copy(rho_struct_r(1), rho_m_rspace(1))
835 CALL pw_axpy(rho_struct_r(2), rho_m_rspace(1), alpha=-1._dp)
836 CALL pw_copy(rho_struct_g(1), rho_m_gspace(1))
837 CALL pw_axpy(rho_struct_g(2), rho_m_gspace(1), alpha=-1._dp)
839 CALL xc_pw_pool%create_pw(rho_m_gspace(2))
840 CALL xc_pw_pool%create_pw(rho_m_rspace(2))
841 CALL pw_zero(rho_m_rspace(2))
842 CALL pw_zero(rho_m_gspace(2))
844 IF (my_just_energy)
THEN
845 exc_m = xc_exc_calc(rho_r=rho_m_rspace, tau=tau, &
846 rho_g=rho_m_gspace, xc_section=xc_section, &
847 weights=weights_use, pw_pool=xc_pw_pool)
850 cpassert(.NOT. compute_virial)
851 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_m_rspace, &
852 rho_g=rho_m_gspace, tau=tau, exc=exc_m, &
853 xc_section=xc_section, &
854 weights=weights_use, pw_pool=xc_pw_pool, &
855 compute_virial=.false., &
856 virial_xc=virial_xc_tmp)
859 exc = exc - dft_control%sic_scaling_b*exc_m
862 IF (.NOT. my_just_energy)
THEN
863 CALL pw_axpy(my_vxc_rho(1), vxc_rho(1), -dft_control%sic_scaling_b)
864 CALL pw_axpy(my_vxc_rho(1), vxc_rho(2), dft_control%sic_scaling_b)
865 CALL my_vxc_rho(1)%release()
866 CALL my_vxc_rho(2)%release()
867 DEALLOCATE (my_vxc_rho)
871 CALL xc_pw_pool%give_back_pw(rho_m_rspace(ispin))
872 CALL xc_pw_pool%give_back_pw(rho_m_gspace(ispin))
874 DEALLOCATE (rho_m_rspace)
875 DEALLOCATE (rho_m_gspace)
880 IF (dft_control%sic_method_id == sic_ad .AND. .NOT. sic_scaling_b_zero)
THEN
883 CALL get_ks_env(ks_env, nelectron_spin=nelec_spin)
885 ALLOCATE (rho_m_rspace(2), rho_m_gspace(2))
887 CALL xc_pw_pool%create_pw(rho_m_gspace(ispin))
888 CALL xc_pw_pool%create_pw(rho_m_rspace(ispin))
892 IF (nelec_spin(ispin) > 0.0_dp)
THEN
893 nelec_s_inv = 1.0_dp/nelec_spin(ispin)
898 CALL pw_copy(rho_struct_r(ispin), rho_m_rspace(1))
899 CALL pw_copy(rho_struct_g(ispin), rho_m_gspace(1))
900 CALL pw_scale(rho_m_rspace(1), nelec_s_inv)
901 CALL pw_scale(rho_m_gspace(1), nelec_s_inv)
902 CALL pw_zero(rho_m_rspace(2))
903 CALL pw_zero(rho_m_gspace(2))
905 IF (my_just_energy)
THEN
906 exc_m = xc_exc_calc(rho_r=rho_m_rspace, tau=tau, &
907 rho_g=rho_m_gspace, xc_section=xc_section, &
908 weights=weights_use, pw_pool=xc_pw_pool)
911 cpassert(.NOT. compute_virial)
912 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_m_rspace, &
913 rho_g=rho_m_gspace, tau=tau, exc=exc_m, &
914 xc_section=xc_section, &
915 weights=weights_use, pw_pool=xc_pw_pool, &
916 compute_virial=.false., &
917 virial_xc=virial_xc_tmp)
920 exc = exc - dft_control%sic_scaling_b*nelec_spin(ispin)*exc_m
923 IF (.NOT. my_just_energy)
THEN
924 CALL pw_axpy(my_vxc_rho(1), vxc_rho(ispin), -dft_control%sic_scaling_b)
925 CALL my_vxc_rho(1)%release()
926 CALL my_vxc_rho(2)%release()
927 DEALLOCATE (my_vxc_rho)
932 CALL xc_pw_pool%give_back_pw(rho_m_rspace(ispin))
933 CALL xc_pw_pool%give_back_pw(rho_m_gspace(ispin))
935 DEALLOCATE (rho_m_rspace)
936 DEALLOCATE (rho_m_gspace)
941 IF (dft_control%sic_method_id == sic_mauri_us .AND. .NOT. sic_scaling_b_zero)
THEN
943 rho_r(1) = rho_struct_r(2)
944 rho_r(2) = rho_struct_r(2)
945 IF (rho_g_valid)
THEN
947 rho_g(1) = rho_struct_g(2)
948 rho_g(2) = rho_struct_g(2)
951 IF (my_just_energy)
THEN
952 exc_m = xc_exc_calc(rho_r=rho_r, tau=tau, &
953 rho_g=rho_g, xc_section=xc_section, &
954 weights=weights_use, pw_pool=xc_pw_pool)
957 cpassert(.NOT. compute_virial)
958 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_r, &
959 rho_g=rho_g, tau=tau, exc=exc_m, &
960 xc_section=xc_section, &
961 weights=weights_use, pw_pool=xc_pw_pool, &
962 compute_virial=.false., &
963 virial_xc=virial_xc_tmp)
966 exc = exc + dft_control%sic_scaling_b*exc_m
969 IF (.NOT. my_just_energy)
THEN
971 CALL pw_axpy(my_vxc_rho(1), vxc_rho(2), 2.0_dp*dft_control%sic_scaling_b)
972 CALL my_vxc_rho(1)%release()
973 CALL my_vxc_rho(2)%release()
974 DEALLOCATE (my_vxc_rho)
976 DEALLOCATE (rho_r, rho_g)
983 IF (uf_grid .AND. (
ASSOCIATED(vxc_rho) .OR.
ASSOCIATED(vxc_tau)))
THEN
985 TYPE(pw_r3d_rs_type) :: tmp_pw
986 TYPE(pw_c1d_gs_type) :: tmp_g, tmp_g2
987 CALL xc_pw_pool%create_pw(tmp_g)
988 CALL auxbas_pw_pool%create_pw(tmp_g2)
989 IF (
ASSOCIATED(vxc_rho))
THEN
990 DO ispin = 1,
SIZE(vxc_rho)
991 CALL auxbas_pw_pool%create_pw(tmp_pw)
992 CALL pw_transfer(vxc_rho(ispin), tmp_g)
993 CALL pw_transfer(tmp_g, tmp_g2)
994 CALL pw_transfer(tmp_g2, tmp_pw)
995 CALL xc_pw_pool%give_back_pw(vxc_rho(ispin))
996 vxc_rho(ispin) = tmp_pw
999 IF (
ASSOCIATED(vxc_tau))
THEN
1000 DO ispin = 1,
SIZE(vxc_tau)
1001 CALL auxbas_pw_pool%create_pw(tmp_pw)
1002 CALL pw_transfer(vxc_tau(ispin), tmp_g)
1003 CALL pw_transfer(tmp_g, tmp_g2)
1004 CALL pw_transfer(tmp_g2, tmp_pw)
1005 CALL xc_pw_pool%give_back_pw(vxc_tau(ispin))
1006 vxc_tau(ispin) = tmp_pw
1009 CALL auxbas_pw_pool%give_back_pw(tmp_g2)
1010 CALL xc_pw_pool%give_back_pw(tmp_g)
1013 IF (
ASSOCIATED(tau) .AND. uf_grid)
THEN
1014 DO ispin = 1,
SIZE(tau)
1015 CALL xc_pw_pool%give_back_pw(tau(ispin))
1019 IF (
ASSOCIATED(weights_xc))
THEN
1020 CALL xc_pw_pool%give_back_pw(weights_xc)
1021 DEALLOCATE (weights_xc)
1023 IF (
ASSOCIATED(rho_nlcc_xc))
THEN
1024 CALL xc_pw_pool%give_back_pw(rho_nlcc_xc)
1025 DEALLOCATE (rho_nlcc_xc)
1027 IF (
ASSOCIATED(rho_nlcc_g_xc))
THEN
1028 CALL xc_pw_pool%give_back_pw(rho_nlcc_g_xc)
1029 DEALLOCATE (rho_nlcc_g_xc)
1032 IF (
ASSOCIATED(rho_hard_r))
THEN
1033 DO ispin = 1,
SIZE(rho_hard_r)
1034 CALL auxbas_pw_pool%give_back_pw(rho_hard_r(ispin))
1035 CALL auxbas_pw_pool%give_back_pw(rho_hard_g(ispin))
1036 CALL auxbas_pw_pool%give_back_pw(tau_hard_r(ispin))
1037 CALL auxbas_pw_pool%give_back_pw(tau_hard_g(ispin))
1039 DEALLOCATE (rho_hard_r, rho_hard_g, tau_hard_r, tau_hard_g)
1044 CALL timestop(handle)
1231 xc_ener, xc_den, exc, vxc, vtau)
1233 TYPE(qs_ks_env_type),
POINTER :: ks_env
1234 TYPE(qs_rho_type),
POINTER :: rho_struct
1235 TYPE(section_vals_type),
POINTER :: xc_section
1236 TYPE(qs_dispersion_type),
OPTIONAL,
POINTER :: dispersion_env
1237 TYPE(pw_r3d_rs_type),
INTENT(INOUT),
OPTIONAL :: xc_ener, xc_den
1238 TYPE(pw_r3d_rs_type),
OPTIONAL :: exc
1239 TYPE(pw_r3d_rs_type),
DIMENSION(:),
OPTIONAL :: vxc, vtau
1241 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_xc_density'
1243 INTEGER :: handle, ispin, mspin, myfun, np, nspins, &
1245 LOGICAL :: rho_g_valid, tau_g_valid, tau_r_valid, &
1247 REAL(kind=dp) :: edisp, excint, factor, rho_cutoff
1248 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: rhonl
1249 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :) :: drhonl
1250 REAL(kind=dp),
DIMENSION(3, 3) :: vdum
1251 TYPE(cell_type),
POINTER :: cell
1252 TYPE(dft_control_type),
POINTER :: dft_control
1253 TYPE(mp_para_env_type),
POINTER :: para_env
1254 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g, rho_struct_g, tau_g, tau_struct_g
1255 TYPE(pw_c1d_gs_type),
POINTER :: rho_nlcc_g, rho_nlcc_g_use, rho_nlcc_g_xc
1256 TYPE(pw_env_type),
POINTER :: pw_env
1257 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool, vdw_pw_pool, xc_pw_pool
1258 TYPE(pw_r3d_rs_type) :: exc_r, vxcnl
1259 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, rho_struct_r, tau_r, &
1260 tau_struct_r, vxc_rho, vxc_tau
1261 TYPE(pw_r3d_rs_type),
POINTER :: rho_nlcc, rho_nlcc_use, rho_nlcc_xc, &
1262 weights, weights_use, weights_xc
1264 CALL timeset(routinen, handle)
1266 NULLIFY (dft_control, pw_env, auxbas_pw_pool, xc_pw_pool, vdw_pw_pool, cell, &
1267 rho_g, rho_struct_g, tau_g, tau_struct_g, rho_nlcc, rho_nlcc_g, &
1268 rho_nlcc_g_use, rho_nlcc_g_xc, rho_nlcc_use, rho_nlcc_xc, rho_r, &
1269 rho_struct_r, tau_r, tau_struct_r, vxc_rho, vxc_tau, weights, &
1270 weights_use, weights_xc)
1272 CALL get_ks_env(ks_env, &
1273 dft_control=dft_control, &
1276 xcint_weights=weights, &
1277 rho_nlcc=rho_nlcc, &
1278 rho_nlcc_g=rho_nlcc_g)
1280 CALL qs_rho_get(rho_struct, &
1281 tau_r_valid=tau_r_valid, &
1282 tau_g_valid=tau_g_valid, &
1283 rho_g_valid=rho_g_valid, &
1284 rho_r=rho_struct_r, &
1285 rho_g=rho_struct_g, &
1286 tau_r=tau_struct_r, &
1288 nspins = dft_control%nspins
1289 mspin =
SIZE(rho_struct_r)
1290 rho_r => rho_struct_r
1291 rho_g => rho_struct_g
1292 tau_r => tau_struct_r
1293 tau_g => tau_struct_g
1294 rho_nlcc_use => rho_nlcc
1295 rho_nlcc_g_use => rho_nlcc_g
1296 weights_use => weights
1298 CALL section_vals_val_get(xc_section,
"XC_FUNCTIONAL%_SECTION_PARAMETERS_", i_val=myfun)
1299 CALL section_vals_val_get(xc_section,
"VDW_POTENTIAL%POTENTIAL_TYPE", i_val=vdw)
1300 vdw_nl = (vdw == xc_vdw_fun_nonloc)
1301 IF (
PRESENT(xc_ener))
THEN
1302 IF (tau_r_valid)
THEN
1303 CALL cp_warn(__location__,
"Tau contribution will not be correctly handled")
1307 CALL cp_warn(__location__,
"vdW functional contribution will be ignored")
1310 CALL pw_env_get(pw_env, xc_pw_pool=xc_pw_pool, auxbas_pw_pool=auxbas_pw_pool)
1311 uf_grid = .NOT. pw_grid_compare(auxbas_pw_pool%pw_grid, xc_pw_pool%pw_grid)
1313 IF (
PRESENT(xc_ener))
THEN
1314 CALL pw_zero(xc_ener)
1316 IF (
PRESENT(xc_den))
THEN
1317 CALL pw_zero(xc_den)
1319 IF (
PRESENT(exc))
THEN
1322 IF (
PRESENT(vxc))
THEN
1323 DO ispin = 1, nspins
1324 CALL pw_zero(vxc(ispin))
1327 IF (
PRESENT(vtau))
THEN
1328 DO ispin = 1, nspins
1329 CALL pw_zero(vtau(ispin))
1333 IF (myfun /= xc_none)
THEN
1335 cpassert(
ASSOCIATED(rho_struct))
1336 cpassert(dft_control%sic_method_id == sic_none)
1339 NULLIFY (rho_r, rho_g, tau_r, tau_g)
1340 IF (rho_g_valid)
THEN
1341 CALL create_density_on_pool(xc_pw_pool, rho_struct_g, rho_r, rho_g)
1342 ELSE IF (
ASSOCIATED(rho_struct_r))
THEN
1343 CALL create_density_on_pool_from_r(auxbas_pw_pool, xc_pw_pool, rho_struct_r, rho_r, rho_g)
1345 cpabort(
"Fine Grid in qs_xc_density requires rho_r or rho_g")
1347 IF (tau_r_valid)
THEN
1348 IF (tau_g_valid)
THEN
1349 CALL create_density_on_pool(xc_pw_pool, tau_struct_g, tau_r, tau_g)
1350 ELSE IF (
ASSOCIATED(tau_struct_r))
THEN
1351 CALL create_density_on_pool_from_r(auxbas_pw_pool, xc_pw_pool, tau_struct_r, tau_r, tau_g)
1353 cpabort(
"Fine Grid in qs_xc_density requires tau_r or tau_g")
1356 IF (
ASSOCIATED(weights))
THEN
1357 ALLOCATE (weights_xc)
1358 CALL xc_pw_pool%create_pw(weights_xc)
1359 CALL transfer_rspace_between_pools(auxbas_pw_pool, xc_pw_pool, weights, weights_xc)
1360 weights_use => weights_xc
1362 IF (
ASSOCIATED(rho_nlcc))
THEN
1363 cpassert(
ASSOCIATED(rho_nlcc_g))
1364 ALLOCATE (rho_nlcc_g_xc, rho_nlcc_xc)
1365 CALL xc_pw_pool%create_pw(rho_nlcc_g_xc)
1366 CALL xc_pw_pool%create_pw(rho_nlcc_xc)
1367 CALL pw_transfer(rho_nlcc_g, rho_nlcc_g_xc)
1368 CALL pw_transfer(rho_nlcc_g_xc, rho_nlcc_xc)
1369 rho_nlcc_use => rho_nlcc_xc
1370 rho_nlcc_g_use => rho_nlcc_g_xc
1375 IF (
ASSOCIATED(rho_nlcc_use))
THEN
1378 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
1379 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
1382 NULLIFY (vxc_rho, vxc_tau)
1383 CALL xc_vxc_pw_create(vxc_rho=vxc_rho, vxc_tau=vxc_tau, rho_r=rho_r, &
1384 rho_g=rho_g, tau=tau_r, exc=excint, &
1385 xc_section=xc_section, &
1386 weights=weights_use, pw_pool=xc_pw_pool, &
1387 compute_virial=.false., &
1395 CALL get_ks_env(ks_env=ks_env, para_env=para_env)
1397 cpassert(dft_control%sic_method_id == sic_none)
1399 CALL pw_env_get(pw_env, vdw_pw_pool=vdw_pw_pool)
1400 np = vdw_pw_pool%pw_grid%ngpts_local
1401 ALLOCATE (rhonl(np), drhonl(np, 3))
1402 CALL prepare_nlvdw_density(rho_r, rhonl, drhonl, vdw_pw_pool, xc_pw_pool)
1403 CALL vdw_pw_pool%create_pw(vxcnl)
1404 CALL calculate_vxc_nlvdw(vxcnl, rhonl, drhonl, edisp, dispersion_env, &
1405 .false., vdw_pw_pool, para_env)
1406 CALL return_nlvdw_potential(vxc_rho, vxcnl, vdw_pw_pool, xc_pw_pool)
1407 CALL vdw_pw_pool%give_back_pw(vxcnl)
1408 DEALLOCATE (rhonl, drhonl)
1412 IF (
ASSOCIATED(rho_nlcc_use))
THEN
1415 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
1416 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
1420 IF (
PRESENT(xc_den))
THEN
1421 rho_cutoff = 1.e-14_dp
1424 TYPE(pw_r3d_rs_type) :: tmp_pw
1425 CALL xc_pw_pool%create_pw(tmp_pw)
1426 CALL pw_copy(exc_r, tmp_pw)
1427 CALL calc_xc_density(tmp_pw, rho_r, rho_cutoff)
1428 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, tmp_pw, xc_den)
1429 CALL xc_pw_pool%give_back_pw(tmp_pw)
1432 CALL pw_copy(exc_r, xc_den)
1433 CALL calc_xc_density(xc_den, rho_r, rho_cutoff)
1436 IF (
PRESENT(xc_ener))
THEN
1439 TYPE(pw_r3d_rs_type) :: tmp_pw
1440 CALL xc_pw_pool%create_pw(tmp_pw)
1441 CALL pw_copy(exc_r, tmp_pw)
1442 DO ispin = 1, nspins
1443 CALL pw_multiply(tmp_pw, vxc_rho(ispin), rho_r(ispin), alpha=-1.0_dp)
1445 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, tmp_pw, xc_ener)
1446 CALL xc_pw_pool%give_back_pw(tmp_pw)
1449 CALL pw_copy(exc_r, xc_ener)
1450 DO ispin = 1, nspins
1451 CALL pw_multiply(xc_ener, vxc_rho(ispin), rho_r(ispin), alpha=-1.0_dp)
1455 IF (
PRESENT(exc))
THEN
1457 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, exc_r, exc)
1459 CALL pw_copy(exc_r, exc)
1462 IF (
PRESENT(vxc))
THEN
1463 DO ispin = 1, nspins
1465 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, vxc_rho(ispin), vxc(ispin))
1467 CALL pw_copy(vxc_rho(ispin), vxc(ispin))
1471 IF (
PRESENT(vtau) .AND.
ASSOCIATED(vxc_tau))
THEN
1472 DO ispin = 1, nspins
1474 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, vxc_tau(ispin), vtau(ispin))
1476 CALL pw_copy(vxc_tau(ispin), vtau(ispin))
1481 IF (
ASSOCIATED(vxc_rho))
THEN
1482 DO ispin = 1, nspins
1483 CALL vxc_rho(ispin)%release()
1485 DEALLOCATE (vxc_rho)
1487 IF (
ASSOCIATED(vxc_tau))
THEN
1488 DO ispin = 1, nspins
1489 CALL vxc_tau(ispin)%release()
1491 DEALLOCATE (vxc_tau)
1493 CALL exc_r%release()
1495 CALL give_back_density_on_pool(xc_pw_pool, rho_r, rho_g)
1496 IF (
ASSOCIATED(tau_r))
CALL give_back_density_on_pool(xc_pw_pool, tau_r, tau_g)
1497 IF (
ASSOCIATED(weights_xc))
THEN
1498 CALL xc_pw_pool%give_back_pw(weights_xc)
1499 DEALLOCATE (weights_xc)
1501 IF (
ASSOCIATED(rho_nlcc_xc))
THEN
1502 CALL xc_pw_pool%give_back_pw(rho_nlcc_xc)
1503 DEALLOCATE (rho_nlcc_xc)
1505 IF (
ASSOCIATED(rho_nlcc_g_xc))
THEN
1506 CALL xc_pw_pool%give_back_pw(rho_nlcc_g_xc)
1507 DEALLOCATE (rho_nlcc_g_xc)
1513 CALL timestop(handle)