62 SUBROUTINE vxc_of_r_new(xc_fun_section, rho_set, deriv_set, deriv_order, needs, w, &
63 lsd, na, nr, exc, vxc, vxg, vtau, &
64 energy_only, epr_xc, adiabatic_rescale_factor)
79 INTEGER,
INTENT(in) :: deriv_order
81 REAL(
dp),
DIMENSION(:, :),
POINTER :: w
82 LOGICAL,
INTENT(IN) :: lsd
83 INTEGER,
INTENT(in) :: na, nr
85 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: vxc
86 REAL(
dp),
DIMENSION(:, :, :, :),
POINTER :: vxg
87 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: vtau
88 LOGICAL,
INTENT(IN),
OPTIONAL :: energy_only, epr_xc
89 REAL(
dp),
INTENT(IN),
OPTIONAL :: adiabatic_rescale_factor
91 CHARACTER(LEN=*),
PARAMETER :: routinen =
'vxc_of_r_new'
93 INTEGER :: handle, ia, idir, ir, my_deriv_order
94 LOGICAL :: gradient_f, my_epr_xc, my_only_energy
95 REAL(
dp) :: my_adiabatic_rescale_factor
96 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: deriv_data
97 REAL(kind=
dp) :: drho_cutoff
100 CALL timeset(routinen, handle)
101 my_only_energy = .false.
102 IF (
PRESENT(energy_only)) my_only_energy = energy_only
104 IF (
PRESENT(adiabatic_rescale_factor))
THEN
105 my_adiabatic_rescale_factor = adiabatic_rescale_factor
107 my_adiabatic_rescale_factor = 1.0_dp
112 IF (
PRESENT(epr_xc)) my_epr_xc = epr_xc
113 my_deriv_order = deriv_order
114 IF (my_epr_xc) my_deriv_order = 2
116 gradient_f = (needs%drho_spin .OR. needs%norm_drho_spin .OR. &
117 needs%drho .OR. needs%norm_drho)
123 deriv_set=deriv_set, &
124 deriv_order=my_deriv_order)
135 IF (
ASSOCIATED(deriv_att))
THEN
140 vxg(idir, ia, ir, 1) = rho_set%drhoa(idir)%array(ia, ir, 1)* &
141 deriv_data(ia, ir, 1)
148 IF (
ASSOCIATED(deriv_att))
THEN
153 vxg(idir, ia, ir, 2) = rho_set%drhob(idir)%array(ia, ir, 1)* &
154 deriv_data(ia, ir, 1)
164 IF (
ASSOCIATED(deriv_att))
THEN
168 exc = exc + deriv_data(ia, ir, 1)*w(ia, ir)
177 IF (
ASSOCIATED(deriv_att))
THEN
181 exc = exc + deriv_data(ia, ir, 1)*w(ia, ir)
187 IF (.NOT. my_only_energy)
THEN
191 IF (
ASSOCIATED(deriv_att))
THEN
193 vxc(:, :, 1) = deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
197 IF (
ASSOCIATED(deriv_att))
THEN
199 vxc(:, :, 2) = deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
203 IF (
ASSOCIATED(deriv_att))
THEN
205 vxc(:, :, 1) = vxc(:, :, 1) + deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
206 vxc(:, :, 2) = vxc(:, :, 2) + deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
211 IF (
ASSOCIATED(deriv_att))
THEN
213 vxc(:, :, 1) = deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
221 IF (
ASSOCIATED(deriv_att))
THEN
226 IF (rho_set%norm_drhoa(ia, ir, 1) > drho_cutoff)
THEN
227 vxg(idir, ia, ir, 1) = rho_set%drhoa(idir)%array(ia, ir, 1)* &
228 deriv_data(ia, ir, 1)*w(ia, ir)/ &
229 rho_set%norm_drhoa(ia, ir, 1)*my_adiabatic_rescale_factor
231 vxg(idir, ia, ir, 1) = 0.0_dp
239 IF (
ASSOCIATED(deriv_att))
THEN
244 IF (rho_set%norm_drhob(ia, ir, 1) > drho_cutoff)
THEN
245 vxg(idir, ia, ir, 2) = rho_set%drhob(idir)%array(ia, ir, 1)* &
246 deriv_data(ia, ir, 1)*w(ia, ir)/ &
247 rho_set%norm_drhob(ia, ir, 1)*my_adiabatic_rescale_factor
249 vxg(idir, ia, ir, 2) = 0.0_dp
258 IF (
ASSOCIATED(deriv_att))
THEN
263 IF (rho_set%norm_drho(ia, ir, 1) > drho_cutoff)
THEN
264 vxg(idir, ia, ir, 1:2) = &
265 vxg(idir, ia, ir, 1:2) + ( &
266 rho_set%drhoa(idir)%array(ia, ir, 1) + &
267 rho_set%drhob(idir)%array(ia, ir, 1))* &
268 deriv_data(ia, ir, 1)*w(ia, ir)/rho_set%norm_drho(ia, ir, 1)* &
269 my_adiabatic_rescale_factor
278 IF (
ASSOCIATED(deriv_att))
THEN
282 IF (rho_set%norm_drho(ia, ir, 1) > drho_cutoff)
THEN
284 vxg(idir, ia, ir, 1) = rho_set%drho(idir)%array(ia, ir, 1)* &
285 deriv_data(ia, ir, 1)*w(ia, ir)/ &
286 rho_set%norm_drho(ia, ir, 1)*my_adiabatic_rescale_factor
289 vxg(1:3, ia, ir, 1) = 0.0_dp
299 IF (
ASSOCIATED(deriv_att))
THEN
301 vtau(:, :, 1) = deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
305 IF (
ASSOCIATED(deriv_att))
THEN
307 vtau(:, :, 2) = deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
311 IF (
ASSOCIATED(deriv_att))
THEN
313 vtau(:, :, 1) = vtau(:, :, 1) + deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
314 vtau(:, :, 2) = vtau(:, :, 2) + deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
319 IF (
ASSOCIATED(deriv_att))
THEN
321 vtau(:, :, 1) = deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
328 CALL timestop(handle)
444 INTEGER,
INTENT(IN) :: nspins
445 INTEGER,
DIMENSION(2, 3),
INTENT(IN) :: bo
452 IF (needs%rho_1_3)
THEN
453 NULLIFY (rho_set%rho_1_3)
454 ALLOCATE (rho_set%rho_1_3(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
455 rho_set%owns%rho_1_3 = .true.
456 rho_set%has%rho_1_3 = .false.
460 NULLIFY (rho_set%rho)
461 ALLOCATE (rho_set%rho(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
462 rho_set%owns%rho = .true.
463 rho_set%has%rho = .false.
466 IF (needs%norm_drho)
THEN
467 NULLIFY (rho_set%norm_drho)
468 ALLOCATE (rho_set%norm_drho(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
469 rho_set%owns%norm_drho = .true.
470 rho_set%has%norm_drho = .false.
475 NULLIFY (rho_set%drho(idir)%array)
476 ALLOCATE (rho_set%drho(idir)%array(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
478 rho_set%owns%drho = .true.
479 rho_set%has%drho = .false.
485 NULLIFY (rho_set%rho)
486 ALLOCATE (rho_set%rho(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
487 rho_set%owns%rho = .true.
488 rho_set%has%rho = .false.
491 IF (needs%rho_1_3)
THEN
492 NULLIFY (rho_set%rho_1_3)
493 ALLOCATE (rho_set%rho_1_3(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
494 rho_set%owns%rho_1_3 = .true.
495 rho_set%has%rho_1_3 = .false.
498 IF (needs%rho_spin_1_3)
THEN
499 NULLIFY (rho_set%rhoa_1_3, rho_set%rhob_1_3)
500 ALLOCATE (rho_set%rhoa_1_3(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
501 ALLOCATE (rho_set%rhob_1_3(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
502 rho_set%owns%rho_spin_1_3 = .true.
503 rho_set%has%rho_spin_1_3 = .false.
506 IF (needs%rho_spin)
THEN
507 NULLIFY (rho_set%rhoa, rho_set%rhob)
508 ALLOCATE (rho_set%rhoa(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
509 ALLOCATE (rho_set%rhob(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
510 rho_set%owns%rho_spin = .true.
511 rho_set%has%rho_spin = .false.
514 IF (needs%norm_drho)
THEN
515 NULLIFY (rho_set%norm_drho)
516 ALLOCATE (rho_set%norm_drho(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
517 rho_set%owns%norm_drho = .true.
518 rho_set%has%norm_drho = .false.
521 IF (needs%norm_drho_spin)
THEN
522 NULLIFY (rho_set%norm_drhoa, rho_set%norm_drhob)
523 ALLOCATE (rho_set%norm_drhoa(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
524 ALLOCATE (rho_set%norm_drhob(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
525 rho_set%owns%norm_drho_spin = .true.
526 rho_set%has%norm_drho_spin = .false.
531 NULLIFY (rho_set%drho(idir)%array)
532 ALLOCATE (rho_set%drho(idir)%array(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
534 rho_set%owns%drho = .true.
535 rho_set%has%drho = .false.
538 IF (needs%drho_spin)
THEN
540 NULLIFY (rho_set%drhoa(idir)%array, rho_set%drhob(idir)%array)
541 ALLOCATE (rho_set%drhoa(idir)%array(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
542 ALLOCATE (rho_set%drhob(idir)%array(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
544 rho_set%owns%drho_spin = .true.
545 rho_set%has%drho_spin = .false.
552 NULLIFY (rho_set%tau)
553 ALLOCATE (rho_set%tau(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
554 rho_set%owns%tau = .true.
556 IF (needs%tau_spin)
THEN
557 NULLIFY (rho_set%tau_a, rho_set%tau_b)
558 ALLOCATE (rho_set%tau_a(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
559 ALLOCATE (rho_set%tau_b(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
560 rho_set%owns%tau_spin = .true.
561 rho_set%has%tau_spin = .false.
565 IF (needs%laplace_rho)
THEN
566 NULLIFY (rho_set%laplace_rho)
567 ALLOCATE (rho_set%laplace_rho(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
568 rho_set%owns%laplace_rho = .true.
570 IF (needs%laplace_rho_spin)
THEN
571 NULLIFY (rho_set%laplace_rhoa)
572 NULLIFY (rho_set%laplace_rhob)
573 ALLOCATE (rho_set%laplace_rhoa(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
574 ALLOCATE (rho_set%laplace_rhob(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
575 rho_set%owns%laplace_rho_spin = .true.
576 rho_set%has%laplace_rho_spin = .true.
593 SUBROUTINE fill_rho_set(rho_set, lsd, nspins, needs, rho, drho, tau, na, ir)
596 LOGICAL,
INTENT(IN) :: lsd
597 INTEGER,
INTENT(IN) :: nspins
599 REAL(
dp),
DIMENSION(:, :, :),
INTENT(IN) :: rho
600 REAL(
dp),
DIMENSION(:, :, :, :),
INTENT(IN) :: drho
601 REAL(
dp),
DIMENSION(:, :, :),
INTENT(IN) :: tau
602 INTEGER,
INTENT(IN) :: na, ir
604 REAL(kind=
dp),
PARAMETER :: f13 = (1.0_dp/3.0_dp)
606 INTEGER :: ia, idir, my_nspins
607 LOGICAL :: gradient_f, tddft_split
610 tddft_split = .false.
611 IF (lsd .AND. nspins == 1)
THEN
619 cpassert(
SIZE(rho, 3) == 1)
621 SELECT CASE (my_nspins)
623 cpassert(.NOT. needs%rho_spin)
624 cpassert(.NOT. needs%drho_spin)
625 cpassert(.NOT. needs%norm_drho_spin)
626 cpassert(.NOT. needs%rho_spin_1_3)
629 cpabort(
"Unsupported number of spins")
632 gradient_f = (needs%drho_spin .OR. needs%norm_drho_spin .OR. &
633 needs%drho .OR. needs%norm_drho)
635 SELECT CASE (my_nspins)
638 IF (needs%rho_1_3)
THEN
640 rho_set%rho_1_3(ia, ir, 1) = max(rho(ia, ir, 1), 0.0_dp)**f13
642 rho_set%owns%rho_1_3 = .true.
643 rho_set%has%rho_1_3 = .true.
648 rho_set%rho(ia, ir, 1) = rho(ia, ir, 1)
650 rho_set%owns%rho = .true.
651 rho_set%has%rho = .true.
654 IF (needs%norm_drho)
THEN
656 rho_set%norm_drho(ia, ir, 1) = drho(4, ia, ir, 1)
658 rho_set%owns%norm_drho = .true.
659 rho_set%has%norm_drho = .true.
665 rho_set%drho(idir)%array(ia, ir, 1) = drho(idir, ia, ir, 1)
668 rho_set%owns%drho = .true.
669 rho_set%has%drho = .true.
675 IF (.NOT. tddft_split)
THEN
677 rho_set%rho(ia, ir, 1) = rho(ia, ir, 1) + rho(ia, ir, 2)
681 rho_set%rho(ia, ir, 1) = rho(ia, ir, 1)
684 rho_set%owns%rho = .true.
685 rho_set%has%rho = .true.
688 IF (needs%rho_1_3)
THEN
689 IF (.NOT. tddft_split)
THEN
691 rho_set%rho_1_3(ia, ir, 1) = max(rho(ia, ir, 1) + rho(ia, ir, 2), 0.0_dp)**f13
695 rho_set%rho_1_3(ia, ir, 1) = max(rho(ia, ir, 1), 0.0_dp)**f13
698 rho_set%owns%rho_1_3 = .true.
699 rho_set%has%rho_1_3 = .true.
702 IF (needs%rho_spin_1_3)
THEN
703 IF (.NOT. tddft_split)
THEN
705 rho_set%rhoa_1_3(ia, ir, 1) = max(rho(ia, ir, 1), 0.0_dp)**f13
706 rho_set%rhob_1_3(ia, ir, 1) = max(rho(ia, ir, 2), 0.0_dp)**f13
710 rho_set%rhoa_1_3(ia, ir, 1) = max(0.5_dp*rho(ia, ir, 1), 0.0_dp)**f13
711 rho_set%rhob_1_3(ia, ir, 1) = rho_set%rhoa_1_3(ia, ir, 1)
714 rho_set%owns%rho_spin_1_3 = .true.
715 rho_set%has%rho_spin_1_3 = .true.
718 IF (needs%rho_spin)
THEN
719 IF (.NOT. tddft_split)
THEN
721 rho_set%rhoa(ia, ir, 1) = rho(ia, ir, 1)
722 rho_set%rhob(ia, ir, 1) = rho(ia, ir, 2)
726 rho_set%rhoa(ia, ir, 1) = 0.5_dp*rho(ia, ir, 1)
727 rho_set%rhob(ia, ir, 1) = rho_set%rhoa(ia, ir, 1)
730 rho_set%owns%rho_spin = .true.
731 rho_set%has%rho_spin = .true.
734 IF (needs%norm_drho)
THEN
735 IF (.NOT. tddft_split)
THEN
737 rho_set%norm_drho(ia, ir, 1) = sqrt( &
738 (drho(1, ia, ir, 1) + drho(1, ia, ir, 2))**2 + &
739 (drho(2, ia, ir, 1) + drho(2, ia, ir, 2))**2 + &
740 (drho(3, ia, ir, 1) + drho(3, ia, ir, 2))**2)
744 rho_set%norm_drho(ia, ir, 1) = drho(4, ia, ir, 1)
747 rho_set%owns%norm_drho = .true.
748 rho_set%has%norm_drho = .true.
751 IF (needs%norm_drho_spin)
THEN
752 IF (.NOT. tddft_split)
THEN
754 rho_set%norm_drhoa(ia, ir, 1) = drho(4, ia, ir, 1)
755 rho_set%norm_drhob(ia, ir, 1) = drho(4, ia, ir, 2)
759 rho_set%norm_drhoa(ia, ir, 1) = 0.5_dp*drho(4, ia, ir, 1)
760 rho_set%norm_drhob(ia, ir, 1) = rho_set%norm_drhoa(ia, ir, 1)
763 rho_set%owns%norm_drho_spin = .true.
764 rho_set%has%norm_drho_spin = .true.
768 IF (.NOT. tddft_split)
THEN
771 rho_set%drho(idir)%array(ia, ir, 1) = drho(idir, ia, ir, 1) + drho(idir, ia, ir, 2)
777 rho_set%drho(idir)%array(ia, ir, 1) = drho(idir, ia, ir, 1)
781 rho_set%owns%drho = .true.
782 rho_set%has%drho = .true.
785 IF (needs%drho_spin)
THEN
786 IF (.NOT. tddft_split)
THEN
789 rho_set%drhoa(idir)%array(ia, ir, 1) = drho(idir, ia, ir, 1)
790 rho_set%drhob(idir)%array(ia, ir, 1) = drho(idir, ia, ir, 2)
796 rho_set%drhoa(idir)%array(ia, ir, 1) = 0.5_dp*drho(idir, ia, ir, 1)
797 rho_set%drhob(idir)%array(ia, ir, 1) = rho_set%drhoa(idir)%array(ia, ir, 1)
801 rho_set%owns%drho_spin = .true.
802 rho_set%has%drho_spin = .true.
808 IF (needs%tau .OR. needs%tau_spin)
THEN
809 cpassert(
SIZE(tau, 3) == my_nspins)
812 IF (my_nspins == 2)
THEN
814 rho_set%tau(ia, ir, 1) = tau(ia, ir, 1) + tau(ia, ir, 2)
816 rho_set%owns%tau = .true.
817 rho_set%has%tau = .true.
820 rho_set%tau(ia, ir, 1) = tau(ia, ir, 1)
822 rho_set%owns%tau = .true.
823 rho_set%has%tau = .true.
826 IF (needs%tau_spin)
THEN
828 rho_set%tau_a(ia, ir, 1) = tau(ia, ir, 1)
829 rho_set%tau_b(ia, ir, 1) = tau(ia, ir, 2)
831 rho_set%owns%tau_spin = .true.
832 rho_set%has%tau_spin = .true.