114 SUBROUTINE qs_vxc_create(ks_env, rho_struct, xc_section, vxc_rho, vxc_tau, exc, &
115 just_energy, edisp, dispersion_env, adiabatic_rescale_factor, &
116 pw_env_external, native_skala_atom_force, qs_env_external, &
117 native_gapw_composite_override, native_skala_defer_to_atom_composite)
123 REAL(kind=
dp),
INTENT(out) :: exc
124 LOGICAL,
INTENT(in),
OPTIONAL :: just_energy
125 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: edisp
127 REAL(kind=
dp),
INTENT(in),
OPTIONAL :: adiabatic_rescale_factor
128 TYPE(
pw_env_type),
OPTIONAL,
POINTER :: pw_env_external
129 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT), &
130 OPTIONAL :: native_skala_atom_force
132 LOGICAL,
INTENT(in),
OPTIONAL :: native_gapw_composite_override, &
133 native_skala_defer_to_atom_composite
135 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_vxc_create'
137 INTEGER :: handle, i, ispin, j, k, mspin, myfun, &
138 nelec_spin(2), output_unit, vdw
139 LOGICAL :: compute_virial, defer_native_skala_to_atom_composite, do_adiabatic_rescaling, &
140 my_just_energy, native_gapw_composite_direct_ao, native_gapw_composite_reference, &
141 native_grid_diagnostics, native_skala_grid, rho_g_valid, sic_scaling_b_zero, tau_g_valid, &
142 tau_r_valid, uf_grid, vdw_nl
143 REAL(kind=
dp) :: composite_hard_integral, composite_rho_max, composite_rho_min, &
144 composite_rho_r_integral, composite_soft_integral, composite_tau_max, composite_tau_min, &
145 composite_tau_r_integral, delta, direct_rho_integral, direct_tau_integral, exc_m, factor, &
146 my_adiabatic_rescale_factor, my_scaling, nelec_s_inv, q_max, rho_composite_hard, &
147 rho_composite_soft, rho_diff_l2, rho_diff_max, rho_ref_l2, tau_composite_hard, &
148 tau_composite_soft, tau_diff_l2, tau_diff_max, tau_ref_l2, volume
149 REAL(kind=
dp),
DIMENSION(3, 3) :: virial_xc_tmp
151 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
156 TYPE(
pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_direct_g, rho_g, rho_hard_g, &
157 rho_m_gspace, rho_smooth_g, rho_smooth_model_g, rho_struct_g, tau_direct_g, tau_hard_g, &
158 tau_smooth_g, tau_smooth_model_g, tau_struct_g
159 TYPE(
pw_c1d_gs_type),
POINTER :: rho_nlcc_g, rho_nlcc_g_use, rho_nlcc_g_xc
161 TYPE(
pw_pool_type),
POINTER :: auxbas_pw_pool, diagnostics_pw_pool, &
162 vdw_pw_pool, xc_pw_pool
163 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: my_vxc_rho, my_vxc_tau, rho_direct_r, &
164 rho_hard_r, rho_m_rspace, rho_r, rho_smooth_model_r, rho_smooth_r, rho_struct_r, tau, &
165 tau_direct_r, tau_hard_r, tau_smooth_model_r, tau_smooth_r, tau_struct_r
166 TYPE(
pw_r3d_rs_type),
POINTER :: rho_nlcc, rho_nlcc_use, rho_nlcc_xc, &
167 tmp_pw, weights, weights_use, &
172 CALL timeset(routinen, handle)
174 cpassert(.NOT.
ASSOCIATED(vxc_rho))
175 cpassert(.NOT.
ASSOCIATED(vxc_tau))
176 NULLIFY (dft_control, pw_env, auxbas_pw_pool, diagnostics_pw_pool, xc_pw_pool, vdw_pw_pool, &
178 tmp_pw, my_vxc_tau, rho_g, rho_r, tau, rho_m_rspace, &
179 rho_m_gspace, rho_nlcc, rho_nlcc_g, rho_nlcc_g_use, rho_nlcc_g_xc, &
180 rho_nlcc_use, rho_nlcc_xc, rho_struct_r, rho_struct_g, tau_struct_g, tau_struct_r, &
181 weights_use, weights_xc, particle_set, rho_ao_kp, rho_direct_g, rho_direct_r, &
182 rho_hard_g, rho_hard_r, rho_smooth_g, rho_smooth_model_g, rho_smooth_model_r, &
183 rho_smooth_r, tau_direct_g, tau_direct_r, tau_hard_g, tau_hard_r, tau_smooth_g, &
184 tau_smooth_model_g, tau_smooth_model_r, tau_smooth_r, gauxc_section)
187 my_just_energy = .false.
188 IF (
PRESENT(just_energy)) my_just_energy = just_energy
189 my_adiabatic_rescale_factor = 1.0_dp
190 do_adiabatic_rescaling = .false.
191 IF (
PRESENT(adiabatic_rescale_factor))
THEN
192 my_adiabatic_rescale_factor = adiabatic_rescale_factor
193 do_adiabatic_rescaling = .true.
197 dft_control=dft_control, &
201 particle_set=particle_set, &
202 xcint_weights=weights, &
205 rho_nlcc_g=rho_nlcc_g)
206 rho_nlcc_use => rho_nlcc
207 rho_nlcc_g_use => rho_nlcc_g
208 weights_use => weights
211 tau_r_valid=tau_r_valid, &
212 tau_g_valid=tau_g_valid, &
213 rho_g_valid=rho_g_valid, &
214 rho_r=rho_struct_r, &
215 rho_g=rho_struct_g, &
216 tau_g=tau_struct_g, &
218 rho_smooth_r => rho_struct_r
219 rho_smooth_g => rho_struct_g
220 tau_smooth_r => tau_struct_r
221 tau_smooth_g => tau_struct_g
223 compute_virial = virial%pv_calculate .AND. (.NOT. virial%pv_numer)
224 IF (compute_virial)
THEN
225 virial%pv_xc = 0.0_dp
235 cpassert(.NOT. (do_adiabatic_rescaling .AND. vdw_nl))
237 IF (.NOT. (
PRESENT(dispersion_env) .AND.
PRESENT(edisp)))
THEN
240 IF (
PRESENT(edisp)) edisp = 0.0_dp
242 defer_native_skala_to_atom_composite = .false.
243 IF (
PRESENT(native_skala_defer_to_atom_composite))
THEN
244 defer_native_skala_to_atom_composite = native_skala_defer_to_atom_composite
246 cpassert(.NOT. defer_native_skala_to_atom_composite .OR. native_skala_grid)
247 native_gapw_composite_reference = native_skala_grid .AND. &
249 (dft_control%qs_control%gapw .OR. &
250 dft_control%qs_control%gapw_xc)
251 IF (
PRESENT(native_gapw_composite_override))
THEN
252 native_gapw_composite_reference = native_skala_grid .AND. &
253 native_gapw_composite_override .AND. &
254 (dft_control%qs_control%gapw .OR. &
255 dft_control%qs_control%gapw_xc)
257 native_gapw_composite_direct_ao = native_gapw_composite_reference .AND. &
259 native_grid_diagnostics = .false.
260 IF (native_gapw_composite_reference)
THEN
262 cpassert(
ASSOCIATED(gauxc_section))
264 l_val=native_grid_diagnostics)
266 IF (native_gapw_composite_reference)
NULLIFY (weights_use)
268 IF (myfun /=
xc_none .OR. vdw_nl)
THEN
271 cpassert(
ASSOCIATED(rho_struct))
272 IF (dft_control%nspins /= 1 .AND. dft_control%nspins /= 2)
THEN
273 cpabort(
"nspins must be 1 or 2")
275 mspin =
SIZE(rho_struct_r)
276 IF (dft_control%nspins == 2 .AND. mspin == 1)
THEN
277 cpabort(
"Spin count mismatch")
287 SELECT CASE (dft_control%sic_method_id)
292 cpassert(.NOT. tau_r_valid)
294 my_scaling = 1.0_dp - dft_control%sic_scaling_b
296 cpassert(.NOT. tau_r_valid)
304 IF (dft_control%sic_scaling_b == 0.0_dp)
THEN
305 sic_scaling_b_zero = .true.
307 sic_scaling_b_zero = .false.
310 IF (
PRESENT(pw_env_external))
THEN
311 pw_env => pw_env_external
313 CALL pw_env_get(pw_env, xc_pw_pool=xc_pw_pool, auxbas_pw_pool=auxbas_pw_pool)
315 IF (native_gapw_composite_reference)
THEN
316 cpassert(tau_r_valid)
317 cpassert(
PRESENT(qs_env_external))
318 ALLOCATE (rho_hard_r(mspin), rho_hard_g(mspin), tau_hard_r(mspin), tau_hard_g(mspin))
320 CALL auxbas_pw_pool%create_pw(rho_hard_r(ispin))
321 CALL auxbas_pw_pool%create_pw(rho_hard_g(ispin))
322 CALL auxbas_pw_pool%create_pw(tau_hard_r(ispin))
323 CALL auxbas_pw_pool%create_pw(tau_hard_g(ispin))
325 IF (native_gapw_composite_direct_ao)
THEN
326 CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
327 cpassert(
ASSOCIATED(rho_ao_kp))
328 cpassert(
SIZE(rho_ao_kp, 2) == 1)
331 matrix_p=rho_ao_kp(ispin, 1)%matrix, rho=rho_hard_r(ispin), &
332 rho_gspace=rho_hard_g(ispin), ks_env=ks_env)
334 matrix_p=rho_ao_kp(ispin, 1)%matrix, rho=tau_hard_r(ispin), &
335 rho_gspace=tau_hard_g(ispin), ks_env=ks_env, compute_tau=.true.)
339 q_max = sqrt(maxval(rho_hard_g(1)%pw_grid%gsq))
341 qs_env=qs_env_external, auxbas_pw_pool=auxbas_pw_pool, &
342 rhotot_elec_gspace=rho_hard_g(1), q_max=q_max, &
343 rho_hard=composite_hard_integral, rho_soft=composite_soft_integral, &
344 rho_source=rho_struct, allow_nonorthorhombic=.true.)
345 rho_composite_hard = composite_hard_integral
346 rho_composite_soft = composite_soft_integral
348 qs_env=qs_env_external, auxbas_pw_pool=auxbas_pw_pool, &
349 rhotot_elec_gspace=tau_hard_g(1), q_max=q_max, &
350 rho_hard=composite_hard_integral, rho_soft=composite_soft_integral, &
351 compute_tau=.true., rho_source=rho_struct, allow_nonorthorhombic=.true.)
352 tau_composite_hard = composite_hard_integral
353 tau_composite_soft = composite_soft_integral
354 IF (para_env%mepos == 0)
THEN
356 IF (output_unit > 0)
THEN
357 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(1X,ES19.11))") &
358 "SKALA_GPW| Composite rho hard and soft integrals", &
359 rho_composite_hard, rho_composite_soft
360 WRITE (unit=output_unit, fmt=
"(T2,A,2(1X,ES19.11))") &
361 "SKALA_GPW| Composite tau hard and soft integrals", &
362 tau_composite_hard, tau_composite_soft
366 CALL pw_scale(rho_hard_g(1), 1.0_dp/volume)
367 CALL pw_scale(tau_hard_g(1), 1.0_dp/volume)
370 qs_env=qs_env_external, auxbas_pw_pool=auxbas_pw_pool, &
371 rhotot_elec_gspace=rho_hard_g(2), q_max=q_max, &
372 rho_hard=composite_hard_integral, rho_soft=composite_soft_integral, &
373 fsign=-1.0_dp, rho_source=rho_struct, allow_nonorthorhombic=.true.)
375 qs_env=qs_env_external, auxbas_pw_pool=auxbas_pw_pool, &
376 rhotot_elec_gspace=tau_hard_g(2), q_max=q_max, &
377 rho_hard=composite_hard_integral, rho_soft=composite_soft_integral, &
378 fsign=-1.0_dp, compute_tau=.true., rho_source=rho_struct, &
379 allow_nonorthorhombic=.true.)
380 CALL pw_scale(rho_hard_g(1), 0.5_dp/volume)
381 CALL pw_scale(rho_hard_g(2), 0.5_dp/volume)
382 CALL auxbas_pw_pool%create_pw(tmp_g)
383 CALL pw_copy(rho_hard_g(1), tmp_g)
384 CALL pw_axpy(rho_hard_g(2), rho_hard_g(1), 1.0_dp)
385 CALL pw_axpy(rho_hard_g(2), tmp_g, -1.0_dp)
386 CALL pw_copy(tmp_g, rho_hard_g(2))
387 CALL pw_scale(tau_hard_g(1), 0.5_dp/volume)
388 CALL pw_scale(tau_hard_g(2), 0.5_dp/volume)
389 CALL pw_copy(tau_hard_g(1), tmp_g)
390 CALL pw_axpy(tau_hard_g(2), tau_hard_g(1), 1.0_dp)
391 CALL pw_axpy(tau_hard_g(2), tmp_g, -1.0_dp)
392 CALL pw_copy(tmp_g, tau_hard_g(2))
393 CALL auxbas_pw_pool%give_back_pw(tmp_g)
397 CALL pw_transfer(rho_hard_g(ispin), rho_hard_r(ispin))
398 CALL pw_transfer(tau_hard_g(ispin), tau_hard_r(ispin))
400 IF (native_grid_diagnostics .AND. .NOT. native_gapw_composite_direct_ao)
THEN
401 CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
402 cpassert(
ASSOCIATED(rho_ao_kp))
403 cpassert(
SIZE(rho_ao_kp, 2) == 1)
404 ALLOCATE (rho_direct_r(mspin), rho_direct_g(mspin), &
405 tau_direct_r(mspin), tau_direct_g(mspin))
407 rho_diff_max = 0.0_dp
410 tau_diff_max = 0.0_dp
412 direct_rho_integral = 0.0_dp
413 direct_tau_integral = 0.0_dp
415 CALL auxbas_pw_pool%create_pw(rho_direct_r(ispin))
416 CALL auxbas_pw_pool%create_pw(rho_direct_g(ispin))
417 CALL auxbas_pw_pool%create_pw(tau_direct_r(ispin))
418 CALL auxbas_pw_pool%create_pw(tau_direct_g(ispin))
420 matrix_p=rho_ao_kp(ispin, 1)%matrix, rho=rho_direct_r(ispin), &
421 rho_gspace=rho_direct_g(ispin), ks_env=ks_env)
423 matrix_p=rho_ao_kp(ispin, 1)%matrix, rho=tau_direct_r(ispin), &
424 rho_gspace=tau_direct_g(ispin), ks_env=ks_env, compute_tau=.true.)
425 direct_rho_integral = direct_rho_integral + &
427 direct_tau_integral = direct_tau_integral + &
429 DO k = lbound(rho_direct_r(ispin)%array, 3), ubound(rho_direct_r(ispin)%array, 3)
430 DO j = lbound(rho_direct_r(ispin)%array, 2), ubound(rho_direct_r(ispin)%array, 2)
431 DO i = lbound(rho_direct_r(ispin)%array, 1), ubound(rho_direct_r(ispin)%array, 1)
432 delta = rho_hard_r(ispin)%array(i, j, k) - &
433 rho_direct_r(ispin)%array(i, j, k)
434 rho_diff_l2 = rho_diff_l2 + delta*delta
435 rho_diff_max = max(rho_diff_max, abs(delta))
436 rho_ref_l2 = rho_ref_l2 + rho_direct_r(ispin)%array(i, j, k)**2
437 delta = tau_hard_r(ispin)%array(i, j, k) - &
438 tau_direct_r(ispin)%array(i, j, k)
439 tau_diff_l2 = tau_diff_l2 + delta*delta
440 tau_diff_max = max(tau_diff_max, abs(delta))
441 tau_ref_l2 = tau_ref_l2 + tau_direct_r(ispin)%array(i, j, k)**2
446 CALL para_env%sum(rho_diff_l2)
447 CALL para_env%sum(rho_ref_l2)
448 CALL para_env%sum(tau_diff_l2)
449 CALL para_env%sum(tau_ref_l2)
450 CALL para_env%max(rho_diff_max)
451 CALL para_env%max(tau_diff_max)
452 rho_diff_l2 = sqrt(rho_diff_l2/max(rho_ref_l2, tiny(1.0_dp)))
453 tau_diff_l2 = sqrt(tau_diff_l2/max(tau_ref_l2, tiny(1.0_dp)))
454 IF (para_env%mepos == 0)
THEN
456 IF (output_unit > 0)
THEN
457 WRITE (unit=output_unit, fmt=
"(T2,A,2(1X,ES19.11))") &
458 "SKALA_GPW| Direct AO rho and tau integrals", &
459 direct_rho_integral, direct_tau_integral
460 WRITE (unit=output_unit, fmt=
"(T2,A,2(1X,ES19.11))") &
461 "SKALA_GPW| Composite/direct relative L2 rho and tau", &
462 rho_diff_l2, tau_diff_l2
463 WRITE (unit=output_unit, fmt=
"(T2,A,2(1X,ES19.11))") &
464 "SKALA_GPW| Composite/direct Linf rho and tau", &
465 rho_diff_max, tau_diff_max
469 CALL auxbas_pw_pool%give_back_pw(rho_direct_r(ispin))
470 CALL auxbas_pw_pool%give_back_pw(rho_direct_g(ispin))
471 CALL auxbas_pw_pool%give_back_pw(tau_direct_r(ispin))
472 CALL auxbas_pw_pool%give_back_pw(tau_direct_g(ispin))
474 DEALLOCATE (rho_direct_r, rho_direct_g, tau_direct_r, tau_direct_g)
476 composite_rho_r_integral = 0.0_dp
477 composite_tau_r_integral = 0.0_dp
478 composite_rho_min = huge(1.0_dp)
479 composite_rho_max = -huge(1.0_dp)
480 composite_tau_min = huge(1.0_dp)
481 composite_tau_max = -huge(1.0_dp)
483 composite_rho_r_integral = composite_rho_r_integral + &
485 composite_tau_r_integral = composite_tau_r_integral + &
487 composite_rho_min = min(composite_rho_min, minval(rho_hard_r(ispin)%array))
488 composite_rho_max = max(composite_rho_max, maxval(rho_hard_r(ispin)%array))
489 composite_tau_min = min(composite_tau_min, minval(tau_hard_r(ispin)%array))
490 composite_tau_max = max(composite_tau_max, maxval(tau_hard_r(ispin)%array))
492 CALL para_env%min(composite_rho_min)
493 CALL para_env%max(composite_rho_max)
494 CALL para_env%min(composite_tau_min)
495 CALL para_env%max(composite_tau_max)
496 IF (para_env%mepos == 0)
THEN
498 IF (output_unit > 0)
THEN
499 WRITE (unit=output_unit, fmt=
"(T2,A,1X,ES19.11)") &
500 "SKALA_GPW| Composite real-grid rho integral", composite_rho_r_integral
501 WRITE (unit=output_unit, fmt=
"(T2,A,1X,ES19.11)") &
502 "SKALA_GPW| Composite real-grid tau integral", composite_tau_r_integral
503 WRITE (unit=output_unit, fmt=
"(T2,A,2(1X,ES19.11))") &
504 "SKALA_GPW| Composite real-grid rho min and max", &
505 composite_rho_min, composite_rho_max
506 WRITE (unit=output_unit, fmt=
"(T2,A,2(1X,ES19.11))") &
507 "SKALA_GPW| Composite real-grid tau min and max", &
508 composite_tau_min, composite_tau_max
511 rho_struct_r => rho_hard_r
512 rho_struct_g => rho_hard_g
513 tau_struct_r => tau_hard_r
514 tau_struct_g => tau_hard_g
519 uf_grid = .NOT.
pw_grid_compare(auxbas_pw_pool%pw_grid, xc_pw_pool%pw_grid)
521 IF (.NOT. uf_grid)
THEN
522 rho_r => rho_struct_r
524 IF (tau_r_valid)
THEN
530 IF (rho_g_valid)
THEN
531 rho_g => rho_struct_g
534 cpassert(rho_g_valid)
535 ALLOCATE (rho_r(mspin))
536 ALLOCATE (rho_g(mspin))
538 CALL xc_pw_pool%create_pw(rho_g(ispin))
539 CALL pw_transfer(rho_struct_g(ispin), rho_g(ispin))
542 CALL xc_pw_pool%create_pw(rho_r(ispin))
545 IF (tau_r_valid)
THEN
546 ALLOCATE (tau(mspin))
548 CALL xc_pw_pool%create_pw(tau(ispin))
551 CALL xc_pw_pool%create_pw(tau_g_xc)
552 IF (tau_g_valid)
THEN
555 CALL auxbas_pw_pool%create_pw(tau_g_aux)
558 CALL auxbas_pw_pool%give_back_pw(tau_g_aux)
561 CALL xc_pw_pool%give_back_pw(tau_g_xc)
565 IF (
ASSOCIATED(weights) .AND. .NOT. native_gapw_composite_reference)
THEN
566 ALLOCATE (weights_xc)
567 CALL xc_pw_pool%create_pw(weights_xc)
570 CALL auxbas_pw_pool%create_pw(weights_g_aux)
571 CALL xc_pw_pool%create_pw(weights_g_xc)
575 CALL xc_pw_pool%give_back_pw(weights_g_xc)
576 CALL auxbas_pw_pool%give_back_pw(weights_g_aux)
578 weights_use => weights_xc
580 IF (
ASSOCIATED(rho_nlcc))
THEN
581 cpassert(
ASSOCIATED(rho_nlcc_g))
582 ALLOCATE (rho_nlcc_g_xc, rho_nlcc_xc)
583 CALL xc_pw_pool%create_pw(rho_nlcc_g_xc)
584 CALL xc_pw_pool%create_pw(rho_nlcc_xc)
585 CALL pw_transfer(rho_nlcc_g, rho_nlcc_g_xc)
586 CALL pw_transfer(rho_nlcc_g_xc, rho_nlcc_xc)
587 rho_nlcc_use => rho_nlcc_xc
588 rho_nlcc_g_use => rho_nlcc_g_xc
592 IF (native_gapw_composite_reference)
THEN
593 composite_rho_r_integral = 0.0_dp
594 composite_tau_r_integral = 0.0_dp
596 composite_rho_r_integral = composite_rho_r_integral + &
597 pw_integrate_function(rho_r(ispin))
598 composite_tau_r_integral = composite_tau_r_integral + &
599 pw_integrate_function(tau(ispin))
601 IF (para_env%mepos == 0)
THEN
602 output_unit = cp_logger_get_default_io_unit()
603 IF (output_unit > 0)
THEN
604 WRITE (unit=output_unit, fmt=
"(T2,A,1X,ES19.11)") &
605 "SKALA_GPW| Composite XC-grid rho integral", composite_rho_r_integral
606 WRITE (unit=output_unit, fmt=
"(T2,A,1X,ES19.11)") &
607 "SKALA_GPW| Composite XC-grid tau integral", composite_tau_r_integral
613 IF (
ASSOCIATED(rho_nlcc_use))
THEN
616 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
617 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
625 IF (defer_native_skala_to_atom_composite)
THEN
629 ALLOCATE (my_vxc_rho(mspin), my_vxc_tau(mspin))
631 CALL xc_pw_pool%create_pw(my_vxc_rho(ispin))
632 CALL xc_pw_pool%create_pw(my_vxc_tau(ispin))
633 CALL pw_zero(my_vxc_rho(ispin))
634 CALL pw_zero(my_vxc_tau(ispin))
636 ELSE IF (native_skala_grid)
THEN
637 CALL skala_gpw_eval(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, exc=exc, &
638 rho_r=rho_r, rho_g=rho_g, tau=tau, xc_section=xc_section, &
639 weights=weights_use, pw_pool=xc_pw_pool, &
640 particle_set=particle_set, cell=cell, &
641 compute_virial=compute_virial, virial_xc=virial%pv_xc, &
642 just_energy=my_just_energy, atom_force=native_skala_atom_force)
643 ELSE IF (my_just_energy)
THEN
644 exc = xc_exc_calc(rho_r=rho_r, tau=tau, &
645 rho_g=rho_g, xc_section=xc_section, &
646 weights=weights_use, pw_pool=xc_pw_pool)
649 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_r, &
650 rho_g=rho_g, tau=tau, exc=exc, &
651 xc_section=xc_section, &
652 weights=weights_use, pw_pool=xc_pw_pool, &
653 compute_virial=compute_virial, &
654 virial_xc=virial%pv_xc)
659 IF (native_gapw_composite_reference .AND. .NOT. my_just_energy)
THEN
661 diagnostics_pw_pool => xc_pw_pool
663 diagnostics_pw_pool => auxbas_pw_pool
665 CALL diagnostics_pw_pool%create_pw(tmp_g)
667 CALL pw_transfer(my_vxc_rho(ispin), tmp_g)
668 CALL pw_transfer(tmp_g, my_vxc_rho(ispin))
669 CALL pw_transfer(my_vxc_tau(ispin), tmp_g)
670 CALL pw_transfer(tmp_g, my_vxc_tau(ispin))
672 CALL diagnostics_pw_pool%give_back_pw(tmp_g)
673 NULLIFY (diagnostics_pw_pool)
676 IF (native_gapw_composite_reference .AND. native_grid_diagnostics .AND. &
677 .NOT. my_just_energy)
THEN
679 diagnostics_pw_pool => xc_pw_pool
681 diagnostics_pw_pool => auxbas_pw_pool
683 ALLOCATE (rho_smooth_model_g(mspin), rho_smooth_model_r(mspin), &
684 tau_smooth_model_g(mspin), tau_smooth_model_r(mspin))
686 CALL diagnostics_pw_pool%create_pw(rho_smooth_model_g(ispin))
687 CALL diagnostics_pw_pool%create_pw(rho_smooth_model_r(ispin))
688 CALL diagnostics_pw_pool%create_pw(tau_smooth_model_g(ispin))
689 CALL diagnostics_pw_pool%create_pw(tau_smooth_model_r(ispin))
691 IF (rho_g_valid)
THEN
692 CALL pw_transfer(rho_smooth_g(ispin), rho_smooth_model_g(ispin))
694 CALL auxbas_pw_pool%create_pw(tmp_g)
695 CALL pw_transfer(rho_smooth_r(ispin), tmp_g)
696 CALL pw_transfer(tmp_g, rho_smooth_model_g(ispin))
697 CALL auxbas_pw_pool%give_back_pw(tmp_g)
699 IF (tau_g_valid)
THEN
700 CALL pw_transfer(tau_smooth_g(ispin), tau_smooth_model_g(ispin))
702 CALL auxbas_pw_pool%create_pw(tmp_g)
703 CALL pw_transfer(tau_smooth_r(ispin), tmp_g)
704 CALL pw_transfer(tmp_g, tau_smooth_model_g(ispin))
705 CALL auxbas_pw_pool%give_back_pw(tmp_g)
708 IF (rho_g_valid)
THEN
709 CALL pw_copy(rho_smooth_g(ispin), rho_smooth_model_g(ispin))
711 CALL pw_transfer(rho_smooth_r(ispin), rho_smooth_model_g(ispin))
713 IF (tau_g_valid)
THEN
714 CALL pw_copy(tau_smooth_g(ispin), tau_smooth_model_g(ispin))
716 CALL pw_transfer(tau_smooth_r(ispin), tau_smooth_model_g(ispin))
719 CALL pw_transfer(rho_smooth_model_g(ispin), rho_smooth_model_r(ispin))
720 CALL pw_transfer(tau_smooth_model_g(ispin), tau_smooth_model_r(ispin))
721 IF (
ASSOCIATED(rho_nlcc_use))
THEN
722 CALL pw_axpy(rho_nlcc_use, rho_smooth_model_r(ispin), 1.0_dp)
723 CALL pw_axpy(rho_nlcc_g_use, rho_smooth_model_g(ispin), 1.0_dp)
726 CALL diagnose_gapw_composite_direction( &
727 rho_r, rho_g, tau, rho_smooth_model_r, rho_smooth_model_g, &
728 tau_smooth_model_r, my_vxc_rho, my_vxc_tau, xc_section, weights_use, &
729 diagnostics_pw_pool, particle_set, cell, para_env)
731 CALL diagnostics_pw_pool%give_back_pw(rho_smooth_model_g(ispin))
732 CALL diagnostics_pw_pool%give_back_pw(rho_smooth_model_r(ispin))
733 CALL diagnostics_pw_pool%give_back_pw(tau_smooth_model_g(ispin))
734 CALL diagnostics_pw_pool%give_back_pw(tau_smooth_model_r(ispin))
736 DEALLOCATE (rho_smooth_model_g, rho_smooth_model_r, &
737 tau_smooth_model_g, tau_smooth_model_r)
738 NULLIFY (diagnostics_pw_pool)
742 IF (
ASSOCIATED(rho_nlcc_use))
THEN
745 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
746 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
755 CALL get_ks_env(ks_env=ks_env, para_env=para_env)
757 cpassert(dft_control%sic_method_id == sic_none)
759 CALL pw_env_get(pw_env, vdw_pw_pool=vdw_pw_pool)
760 IF (my_just_energy)
THEN
761 CALL calculate_dispersion_nonloc(my_vxc_rho, rho_r, rho_g, edisp, dispersion_env, &
762 my_just_energy, vdw_pw_pool, xc_pw_pool, para_env)
764 CALL calculate_dispersion_nonloc(my_vxc_rho, rho_r, rho_g, edisp, dispersion_env, &
765 my_just_energy, vdw_pw_pool, xc_pw_pool, para_env, virial=virial)
770 IF (.NOT. my_just_energy)
THEN
771 IF (do_adiabatic_rescaling)
THEN
772 IF (
ASSOCIATED(my_vxc_rho))
THEN
773 DO ispin = 1,
SIZE(my_vxc_rho)
774 CALL pw_scale(my_vxc_rho(ispin), my_adiabatic_rescale_factor)
780 IF (my_scaling /= 1.0_dp)
THEN
782 IF (
ASSOCIATED(my_vxc_rho))
THEN
783 DO ispin = 1,
SIZE(my_vxc_rho)
784 CALL pw_scale(my_vxc_rho(ispin), my_scaling)
787 IF (
ASSOCIATED(my_vxc_tau))
THEN
788 DO ispin = 1,
SIZE(my_vxc_tau)
789 CALL pw_scale(my_vxc_tau(ispin), my_scaling)
796 IF (
ASSOCIATED(my_vxc_rho))
THEN
797 vxc_rho => my_vxc_rho
800 IF (
ASSOCIATED(my_vxc_tau))
THEN
801 vxc_tau => my_vxc_tau
805 DO ispin = 1,
SIZE(rho_r)
806 CALL xc_pw_pool%give_back_pw(rho_r(ispin))
809 IF (
ASSOCIATED(rho_g))
THEN
810 DO ispin = 1,
SIZE(rho_g)
811 CALL xc_pw_pool%give_back_pw(rho_g(ispin))
818 IF (dft_control%sic_method_id == sic_mauri_spz .AND. .NOT. sic_scaling_b_zero)
THEN
819 ALLOCATE (rho_m_rspace(2), rho_m_gspace(2))
820 CALL xc_pw_pool%create_pw(rho_m_gspace(1))
821 CALL xc_pw_pool%create_pw(rho_m_rspace(1))
822 CALL pw_copy(rho_struct_r(1), rho_m_rspace(1))
823 CALL pw_axpy(rho_struct_r(2), rho_m_rspace(1), alpha=-1._dp)
824 CALL pw_copy(rho_struct_g(1), rho_m_gspace(1))
825 CALL pw_axpy(rho_struct_g(2), rho_m_gspace(1), alpha=-1._dp)
827 CALL xc_pw_pool%create_pw(rho_m_gspace(2))
828 CALL xc_pw_pool%create_pw(rho_m_rspace(2))
829 CALL pw_zero(rho_m_rspace(2))
830 CALL pw_zero(rho_m_gspace(2))
832 IF (my_just_energy)
THEN
833 exc_m = xc_exc_calc(rho_r=rho_m_rspace, tau=tau, &
834 rho_g=rho_m_gspace, xc_section=xc_section, &
835 weights=weights_use, pw_pool=xc_pw_pool)
838 cpassert(.NOT. compute_virial)
839 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_m_rspace, &
840 rho_g=rho_m_gspace, tau=tau, exc=exc_m, &
841 xc_section=xc_section, &
842 weights=weights_use, pw_pool=xc_pw_pool, &
843 compute_virial=.false., &
844 virial_xc=virial_xc_tmp)
847 exc = exc - dft_control%sic_scaling_b*exc_m
850 IF (.NOT. my_just_energy)
THEN
851 CALL pw_axpy(my_vxc_rho(1), vxc_rho(1), -dft_control%sic_scaling_b)
852 CALL pw_axpy(my_vxc_rho(1), vxc_rho(2), dft_control%sic_scaling_b)
853 CALL my_vxc_rho(1)%release()
854 CALL my_vxc_rho(2)%release()
855 DEALLOCATE (my_vxc_rho)
859 CALL xc_pw_pool%give_back_pw(rho_m_rspace(ispin))
860 CALL xc_pw_pool%give_back_pw(rho_m_gspace(ispin))
862 DEALLOCATE (rho_m_rspace)
863 DEALLOCATE (rho_m_gspace)
868 IF (dft_control%sic_method_id == sic_ad .AND. .NOT. sic_scaling_b_zero)
THEN
871 CALL get_ks_env(ks_env, nelectron_spin=nelec_spin)
873 ALLOCATE (rho_m_rspace(2), rho_m_gspace(2))
875 CALL xc_pw_pool%create_pw(rho_m_gspace(ispin))
876 CALL xc_pw_pool%create_pw(rho_m_rspace(ispin))
880 IF (nelec_spin(ispin) > 0.0_dp)
THEN
881 nelec_s_inv = 1.0_dp/nelec_spin(ispin)
886 CALL pw_copy(rho_struct_r(ispin), rho_m_rspace(1))
887 CALL pw_copy(rho_struct_g(ispin), rho_m_gspace(1))
888 CALL pw_scale(rho_m_rspace(1), nelec_s_inv)
889 CALL pw_scale(rho_m_gspace(1), nelec_s_inv)
890 CALL pw_zero(rho_m_rspace(2))
891 CALL pw_zero(rho_m_gspace(2))
893 IF (my_just_energy)
THEN
894 exc_m = xc_exc_calc(rho_r=rho_m_rspace, tau=tau, &
895 rho_g=rho_m_gspace, xc_section=xc_section, &
896 weights=weights_use, pw_pool=xc_pw_pool)
899 cpassert(.NOT. compute_virial)
900 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_m_rspace, &
901 rho_g=rho_m_gspace, tau=tau, exc=exc_m, &
902 xc_section=xc_section, &
903 weights=weights_use, pw_pool=xc_pw_pool, &
904 compute_virial=.false., &
905 virial_xc=virial_xc_tmp)
908 exc = exc - dft_control%sic_scaling_b*nelec_spin(ispin)*exc_m
911 IF (.NOT. my_just_energy)
THEN
912 CALL pw_axpy(my_vxc_rho(1), vxc_rho(ispin), -dft_control%sic_scaling_b)
913 CALL my_vxc_rho(1)%release()
914 CALL my_vxc_rho(2)%release()
915 DEALLOCATE (my_vxc_rho)
920 CALL xc_pw_pool%give_back_pw(rho_m_rspace(ispin))
921 CALL xc_pw_pool%give_back_pw(rho_m_gspace(ispin))
923 DEALLOCATE (rho_m_rspace)
924 DEALLOCATE (rho_m_gspace)
929 IF (dft_control%sic_method_id == sic_mauri_us .AND. .NOT. sic_scaling_b_zero)
THEN
931 rho_r(1) = rho_struct_r(2)
932 rho_r(2) = rho_struct_r(2)
933 IF (rho_g_valid)
THEN
935 rho_g(1) = rho_struct_g(2)
936 rho_g(2) = rho_struct_g(2)
939 IF (my_just_energy)
THEN
940 exc_m = xc_exc_calc(rho_r=rho_r, tau=tau, &
941 rho_g=rho_g, xc_section=xc_section, &
942 weights=weights_use, pw_pool=xc_pw_pool)
945 cpassert(.NOT. compute_virial)
946 CALL xc_vxc_pw_create(vxc_rho=my_vxc_rho, vxc_tau=my_vxc_tau, rho_r=rho_r, &
947 rho_g=rho_g, tau=tau, exc=exc_m, &
948 xc_section=xc_section, &
949 weights=weights_use, pw_pool=xc_pw_pool, &
950 compute_virial=.false., &
951 virial_xc=virial_xc_tmp)
954 exc = exc + dft_control%sic_scaling_b*exc_m
957 IF (.NOT. my_just_energy)
THEN
959 CALL pw_axpy(my_vxc_rho(1), vxc_rho(2), 2.0_dp*dft_control%sic_scaling_b)
960 CALL my_vxc_rho(1)%release()
961 CALL my_vxc_rho(2)%release()
962 DEALLOCATE (my_vxc_rho)
964 DEALLOCATE (rho_r, rho_g)
971 IF (uf_grid .AND. (
ASSOCIATED(vxc_rho) .OR.
ASSOCIATED(vxc_tau)))
THEN
973 TYPE(pw_r3d_rs_type) :: tmp_pw
974 TYPE(pw_c1d_gs_type) :: tmp_g, tmp_g2
975 CALL xc_pw_pool%create_pw(tmp_g)
976 CALL auxbas_pw_pool%create_pw(tmp_g2)
977 IF (
ASSOCIATED(vxc_rho))
THEN
978 DO ispin = 1,
SIZE(vxc_rho)
979 CALL auxbas_pw_pool%create_pw(tmp_pw)
980 CALL pw_transfer(vxc_rho(ispin), tmp_g)
981 CALL pw_transfer(tmp_g, tmp_g2)
982 CALL pw_transfer(tmp_g2, tmp_pw)
983 CALL xc_pw_pool%give_back_pw(vxc_rho(ispin))
984 vxc_rho(ispin) = tmp_pw
987 IF (
ASSOCIATED(vxc_tau))
THEN
988 DO ispin = 1,
SIZE(vxc_tau)
989 CALL auxbas_pw_pool%create_pw(tmp_pw)
990 CALL pw_transfer(vxc_tau(ispin), tmp_g)
991 CALL pw_transfer(tmp_g, tmp_g2)
992 CALL pw_transfer(tmp_g2, tmp_pw)
993 CALL xc_pw_pool%give_back_pw(vxc_tau(ispin))
994 vxc_tau(ispin) = tmp_pw
997 CALL auxbas_pw_pool%give_back_pw(tmp_g2)
998 CALL xc_pw_pool%give_back_pw(tmp_g)
1001 IF (
ASSOCIATED(tau) .AND. uf_grid)
THEN
1002 DO ispin = 1,
SIZE(tau)
1003 CALL xc_pw_pool%give_back_pw(tau(ispin))
1007 IF (
ASSOCIATED(weights_xc))
THEN
1008 CALL xc_pw_pool%give_back_pw(weights_xc)
1009 DEALLOCATE (weights_xc)
1011 IF (
ASSOCIATED(rho_nlcc_xc))
THEN
1012 CALL xc_pw_pool%give_back_pw(rho_nlcc_xc)
1013 DEALLOCATE (rho_nlcc_xc)
1015 IF (
ASSOCIATED(rho_nlcc_g_xc))
THEN
1016 CALL xc_pw_pool%give_back_pw(rho_nlcc_g_xc)
1017 DEALLOCATE (rho_nlcc_g_xc)
1020 IF (
ASSOCIATED(rho_hard_r))
THEN
1021 DO ispin = 1,
SIZE(rho_hard_r)
1022 CALL auxbas_pw_pool%give_back_pw(rho_hard_r(ispin))
1023 CALL auxbas_pw_pool%give_back_pw(rho_hard_g(ispin))
1024 CALL auxbas_pw_pool%give_back_pw(tau_hard_r(ispin))
1025 CALL auxbas_pw_pool%give_back_pw(tau_hard_g(ispin))
1027 DEALLOCATE (rho_hard_r, rho_hard_g, tau_hard_r, tau_hard_g)
1032 CALL timestop(handle)
1219 xc_ener, xc_den, exc, vxc, vtau)
1221 TYPE(qs_ks_env_type),
POINTER :: ks_env
1222 TYPE(qs_rho_type),
POINTER :: rho_struct
1223 TYPE(section_vals_type),
POINTER :: xc_section
1224 TYPE(qs_dispersion_type),
OPTIONAL,
POINTER :: dispersion_env
1225 TYPE(pw_r3d_rs_type),
INTENT(INOUT),
OPTIONAL :: xc_ener, xc_den
1226 TYPE(pw_r3d_rs_type),
OPTIONAL :: exc
1227 TYPE(pw_r3d_rs_type),
DIMENSION(:),
OPTIONAL :: vxc, vtau
1229 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_xc_density'
1231 INTEGER :: handle, ispin, mspin, myfun, nspins, vdw
1232 LOGICAL :: rho_g_valid, tau_g_valid, tau_r_valid, &
1234 REAL(kind=dp) :: edisp, excint, factor, rho_cutoff
1235 REAL(kind=dp),
DIMENSION(3, 3) :: vdum
1236 TYPE(cell_type),
POINTER :: cell
1237 TYPE(dft_control_type),
POINTER :: dft_control
1238 TYPE(mp_para_env_type),
POINTER :: para_env
1239 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g, rho_struct_g, tau_g, tau_struct_g
1240 TYPE(pw_c1d_gs_type),
POINTER :: rho_nlcc_g, rho_nlcc_g_use, rho_nlcc_g_xc
1241 TYPE(pw_env_type),
POINTER :: pw_env
1242 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool, vdw_pw_pool, xc_pw_pool
1243 TYPE(pw_r3d_rs_type) :: exc_r
1244 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, rho_struct_r, tau_r, &
1245 tau_struct_r, vxc_rho, vxc_tau
1246 TYPE(pw_r3d_rs_type),
POINTER :: rho_nlcc, rho_nlcc_use, rho_nlcc_xc, &
1247 weights, weights_use, weights_xc
1249 CALL timeset(routinen, handle)
1251 NULLIFY (dft_control, pw_env, auxbas_pw_pool, xc_pw_pool, vdw_pw_pool, cell, &
1252 rho_g, rho_struct_g, tau_g, tau_struct_g, rho_nlcc, rho_nlcc_g, &
1253 rho_nlcc_g_use, rho_nlcc_g_xc, rho_nlcc_use, rho_nlcc_xc, rho_r, &
1254 rho_struct_r, tau_r, tau_struct_r, vxc_rho, vxc_tau, weights, &
1255 weights_use, weights_xc)
1257 CALL get_ks_env(ks_env, &
1258 dft_control=dft_control, &
1261 xcint_weights=weights, &
1262 rho_nlcc=rho_nlcc, &
1263 rho_nlcc_g=rho_nlcc_g)
1265 CALL qs_rho_get(rho_struct, &
1266 tau_r_valid=tau_r_valid, &
1267 tau_g_valid=tau_g_valid, &
1268 rho_g_valid=rho_g_valid, &
1269 rho_r=rho_struct_r, &
1270 rho_g=rho_struct_g, &
1271 tau_r=tau_struct_r, &
1273 nspins = dft_control%nspins
1274 mspin =
SIZE(rho_struct_r)
1275 rho_r => rho_struct_r
1276 rho_g => rho_struct_g
1277 tau_r => tau_struct_r
1278 tau_g => tau_struct_g
1279 rho_nlcc_use => rho_nlcc
1280 rho_nlcc_g_use => rho_nlcc_g
1281 weights_use => weights
1283 CALL section_vals_val_get(xc_section,
"XC_FUNCTIONAL%_SECTION_PARAMETERS_", i_val=myfun)
1284 CALL section_vals_val_get(xc_section,
"VDW_POTENTIAL%POTENTIAL_TYPE", i_val=vdw)
1285 vdw_nl = (vdw == xc_vdw_fun_nonloc)
1286 IF (
PRESENT(xc_ener))
THEN
1287 IF (tau_r_valid)
THEN
1288 CALL cp_warn(__location__,
"Tau contribution will not be correctly handled")
1292 CALL cp_warn(__location__,
"vdW functional contribution will be ignored")
1295 CALL pw_env_get(pw_env, xc_pw_pool=xc_pw_pool, auxbas_pw_pool=auxbas_pw_pool)
1296 uf_grid = .NOT. pw_grid_compare(auxbas_pw_pool%pw_grid, xc_pw_pool%pw_grid)
1298 IF (
PRESENT(xc_ener))
THEN
1299 CALL pw_zero(xc_ener)
1301 IF (
PRESENT(xc_den))
THEN
1302 CALL pw_zero(xc_den)
1304 IF (
PRESENT(exc))
THEN
1307 IF (
PRESENT(vxc))
THEN
1308 DO ispin = 1, nspins
1309 CALL pw_zero(vxc(ispin))
1312 IF (
PRESENT(vtau))
THEN
1313 DO ispin = 1, nspins
1314 CALL pw_zero(vtau(ispin))
1318 IF (myfun /= xc_none)
THEN
1320 cpassert(
ASSOCIATED(rho_struct))
1321 cpassert(dft_control%sic_method_id == sic_none)
1324 NULLIFY (rho_r, rho_g, tau_r, tau_g)
1325 IF (rho_g_valid)
THEN
1326 CALL create_density_on_pool(xc_pw_pool, rho_struct_g, rho_r, rho_g)
1327 ELSE IF (
ASSOCIATED(rho_struct_r))
THEN
1328 CALL create_density_on_pool_from_r(auxbas_pw_pool, xc_pw_pool, rho_struct_r, rho_r, rho_g)
1330 cpabort(
"Fine Grid in qs_xc_density requires rho_r or rho_g")
1332 IF (tau_r_valid)
THEN
1333 IF (tau_g_valid)
THEN
1334 CALL create_density_on_pool(xc_pw_pool, tau_struct_g, tau_r, tau_g)
1335 ELSE IF (
ASSOCIATED(tau_struct_r))
THEN
1336 CALL create_density_on_pool_from_r(auxbas_pw_pool, xc_pw_pool, tau_struct_r, tau_r, tau_g)
1338 cpabort(
"Fine Grid in qs_xc_density requires tau_r or tau_g")
1341 IF (
ASSOCIATED(weights))
THEN
1342 ALLOCATE (weights_xc)
1343 CALL xc_pw_pool%create_pw(weights_xc)
1344 CALL transfer_rspace_between_pools(auxbas_pw_pool, xc_pw_pool, weights, weights_xc)
1345 weights_use => weights_xc
1347 IF (
ASSOCIATED(rho_nlcc))
THEN
1348 cpassert(
ASSOCIATED(rho_nlcc_g))
1349 ALLOCATE (rho_nlcc_g_xc, rho_nlcc_xc)
1350 CALL xc_pw_pool%create_pw(rho_nlcc_g_xc)
1351 CALL xc_pw_pool%create_pw(rho_nlcc_xc)
1352 CALL pw_transfer(rho_nlcc_g, rho_nlcc_g_xc)
1353 CALL pw_transfer(rho_nlcc_g_xc, rho_nlcc_xc)
1354 rho_nlcc_use => rho_nlcc_xc
1355 rho_nlcc_g_use => rho_nlcc_g_xc
1360 IF (
ASSOCIATED(rho_nlcc_use))
THEN
1363 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
1364 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
1367 NULLIFY (vxc_rho, vxc_tau)
1368 CALL xc_vxc_pw_create(vxc_rho=vxc_rho, vxc_tau=vxc_tau, rho_r=rho_r, &
1369 rho_g=rho_g, tau=tau_r, exc=excint, &
1370 xc_section=xc_section, &
1371 weights=weights_use, pw_pool=xc_pw_pool, &
1372 compute_virial=.false., &
1380 CALL get_ks_env(ks_env=ks_env, para_env=para_env)
1382 cpassert(dft_control%sic_method_id == sic_none)
1384 CALL pw_env_get(pw_env, vdw_pw_pool=vdw_pw_pool)
1385 CALL calculate_dispersion_nonloc(vxc_rho, rho_r, rho_g, edisp, dispersion_env, &
1386 .false., vdw_pw_pool, xc_pw_pool, para_env)
1390 IF (
ASSOCIATED(rho_nlcc_use))
THEN
1393 CALL pw_axpy(rho_nlcc_use, rho_r(ispin), factor)
1394 CALL pw_axpy(rho_nlcc_g_use, rho_g(ispin), factor)
1398 IF (
PRESENT(xc_den))
THEN
1399 rho_cutoff = 1.e-14_dp
1402 TYPE(pw_r3d_rs_type) :: tmp_pw
1403 CALL xc_pw_pool%create_pw(tmp_pw)
1404 CALL pw_copy(exc_r, tmp_pw)
1405 CALL calc_xc_density(tmp_pw, rho_r, rho_cutoff)
1406 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, tmp_pw, xc_den)
1407 CALL xc_pw_pool%give_back_pw(tmp_pw)
1410 CALL pw_copy(exc_r, xc_den)
1411 CALL calc_xc_density(xc_den, rho_r, rho_cutoff)
1414 IF (
PRESENT(xc_ener))
THEN
1417 TYPE(pw_r3d_rs_type) :: tmp_pw
1418 CALL xc_pw_pool%create_pw(tmp_pw)
1419 CALL pw_copy(exc_r, tmp_pw)
1420 DO ispin = 1, nspins
1421 CALL pw_multiply(tmp_pw, vxc_rho(ispin), rho_r(ispin), alpha=-1.0_dp)
1423 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, tmp_pw, xc_ener)
1424 CALL xc_pw_pool%give_back_pw(tmp_pw)
1427 CALL pw_copy(exc_r, xc_ener)
1428 DO ispin = 1, nspins
1429 CALL pw_multiply(xc_ener, vxc_rho(ispin), rho_r(ispin), alpha=-1.0_dp)
1433 IF (
PRESENT(exc))
THEN
1435 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, exc_r, exc)
1437 CALL pw_copy(exc_r, exc)
1440 IF (
PRESENT(vxc))
THEN
1441 DO ispin = 1, nspins
1443 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, vxc_rho(ispin), vxc(ispin))
1445 CALL pw_copy(vxc_rho(ispin), vxc(ispin))
1449 IF (
PRESENT(vtau) .AND.
ASSOCIATED(vxc_tau))
THEN
1450 DO ispin = 1, nspins
1452 CALL transfer_rspace_between_pools(xc_pw_pool, auxbas_pw_pool, vxc_tau(ispin), vtau(ispin))
1454 CALL pw_copy(vxc_tau(ispin), vtau(ispin))
1459 IF (
ASSOCIATED(vxc_rho))
THEN
1460 DO ispin = 1, nspins
1461 CALL vxc_rho(ispin)%release()
1463 DEALLOCATE (vxc_rho)
1465 IF (
ASSOCIATED(vxc_tau))
THEN
1466 DO ispin = 1, nspins
1467 CALL vxc_tau(ispin)%release()
1469 DEALLOCATE (vxc_tau)
1471 CALL exc_r%release()
1473 CALL give_back_density_on_pool(xc_pw_pool, rho_r, rho_g)
1474 IF (
ASSOCIATED(tau_r))
CALL give_back_density_on_pool(xc_pw_pool, tau_r, tau_g)
1475 IF (
ASSOCIATED(weights_xc))
THEN
1476 CALL xc_pw_pool%give_back_pw(weights_xc)
1477 DEALLOCATE (weights_xc)
1479 IF (
ASSOCIATED(rho_nlcc_xc))
THEN
1480 CALL xc_pw_pool%give_back_pw(rho_nlcc_xc)
1481 DEALLOCATE (rho_nlcc_xc)
1483 IF (
ASSOCIATED(rho_nlcc_g_xc))
THEN
1484 CALL xc_pw_pool%give_back_pw(rho_nlcc_g_xc)
1485 DEALLOCATE (rho_nlcc_g_xc)
1491 CALL timestop(handle)