61 SUBROUTINE vxc_of_r_new(xc_fun_section, rho_set, deriv_set, deriv_order, needs, w, &
62 lsd, na, nr, exc, vxc, vxg, vtau, &
63 energy_only, adiabatic_rescale_factor)
78 INTEGER,
INTENT(in) :: deriv_order
80 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: w
81 LOGICAL,
INTENT(IN) :: lsd
82 INTEGER,
INTENT(in) :: na, nr
84 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: vxc
85 REAL(
dp),
DIMENSION(:, :, :, :),
POINTER :: vxg
86 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: vtau
87 LOGICAL,
INTENT(IN),
OPTIONAL :: energy_only
88 REAL(
dp),
INTENT(IN),
OPTIONAL :: adiabatic_rescale_factor
90 CHARACTER(LEN=*),
PARAMETER :: routinen =
'vxc_of_r_new'
92 INTEGER :: handle, ia, idir, ir
93 LOGICAL :: gradient_f, my_only_energy
94 REAL(
dp) :: my_adiabatic_rescale_factor
95 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: deriv_data
96 REAL(kind=
dp) :: drho_cutoff
99 CALL timeset(routinen, handle)
100 my_only_energy = .false.
101 IF (
PRESENT(energy_only)) my_only_energy = energy_only
103 IF (
PRESENT(adiabatic_rescale_factor))
THEN
104 my_adiabatic_rescale_factor = adiabatic_rescale_factor
106 my_adiabatic_rescale_factor = 1.0_dp
109 gradient_f = (needs%drho_spin .OR. needs%norm_drho_spin .OR. &
110 needs%drho .OR. needs%norm_drho)
116 deriv_set=deriv_set, &
117 deriv_order=deriv_order)
126 IF (
ASSOCIATED(deriv_att))
THEN
130 exc = exc + deriv_data(ia, ir, 1)*w(ia, ir)
136 IF (.NOT. my_only_energy)
THEN
140 IF (
ASSOCIATED(deriv_att))
THEN
142 vxc(:, :, 1) = deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
146 IF (
ASSOCIATED(deriv_att))
THEN
148 vxc(:, :, 2) = deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
152 IF (
ASSOCIATED(deriv_att))
THEN
154 vxc(:, :, 1) = vxc(:, :, 1) + deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
155 vxc(:, :, 2) = vxc(:, :, 2) + deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
160 IF (
ASSOCIATED(deriv_att))
THEN
162 vxc(:, :, 1) = deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
170 IF (
ASSOCIATED(deriv_att))
THEN
175 IF (rho_set%norm_drhoa(ia, ir, 1) > drho_cutoff)
THEN
176 vxg(idir, ia, ir, 1) = rho_set%drhoa(idir)%array(ia, ir, 1)* &
177 deriv_data(ia, ir, 1)*w(ia, ir)/ &
178 rho_set%norm_drhoa(ia, ir, 1)*my_adiabatic_rescale_factor
180 vxg(idir, ia, ir, 1) = 0.0_dp
188 IF (
ASSOCIATED(deriv_att))
THEN
193 IF (rho_set%norm_drhob(ia, ir, 1) > drho_cutoff)
THEN
194 vxg(idir, ia, ir, 2) = rho_set%drhob(idir)%array(ia, ir, 1)* &
195 deriv_data(ia, ir, 1)*w(ia, ir)/ &
196 rho_set%norm_drhob(ia, ir, 1)*my_adiabatic_rescale_factor
198 vxg(idir, ia, ir, 2) = 0.0_dp
207 IF (
ASSOCIATED(deriv_att))
THEN
212 IF (rho_set%norm_drho(ia, ir, 1) > drho_cutoff)
THEN
213 vxg(idir, ia, ir, 1:2) = &
214 vxg(idir, ia, ir, 1:2) + ( &
215 rho_set%drhoa(idir)%array(ia, ir, 1) + &
216 rho_set%drhob(idir)%array(ia, ir, 1))* &
217 deriv_data(ia, ir, 1)*w(ia, ir)/rho_set%norm_drho(ia, ir, 1)* &
218 my_adiabatic_rescale_factor
227 IF (
ASSOCIATED(deriv_att))
THEN
231 IF (rho_set%norm_drho(ia, ir, 1) > drho_cutoff)
THEN
233 vxg(idir, ia, ir, 1) = rho_set%drho(idir)%array(ia, ir, 1)* &
234 deriv_data(ia, ir, 1)*w(ia, ir)/ &
235 rho_set%norm_drho(ia, ir, 1)*my_adiabatic_rescale_factor
238 vxg(1:3, ia, ir, 1) = 0.0_dp
248 IF (
ASSOCIATED(deriv_att))
THEN
250 vtau(:, :, 1) = deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
254 IF (
ASSOCIATED(deriv_att))
THEN
256 vtau(:, :, 2) = deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
260 IF (
ASSOCIATED(deriv_att))
THEN
262 vtau(:, :, 1) = vtau(:, :, 1) + deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
263 vtau(:, :, 2) = vtau(:, :, 2) + deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
268 IF (
ASSOCIATED(deriv_att))
THEN
270 vtau(:, :, 1) = deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
276 CALL timestop(handle)
295 SUBROUTINE vxc_of_r_epr(xc_fun_section, rho_set, deriv_set, needs, w, &
296 lsd, na, nr, exc, vxc, vxg, vtau)
302 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: w
303 LOGICAL,
INTENT(IN) :: lsd
304 INTEGER,
INTENT(in) :: na, nr
306 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: vxc
307 REAL(
dp),
DIMENSION(:, :, :, :),
POINTER :: vxg
308 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: vtau
310 CHARACTER(LEN=*),
PARAMETER :: routinen =
'vxc_of_r_epr'
312 INTEGER :: handle, ia, idir, ir, my_deriv_order
313 LOGICAL :: gradient_f
314 REAL(
dp) :: my_adiabatic_rescale_factor
315 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: deriv_data
316 REAL(kind=
dp) :: drho_cutoff
319 CALL timeset(routinen, handle)
324 my_adiabatic_rescale_factor = 1.0_dp
327 gradient_f = (needs%drho_spin .OR. needs%norm_drho_spin .OR. &
328 needs%drho .OR. needs%norm_drho)
334 deriv_set=deriv_set, &
335 deriv_order=my_deriv_order)
345 IF (
ASSOCIATED(deriv_att))
THEN
350 vxg(idir, ia, ir, 1) = rho_set%drhoa(idir)%array(ia, ir, 1)* &
351 deriv_data(ia, ir, 1)
358 IF (
ASSOCIATED(deriv_att))
THEN
363 vxg(idir, ia, ir, 2) = rho_set%drhob(idir)%array(ia, ir, 1)* &
364 deriv_data(ia, ir, 1)
374 IF (
ASSOCIATED(deriv_att))
THEN
378 exc = exc + deriv_data(ia, ir, 1)*w(ia, ir)
384 CALL timestop(handle)
505 INTEGER,
INTENT(IN) :: nspins
506 INTEGER,
DIMENSION(2, 3),
INTENT(IN) :: bo
513 IF (needs%rho_1_3)
THEN
514 NULLIFY (rho_set%rho_1_3)
515 ALLOCATE (rho_set%rho_1_3(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
516 rho_set%owns%rho_1_3 = .true.
517 rho_set%has%rho_1_3 = .false.
521 NULLIFY (rho_set%rho)
522 ALLOCATE (rho_set%rho(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
523 rho_set%owns%rho = .true.
524 rho_set%has%rho = .false.
527 IF (needs%norm_drho)
THEN
528 NULLIFY (rho_set%norm_drho)
529 ALLOCATE (rho_set%norm_drho(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
530 rho_set%owns%norm_drho = .true.
531 rho_set%has%norm_drho = .false.
536 NULLIFY (rho_set%drho(idir)%array)
537 ALLOCATE (rho_set%drho(idir)%array(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
539 rho_set%owns%drho = .true.
540 rho_set%has%drho = .false.
546 NULLIFY (rho_set%rho)
547 ALLOCATE (rho_set%rho(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
548 rho_set%owns%rho = .true.
549 rho_set%has%rho = .false.
552 IF (needs%rho_1_3)
THEN
553 NULLIFY (rho_set%rho_1_3)
554 ALLOCATE (rho_set%rho_1_3(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
555 rho_set%owns%rho_1_3 = .true.
556 rho_set%has%rho_1_3 = .false.
559 IF (needs%rho_spin_1_3)
THEN
560 NULLIFY (rho_set%rhoa_1_3, rho_set%rhob_1_3)
561 ALLOCATE (rho_set%rhoa_1_3(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
562 ALLOCATE (rho_set%rhob_1_3(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
563 rho_set%owns%rho_spin_1_3 = .true.
564 rho_set%has%rho_spin_1_3 = .false.
567 IF (needs%rho_spin)
THEN
568 NULLIFY (rho_set%rhoa, rho_set%rhob)
569 ALLOCATE (rho_set%rhoa(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
570 ALLOCATE (rho_set%rhob(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
571 rho_set%owns%rho_spin = .true.
572 rho_set%has%rho_spin = .false.
575 IF (needs%norm_drho)
THEN
576 NULLIFY (rho_set%norm_drho)
577 ALLOCATE (rho_set%norm_drho(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
578 rho_set%owns%norm_drho = .true.
579 rho_set%has%norm_drho = .false.
582 IF (needs%norm_drho_spin)
THEN
583 NULLIFY (rho_set%norm_drhoa, rho_set%norm_drhob)
584 ALLOCATE (rho_set%norm_drhoa(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
585 ALLOCATE (rho_set%norm_drhob(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
586 rho_set%owns%norm_drho_spin = .true.
587 rho_set%has%norm_drho_spin = .false.
592 NULLIFY (rho_set%drho(idir)%array)
593 ALLOCATE (rho_set%drho(idir)%array(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
595 rho_set%owns%drho = .true.
596 rho_set%has%drho = .false.
599 IF (needs%drho_spin)
THEN
601 NULLIFY (rho_set%drhoa(idir)%array, rho_set%drhob(idir)%array)
602 ALLOCATE (rho_set%drhoa(idir)%array(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
603 ALLOCATE (rho_set%drhob(idir)%array(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
605 rho_set%owns%drho_spin = .true.
606 rho_set%has%drho_spin = .false.
613 NULLIFY (rho_set%tau)
614 ALLOCATE (rho_set%tau(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
615 rho_set%owns%tau = .true.
617 IF (needs%tau_spin)
THEN
618 NULLIFY (rho_set%tau_a, rho_set%tau_b)
619 ALLOCATE (rho_set%tau_a(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
620 ALLOCATE (rho_set%tau_b(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
621 rho_set%owns%tau_spin = .true.
622 rho_set%has%tau_spin = .false.
626 IF (needs%laplace_rho)
THEN
627 NULLIFY (rho_set%laplace_rho)
628 ALLOCATE (rho_set%laplace_rho(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
629 rho_set%owns%laplace_rho = .true.
631 IF (needs%laplace_rho_spin)
THEN
632 NULLIFY (rho_set%laplace_rhoa)
633 NULLIFY (rho_set%laplace_rhob)
634 ALLOCATE (rho_set%laplace_rhoa(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
635 ALLOCATE (rho_set%laplace_rhob(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
636 rho_set%owns%laplace_rho_spin = .true.
637 rho_set%has%laplace_rho_spin = .true.
654 SUBROUTINE fill_rho_set(rho_set, lsd, nspins, needs, rho, drho, tau, na, ir)
657 LOGICAL,
INTENT(IN) :: lsd
658 INTEGER,
INTENT(IN) :: nspins
660 REAL(
dp),
DIMENSION(:, :, :),
INTENT(IN) :: rho
661 REAL(
dp),
DIMENSION(:, :, :, :),
INTENT(IN) :: drho
662 REAL(
dp),
DIMENSION(:, :, :),
INTENT(IN) :: tau
663 INTEGER,
INTENT(IN) :: na, ir
665 REAL(kind=
dp),
PARAMETER :: f13 = (1.0_dp/3.0_dp)
667 INTEGER :: ia, idir, my_nspins
668 LOGICAL :: gradient_f, tddft_split
671 tddft_split = .false.
672 IF (lsd .AND. nspins == 1)
THEN
680 cpassert(
SIZE(rho, 3) == 1)
682 SELECT CASE (my_nspins)
684 cpassert(.NOT. needs%rho_spin)
685 cpassert(.NOT. needs%drho_spin)
686 cpassert(.NOT. needs%norm_drho_spin)
687 cpassert(.NOT. needs%rho_spin_1_3)
690 cpabort(
"Unsupported number of spins")
693 gradient_f = (needs%drho_spin .OR. needs%norm_drho_spin .OR. &
694 needs%drho .OR. needs%norm_drho)
696 SELECT CASE (my_nspins)
699 IF (needs%rho_1_3)
THEN
701 rho_set%rho_1_3(ia, ir, 1) = max(rho(ia, ir, 1), 0.0_dp)**f13
703 rho_set%owns%rho_1_3 = .true.
704 rho_set%has%rho_1_3 = .true.
709 rho_set%rho(ia, ir, 1) = rho(ia, ir, 1)
711 rho_set%owns%rho = .true.
712 rho_set%has%rho = .true.
715 IF (needs%norm_drho)
THEN
717 rho_set%norm_drho(ia, ir, 1) = drho(4, ia, ir, 1)
719 rho_set%owns%norm_drho = .true.
720 rho_set%has%norm_drho = .true.
726 rho_set%drho(idir)%array(ia, ir, 1) = drho(idir, ia, ir, 1)
729 rho_set%owns%drho = .true.
730 rho_set%has%drho = .true.
736 IF (.NOT. tddft_split)
THEN
738 rho_set%rho(ia, ir, 1) = rho(ia, ir, 1) + rho(ia, ir, 2)
742 rho_set%rho(ia, ir, 1) = rho(ia, ir, 1)
745 rho_set%owns%rho = .true.
746 rho_set%has%rho = .true.
749 IF (needs%rho_1_3)
THEN
750 IF (.NOT. tddft_split)
THEN
752 rho_set%rho_1_3(ia, ir, 1) = max(rho(ia, ir, 1) + rho(ia, ir, 2), 0.0_dp)**f13
756 rho_set%rho_1_3(ia, ir, 1) = max(rho(ia, ir, 1), 0.0_dp)**f13
759 rho_set%owns%rho_1_3 = .true.
760 rho_set%has%rho_1_3 = .true.
763 IF (needs%rho_spin_1_3)
THEN
764 IF (.NOT. tddft_split)
THEN
766 rho_set%rhoa_1_3(ia, ir, 1) = max(rho(ia, ir, 1), 0.0_dp)**f13
767 rho_set%rhob_1_3(ia, ir, 1) = max(rho(ia, ir, 2), 0.0_dp)**f13
771 rho_set%rhoa_1_3(ia, ir, 1) = max(0.5_dp*rho(ia, ir, 1), 0.0_dp)**f13
772 rho_set%rhob_1_3(ia, ir, 1) = rho_set%rhoa_1_3(ia, ir, 1)
775 rho_set%owns%rho_spin_1_3 = .true.
776 rho_set%has%rho_spin_1_3 = .true.
779 IF (needs%rho_spin)
THEN
780 IF (.NOT. tddft_split)
THEN
782 rho_set%rhoa(ia, ir, 1) = rho(ia, ir, 1)
783 rho_set%rhob(ia, ir, 1) = rho(ia, ir, 2)
787 rho_set%rhoa(ia, ir, 1) = 0.5_dp*rho(ia, ir, 1)
788 rho_set%rhob(ia, ir, 1) = rho_set%rhoa(ia, ir, 1)
791 rho_set%owns%rho_spin = .true.
792 rho_set%has%rho_spin = .true.
795 IF (needs%norm_drho)
THEN
796 IF (.NOT. tddft_split)
THEN
798 rho_set%norm_drho(ia, ir, 1) = sqrt( &
799 (drho(1, ia, ir, 1) + drho(1, ia, ir, 2))**2 + &
800 (drho(2, ia, ir, 1) + drho(2, ia, ir, 2))**2 + &
801 (drho(3, ia, ir, 1) + drho(3, ia, ir, 2))**2)
805 rho_set%norm_drho(ia, ir, 1) = drho(4, ia, ir, 1)
808 rho_set%owns%norm_drho = .true.
809 rho_set%has%norm_drho = .true.
812 IF (needs%norm_drho_spin)
THEN
813 IF (.NOT. tddft_split)
THEN
815 rho_set%norm_drhoa(ia, ir, 1) = drho(4, ia, ir, 1)
816 rho_set%norm_drhob(ia, ir, 1) = drho(4, ia, ir, 2)
820 rho_set%norm_drhoa(ia, ir, 1) = 0.5_dp*drho(4, ia, ir, 1)
821 rho_set%norm_drhob(ia, ir, 1) = rho_set%norm_drhoa(ia, ir, 1)
824 rho_set%owns%norm_drho_spin = .true.
825 rho_set%has%norm_drho_spin = .true.
829 IF (.NOT. tddft_split)
THEN
832 rho_set%drho(idir)%array(ia, ir, 1) = drho(idir, ia, ir, 1) + drho(idir, ia, ir, 2)
838 rho_set%drho(idir)%array(ia, ir, 1) = drho(idir, ia, ir, 1)
842 rho_set%owns%drho = .true.
843 rho_set%has%drho = .true.
846 IF (needs%drho_spin)
THEN
847 IF (.NOT. tddft_split)
THEN
850 rho_set%drhoa(idir)%array(ia, ir, 1) = drho(idir, ia, ir, 1)
851 rho_set%drhob(idir)%array(ia, ir, 1) = drho(idir, ia, ir, 2)
857 rho_set%drhoa(idir)%array(ia, ir, 1) = 0.5_dp*drho(idir, ia, ir, 1)
858 rho_set%drhob(idir)%array(ia, ir, 1) = rho_set%drhoa(idir)%array(ia, ir, 1)
862 rho_set%owns%drho_spin = .true.
863 rho_set%has%drho_spin = .true.
869 IF (needs%tau .OR. needs%tau_spin)
THEN
870 cpassert(
SIZE(tau, 3) == my_nspins)
873 IF (my_nspins == 2)
THEN
875 rho_set%tau(ia, ir, 1) = tau(ia, ir, 1) + tau(ia, ir, 2)
877 rho_set%owns%tau = .true.
878 rho_set%has%tau = .true.
881 rho_set%tau(ia, ir, 1) = tau(ia, ir, 1)
883 rho_set%owns%tau = .true.
884 rho_set%has%tau = .true.
887 IF (needs%tau_spin)
THEN
889 rho_set%tau_a(ia, ir, 1) = tau(ia, ir, 1)
890 rho_set%tau_b(ia, ir, 1) = tau(ia, ir, 2)
892 rho_set%owns%tau_spin = .true.
893 rho_set%has%tau_spin = .true.