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
178 IF (rho_set%norm_drhoa(ia, ir, 1) > drho_cutoff)
THEN
179 vxg(idir, ia, ir, 1) = rho_set%drhoa(idir)%array(ia, ir, 1)* &
180 deriv_data(ia, ir, 1)*w(ia, ir)/ &
181 rho_set%norm_drhoa(ia, ir, 1)*my_adiabatic_rescale_factor
183 vxg(idir, ia, ir, 1) = 0.0_dp
192 IF (
ASSOCIATED(deriv_att))
THEN
200 IF (rho_set%norm_drhob(ia, ir, 1) > drho_cutoff)
THEN
201 vxg(idir, ia, ir, 2) = rho_set%drhob(idir)%array(ia, ir, 1)* &
202 deriv_data(ia, ir, 1)*w(ia, ir)/ &
203 rho_set%norm_drhob(ia, ir, 1)*my_adiabatic_rescale_factor
205 vxg(idir, ia, ir, 2) = 0.0_dp
215 IF (
ASSOCIATED(deriv_att))
THEN
223 IF (rho_set%norm_drho(ia, ir, 1) > drho_cutoff)
THEN
224 vxg(idir, ia, ir, 1:2) = &
225 vxg(idir, ia, ir, 1:2) + ( &
226 rho_set%drhoa(idir)%array(ia, ir, 1) + &
227 rho_set%drhob(idir)%array(ia, ir, 1))* &
228 deriv_data(ia, ir, 1)*w(ia, ir)/rho_set%norm_drho(ia, ir, 1)* &
229 my_adiabatic_rescale_factor
239 IF (
ASSOCIATED(deriv_att))
THEN
246 IF (rho_set%norm_drho(ia, ir, 1) > drho_cutoff)
THEN
248 vxg(idir, ia, ir, 1) = rho_set%drho(idir)%array(ia, ir, 1)* &
249 deriv_data(ia, ir, 1)*w(ia, ir)/ &
250 rho_set%norm_drho(ia, ir, 1)*my_adiabatic_rescale_factor
253 vxg(1:3, ia, ir, 1) = 0.0_dp
264 IF (
ASSOCIATED(deriv_att))
THEN
266 vtau(:, :, 1) = deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
270 IF (
ASSOCIATED(deriv_att))
THEN
272 vtau(:, :, 2) = deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
276 IF (
ASSOCIATED(deriv_att))
THEN
278 vtau(:, :, 1) = vtau(:, :, 1) + deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
279 vtau(:, :, 2) = vtau(:, :, 2) + deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
284 IF (
ASSOCIATED(deriv_att))
THEN
286 vtau(:, :, 1) = deriv_data(:, :, 1)*w(:, :)*my_adiabatic_rescale_factor
292 CALL timestop(handle)
311 SUBROUTINE vxc_of_r_epr(xc_fun_section, rho_set, deriv_set, needs, w, &
312 lsd, na, nr, exc, vxc, vxg, vtau)
318 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: w
319 LOGICAL,
INTENT(IN) :: lsd
320 INTEGER,
INTENT(in) :: na, nr
322 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: vxc
323 REAL(
dp),
DIMENSION(:, :, :, :),
POINTER :: vxg
324 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: vtau
326 CHARACTER(LEN=*),
PARAMETER :: routinen =
'vxc_of_r_epr'
328 INTEGER :: handle, ia, idir, ir, my_deriv_order
329 LOGICAL :: gradient_f
330 REAL(
dp) :: my_adiabatic_rescale_factor
331 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: deriv_data
332 REAL(kind=
dp) :: drho_cutoff
335 CALL timeset(routinen, handle)
340 my_adiabatic_rescale_factor = 1.0_dp
343 gradient_f = (needs%drho_spin .OR. needs%norm_drho_spin .OR. &
344 needs%drho .OR. needs%norm_drho)
350 deriv_set=deriv_set, &
351 deriv_order=my_deriv_order)
361 IF (
ASSOCIATED(deriv_att))
THEN
366 vxg(idir, ia, ir, 1) = rho_set%drhoa(idir)%array(ia, ir, 1)* &
367 deriv_data(ia, ir, 1)
374 IF (
ASSOCIATED(deriv_att))
THEN
379 vxg(idir, ia, ir, 2) = rho_set%drhob(idir)%array(ia, ir, 1)* &
380 deriv_data(ia, ir, 1)
390 IF (
ASSOCIATED(deriv_att))
THEN
394 exc = exc + deriv_data(ia, ir, 1)*w(ia, ir)
400 CALL timestop(handle)
533 INTEGER,
INTENT(IN) :: nspins
534 INTEGER,
DIMENSION(2, 3),
INTENT(IN) :: bo
541 IF (needs%rho_1_3)
THEN
542 NULLIFY (rho_set%rho_1_3)
543 ALLOCATE (rho_set%rho_1_3(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
544 rho_set%owns%rho_1_3 = .true.
545 rho_set%has%rho_1_3 = .false.
549 NULLIFY (rho_set%rho)
550 ALLOCATE (rho_set%rho(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
551 rho_set%owns%rho = .true.
552 rho_set%has%rho = .false.
555 IF (needs%norm_drho)
THEN
556 NULLIFY (rho_set%norm_drho)
557 ALLOCATE (rho_set%norm_drho(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
558 rho_set%owns%norm_drho = .true.
559 rho_set%has%norm_drho = .false.
564 NULLIFY (rho_set%drho(idir)%array)
565 ALLOCATE (rho_set%drho(idir)%array(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
567 rho_set%owns%drho = .true.
568 rho_set%has%drho = .false.
574 NULLIFY (rho_set%rho)
575 ALLOCATE (rho_set%rho(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
576 rho_set%owns%rho = .true.
577 rho_set%has%rho = .false.
580 IF (needs%rho_1_3)
THEN
581 NULLIFY (rho_set%rho_1_3)
582 ALLOCATE (rho_set%rho_1_3(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
583 rho_set%owns%rho_1_3 = .true.
584 rho_set%has%rho_1_3 = .false.
587 IF (needs%rho_spin_1_3)
THEN
588 NULLIFY (rho_set%rhoa_1_3, rho_set%rhob_1_3)
589 ALLOCATE (rho_set%rhoa_1_3(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
590 ALLOCATE (rho_set%rhob_1_3(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
591 rho_set%owns%rho_spin_1_3 = .true.
592 rho_set%has%rho_spin_1_3 = .false.
595 IF (needs%rho_spin)
THEN
596 NULLIFY (rho_set%rhoa, rho_set%rhob)
597 ALLOCATE (rho_set%rhoa(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
598 ALLOCATE (rho_set%rhob(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
599 rho_set%owns%rho_spin = .true.
600 rho_set%has%rho_spin = .false.
603 IF (needs%norm_drho)
THEN
604 NULLIFY (rho_set%norm_drho)
605 ALLOCATE (rho_set%norm_drho(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
606 rho_set%owns%norm_drho = .true.
607 rho_set%has%norm_drho = .false.
610 IF (needs%norm_drho_spin)
THEN
611 NULLIFY (rho_set%norm_drhoa, rho_set%norm_drhob)
612 ALLOCATE (rho_set%norm_drhoa(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
613 ALLOCATE (rho_set%norm_drhob(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
614 rho_set%owns%norm_drho_spin = .true.
615 rho_set%has%norm_drho_spin = .false.
620 NULLIFY (rho_set%drho(idir)%array)
621 ALLOCATE (rho_set%drho(idir)%array(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
623 rho_set%owns%drho = .true.
624 rho_set%has%drho = .false.
627 IF (needs%drho_spin)
THEN
629 NULLIFY (rho_set%drhoa(idir)%array, rho_set%drhob(idir)%array)
630 ALLOCATE (rho_set%drhoa(idir)%array(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
631 ALLOCATE (rho_set%drhob(idir)%array(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
633 rho_set%owns%drho_spin = .true.
634 rho_set%has%drho_spin = .false.
641 NULLIFY (rho_set%tau)
642 ALLOCATE (rho_set%tau(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
643 rho_set%owns%tau = .true.
645 IF (needs%tau_spin)
THEN
646 NULLIFY (rho_set%tau_a, rho_set%tau_b)
647 ALLOCATE (rho_set%tau_a(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
648 ALLOCATE (rho_set%tau_b(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
649 rho_set%owns%tau_spin = .true.
650 rho_set%has%tau_spin = .false.
654 IF (needs%laplace_rho)
THEN
655 NULLIFY (rho_set%laplace_rho)
656 ALLOCATE (rho_set%laplace_rho(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
657 rho_set%owns%laplace_rho = .true.
659 IF (needs%laplace_rho_spin)
THEN
660 NULLIFY (rho_set%laplace_rhoa)
661 NULLIFY (rho_set%laplace_rhob)
662 ALLOCATE (rho_set%laplace_rhoa(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
663 ALLOCATE (rho_set%laplace_rhob(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)))
664 rho_set%owns%laplace_rho_spin = .true.
665 rho_set%has%laplace_rho_spin = .true.
682 SUBROUTINE fill_rho_set(rho_set, lsd, nspins, needs, rho, drho, tau, na, ir)
685 LOGICAL,
INTENT(IN) :: lsd
686 INTEGER,
INTENT(IN) :: nspins
688 REAL(
dp),
DIMENSION(:, :, :),
INTENT(IN) :: rho
689 REAL(
dp),
DIMENSION(:, :, :, :),
INTENT(IN) :: drho
690 REAL(
dp),
DIMENSION(:, :, :),
INTENT(IN) :: tau
691 INTEGER,
INTENT(IN) :: na, ir
693 REAL(kind=
dp),
PARAMETER :: f13 = (1.0_dp/3.0_dp)
695 INTEGER :: ia, idir, my_nspins
696 LOGICAL :: gradient_f, tddft_split
699 tddft_split = .false.
700 IF (lsd .AND. nspins == 1)
THEN
708 cpassert(
SIZE(rho, 3) == 1)
710 SELECT CASE (my_nspins)
712 cpassert(.NOT. needs%rho_spin)
713 cpassert(.NOT. needs%drho_spin)
714 cpassert(.NOT. needs%norm_drho_spin)
715 cpassert(.NOT. needs%rho_spin_1_3)
718 cpabort(
"Unsupported number of spins")
721 gradient_f = (needs%drho_spin .OR. needs%norm_drho_spin .OR. &
722 needs%drho .OR. needs%norm_drho)
724 SELECT CASE (my_nspins)
727 IF (needs%rho_1_3)
THEN
729 rho_set%rho_1_3(ia, ir, 1) = max(rho(ia, ir, 1), 0.0_dp)**f13
731 rho_set%owns%rho_1_3 = .true.
732 rho_set%has%rho_1_3 = .true.
737 rho_set%rho(ia, ir, 1) = rho(ia, ir, 1)
739 rho_set%owns%rho = .true.
740 rho_set%has%rho = .true.
743 IF (needs%norm_drho)
THEN
745 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.
754 rho_set%drho(idir)%array(ia, ir, 1) = drho(idir, ia, ir, 1)
757 rho_set%owns%drho = .true.
758 rho_set%has%drho = .true.
764 IF (.NOT. tddft_split)
THEN
766 rho_set%rho(ia, ir, 1) = rho(ia, ir, 1) + rho(ia, ir, 2)
770 rho_set%rho(ia, ir, 1) = rho(ia, ir, 1)
773 rho_set%owns%rho = .true.
774 rho_set%has%rho = .true.
777 IF (needs%rho_1_3)
THEN
778 IF (.NOT. tddft_split)
THEN
780 rho_set%rho_1_3(ia, ir, 1) = max(rho(ia, ir, 1) + rho(ia, ir, 2), 0.0_dp)**f13
784 rho_set%rho_1_3(ia, ir, 1) = max(rho(ia, ir, 1), 0.0_dp)**f13
787 rho_set%owns%rho_1_3 = .true.
788 rho_set%has%rho_1_3 = .true.
791 IF (needs%rho_spin_1_3)
THEN
792 IF (.NOT. tddft_split)
THEN
794 rho_set%rhoa_1_3(ia, ir, 1) = max(rho(ia, ir, 1), 0.0_dp)**f13
795 rho_set%rhob_1_3(ia, ir, 1) = max(rho(ia, ir, 2), 0.0_dp)**f13
799 rho_set%rhoa_1_3(ia, ir, 1) = max(0.5_dp*rho(ia, ir, 1), 0.0_dp)**f13
800 rho_set%rhob_1_3(ia, ir, 1) = rho_set%rhoa_1_3(ia, ir, 1)
803 rho_set%owns%rho_spin_1_3 = .true.
804 rho_set%has%rho_spin_1_3 = .true.
807 IF (needs%rho_spin)
THEN
808 IF (.NOT. tddft_split)
THEN
810 rho_set%rhoa(ia, ir, 1) = rho(ia, ir, 1)
811 rho_set%rhob(ia, ir, 1) = rho(ia, ir, 2)
815 rho_set%rhoa(ia, ir, 1) = 0.5_dp*rho(ia, ir, 1)
816 rho_set%rhob(ia, ir, 1) = rho_set%rhoa(ia, ir, 1)
819 rho_set%owns%rho_spin = .true.
820 rho_set%has%rho_spin = .true.
823 IF (needs%norm_drho)
THEN
824 IF (.NOT. tddft_split)
THEN
826 rho_set%norm_drho(ia, ir, 1) = sqrt( &
827 (drho(1, ia, ir, 1) + drho(1, ia, ir, 2))**2 + &
828 (drho(2, ia, ir, 1) + drho(2, ia, ir, 2))**2 + &
829 (drho(3, ia, ir, 1) + drho(3, ia, ir, 2))**2)
833 rho_set%norm_drho(ia, ir, 1) = drho(4, ia, ir, 1)
836 rho_set%owns%norm_drho = .true.
837 rho_set%has%norm_drho = .true.
840 IF (needs%norm_drho_spin)
THEN
841 IF (.NOT. tddft_split)
THEN
843 rho_set%norm_drhoa(ia, ir, 1) = drho(4, ia, ir, 1)
844 rho_set%norm_drhob(ia, ir, 1) = drho(4, ia, ir, 2)
848 rho_set%norm_drhoa(ia, ir, 1) = 0.5_dp*drho(4, ia, ir, 1)
849 rho_set%norm_drhob(ia, ir, 1) = rho_set%norm_drhoa(ia, ir, 1)
852 rho_set%owns%norm_drho_spin = .true.
853 rho_set%has%norm_drho_spin = .true.
857 IF (.NOT. tddft_split)
THEN
860 rho_set%drho(idir)%array(ia, ir, 1) = drho(idir, ia, ir, 1) + drho(idir, ia, ir, 2)
866 rho_set%drho(idir)%array(ia, ir, 1) = drho(idir, ia, ir, 1)
870 rho_set%owns%drho = .true.
871 rho_set%has%drho = .true.
874 IF (needs%drho_spin)
THEN
875 IF (.NOT. tddft_split)
THEN
878 rho_set%drhoa(idir)%array(ia, ir, 1) = drho(idir, ia, ir, 1)
879 rho_set%drhob(idir)%array(ia, ir, 1) = drho(idir, ia, ir, 2)
885 rho_set%drhoa(idir)%array(ia, ir, 1) = 0.5_dp*drho(idir, ia, ir, 1)
886 rho_set%drhob(idir)%array(ia, ir, 1) = rho_set%drhoa(idir)%array(ia, ir, 1)
890 rho_set%owns%drho_spin = .true.
891 rho_set%has%drho_spin = .true.
897 IF (needs%tau .OR. needs%tau_spin)
THEN
898 cpassert(
SIZE(tau, 3) == my_nspins)
901 IF (my_nspins == 2)
THEN
903 rho_set%tau(ia, ir, 1) = tau(ia, ir, 1) + tau(ia, ir, 2)
905 rho_set%owns%tau = .true.
906 rho_set%has%tau = .true.
909 rho_set%tau(ia, ir, 1) = tau(ia, ir, 1)
911 rho_set%owns%tau = .true.
912 rho_set%has%tau = .true.
915 IF (needs%tau_spin)
THEN
917 rho_set%tau_a(ia, ir, 1) = tau(ia, ir, 1)
918 rho_set%tau_b(ia, ir, 1) = tau(ia, ir, 2)
920 rho_set%owns%tau_spin = .true.
921 rho_set%has%tau_spin = .true.