67 rho, gradient, hessian)
68 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: point, center
71 REAL(
dp),
INTENT(OUT) :: rho
72 REAL(
dp),
DIMENSION(3),
INTENT(OUT) :: gradient
73 REAL(
dp),
DIMENSION(3, 3),
INTENT(OUT) :: hessian
75 INTEGER :: ic, idir, iexp, jdir, n_nlcc, nexp_nlcc, &
77 INTEGER,
DIMENSION(:),
POINTER :: nct_nlcc
78 LOGICAL :: has_sgp_nlcc, nlcc_present
79 REAL(
dp) :: alpha, beta, d2poly, dpoly, exponential, &
80 poly, r2, rho_x, rho_xx, scaled_r2
81 REAL(
dp),
DIMENSION(3) :: displacement
82 REAL(
dp),
DIMENSION(:),
POINTER :: a_nlcc, alpha_nlcc, c_nlcc
83 REAL(
dp),
DIMENSION(:, :),
POINTER :: cval_nlcc
85 NULLIFY (a_nlcc, alpha_nlcc, c_nlcc, cval_nlcc, nct_nlcc)
89 displacement = point - center
90 r2 = dot_product(displacement, displacement)
92 IF (
ASSOCIATED(gth_potential))
THEN
93 CALL get_potential(gth_potential, nlcc_present=nlcc_present, &
94 nexp_nlcc=nexp_nlcc, alpha_nlcc=alpha_nlcc, &
95 nct_nlcc=nct_nlcc, cval_nlcc=cval_nlcc)
96 IF (nlcc_present)
THEN
97 DO iexp = 1, nexp_nlcc
98 alpha = alpha_nlcc(iexp)
99 beta = 0.5_dp/(alpha*alpha)
100 scaled_r2 = r2/(alpha*alpha)
101 exponential = exp(-0.5_dp*scaled_r2)
102 DO ic = 1, nct_nlcc(iexp)
104 poly = cval_nlcc(ic, iexp)*scaled_r2**power
107 dpoly = cval_nlcc(ic, iexp)*real(power,
dp)* &
108 scaled_r2**(power - 1)/(alpha*alpha)
112 d2poly = cval_nlcc(ic, iexp)*real(power*(power - 1),
dp)* &
113 scaled_r2**(power - 2)/(alpha**4)
115 rho = rho + exponential*poly
116 rho_x = rho_x + exponential*(dpoly - beta*poly)
117 rho_xx = rho_xx + exponential*(d2poly - 2.0_dp*beta*dpoly + beta*beta*poly)
121 ELSE IF (
ASSOCIATED(sgp_potential))
THEN
123 a_nlcc=a_nlcc, c_nlcc=c_nlcc)
124 IF (has_sgp_nlcc)
THEN
126 exponential = exp(-a_nlcc(iexp)*r2)
127 rho = rho + c_nlcc(iexp)*exponential
128 rho_x = rho_x - a_nlcc(iexp)*c_nlcc(iexp)*exponential
129 rho_xx = rho_xx + a_nlcc(iexp)**2*c_nlcc(iexp)*exponential
134 gradient = 2.0_dp*rho_x*displacement
137 hessian(idir, jdir) = 4.0_dp*rho_xx*displacement(idir)*displacement(jdir)
139 hessian(idir, idir) = hessian(idir, idir) + 2.0_dp*rho_x
215 ir, r_h, r_s, rho_h, rho_s, &
216 dr_h, dr_s, r_h_d, r_s_d, drho_h, drho_s)
220 INTEGER,
INTENT(IN) :: nspins
221 LOGICAL,
INTENT(IN) :: grad_func
222 INTEGER,
INTENT(IN) :: ir
224 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: rho_h, rho_s
227 REAL(kind=
dp),
DIMENSION(:, :, :, :),
POINTER :: drho_h, drho_s
229 INTEGER :: ia, iso, ispin, na
230 REAL(kind=
dp) :: rad, urad
232 cpassert(
ASSOCIATED(r_h))
233 cpassert(
ASSOCIATED(r_s))
234 cpassert(
ASSOCIATED(rho_h))
235 cpassert(
ASSOCIATED(rho_s))
237 cpassert(
ASSOCIATED(dr_h))
238 cpassert(
ASSOCIATED(dr_s))
239 cpassert(
ASSOCIATED(r_h_d))
240 cpassert(
ASSOCIATED(r_s_d))
241 cpassert(
ASSOCIATED(drho_h))
242 cpassert(
ASSOCIATED(drho_s))
245 na = grid_atom%ng_sphere
246 rad = grid_atom%rad(ir)
247 urad = grid_atom%oorad2l(ir, 1)
249 DO iso = 1, harmonics%max_iso_not0
251 rho_h(ia, ir, ispin) = rho_h(ia, ir, ispin) + &
252 r_h(ispin)%r_coef(ir, iso)*harmonics%slm(ia, iso)
253 rho_s(ia, ir, ispin) = rho_s(ia, ir, ispin) + &
254 r_s(ispin)%r_coef(ir, iso)*harmonics%slm(ia, iso)
261 DO iso = 1, harmonics%max_iso_not0
265 drho_h(1, ia, ir, ispin) = drho_h(1, ia, ir, ispin) + &
266 dr_h(ispin)%r_coef(ir, iso)* &
267 harmonics%a(1, ia)*harmonics%slm(ia, iso) + &
268 r_h_d(1, ispin)%r_coef(ir, iso)* &
269 harmonics%slm(ia, iso)
271 drho_h(2, ia, ir, ispin) = drho_h(2, ia, ir, ispin) + &
272 dr_h(ispin)%r_coef(ir, iso)* &
273 harmonics%a(2, ia)*harmonics%slm(ia, iso) + &
274 r_h_d(2, ispin)%r_coef(ir, iso)* &
275 harmonics%slm(ia, iso)
277 drho_h(3, ia, ir, ispin) = drho_h(3, ia, ir, ispin) + &
278 dr_h(ispin)%r_coef(ir, iso)* &
279 harmonics%a(3, ia)*harmonics%slm(ia, iso) + &
280 r_h_d(3, ispin)%r_coef(ir, iso)* &
281 harmonics%slm(ia, iso)
284 drho_s(1, ia, ir, ispin) = drho_s(1, ia, ir, ispin) + &
285 dr_s(ispin)%r_coef(ir, iso)* &
286 harmonics%a(1, ia)*harmonics%slm(ia, iso) + &
287 r_s_d(1, ispin)%r_coef(ir, iso)* &
288 harmonics%slm(ia, iso)
290 drho_s(2, ia, ir, ispin) = drho_s(2, ia, ir, ispin) + &
291 dr_s(ispin)%r_coef(ir, iso)* &
292 harmonics%a(2, ia)*harmonics%slm(ia, iso) + &
293 r_s_d(2, ispin)%r_coef(ir, iso)* &
294 harmonics%slm(ia, iso)
296 drho_s(3, ia, ir, ispin) = drho_s(3, ia, ir, ispin) + &
297 dr_s(ispin)%r_coef(ir, iso)* &
298 harmonics%a(3, ia)*harmonics%slm(ia, iso) + &
299 r_s_d(3, ispin)%r_coef(ir, iso)* &
300 harmonics%slm(ia, iso)
305 drho_h(4, ia, ir, ispin) = sqrt( &
306 drho_h(1, ia, ir, ispin)*drho_h(1, ia, ir, ispin) + &
307 drho_h(2, ia, ir, ispin)*drho_h(2, ia, ir, ispin) + &
308 drho_h(3, ia, ir, ispin)*drho_h(3, ia, ir, ispin))
310 drho_s(4, ia, ir, ispin) = sqrt( &
311 drho_s(1, ia, ir, ispin)*drho_s(1, ia, ir, ispin) + &
312 drho_s(2, ia, ir, ispin)*drho_s(2, ia, ir, ispin) + &
313 drho_s(3, ia, ir, ispin)*drho_s(3, ia, ir, ispin))
334 INTEGER :: dir, ia, igrid, ip, ipgf, ir, iset, iso, &
336 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: a1, a2, gexp, r1, r2
337 REAL(
dp),
DIMENSION(:, :),
POINTER :: slm
338 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: dslm_dxyz
340 NULLIFY (slm, dslm_dxyz)
345 lmin=tau_cache%lmin, maxso=tau_cache%maxso, &
346 npgf=tau_cache%npgf, nset=tau_cache%nset, &
349 n2oindex=tau_cache%n2oindex, &
350 nsatbas=tau_cache%nsatbas)
352 tau_cache%nr = grid_atom%nr
353 tau_cache%na = grid_atom%ng_sphere
355 dslm_dxyz => harmonics%dslm_dxyz
357 ALLOCATE (tau_cache%grad(tau_cache%na*tau_cache%nr, tau_cache%nsatbas, 3))
358 ALLOCATE (a1(tau_cache%na), a2(tau_cache%na), gexp(tau_cache%nr), &
359 r1(tau_cache%nr), r2(tau_cache%nr))
360 tau_cache%grad = 0.0_dp
362 DO iset = 1, tau_cache%nset
363 DO ipgf = 1, tau_cache%npgf(iset)
364 starti = (iset - 1)*tau_cache%maxso + &
365 (ipgf - 1)*
nsoset(tau_cache%lmax(iset))
366 gexp(1:tau_cache%nr) = exp(-tau_cache%zet(ipgf, iset)* &
367 grid_atom%rad2(1:tau_cache%nr))
368 DO iso =
nsoset(tau_cache%lmin(iset) - 1) + 1,
nsoset(tau_cache%lmax(iset))
369 ip = tau_cache%o2nindex(starti + iso)
373 r1(1:tau_cache%nr) = grid_atom%rad(1:tau_cache%nr)**(l - 1)*gexp(1:tau_cache%nr)
374 r2(1:tau_cache%nr) = -2.0_dp*tau_cache%zet(ipgf, iset)* &
375 grid_atom%rad2(1:tau_cache%nr)*r1(1:tau_cache%nr)
378 a1(1:tau_cache%na) = dslm_dxyz(dir, 1:tau_cache%na, iso)
379 a2(1:tau_cache%na) = harmonics%a(dir, 1:tau_cache%na)*slm(1:tau_cache%na, iso)
380 DO ir = 1, tau_cache%nr
381 DO ia = 1, tau_cache%na
382 igrid = ia + (ir - 1)*tau_cache%na
383 tau_cache%grad(igrid, ip, dir) = r1(ir)*a1(ia) + r2(ir)*a2(ia)
391 DEALLOCATE (a1, a2, gexp, r1, r2)
513 ir, rho_nlcc, rho_h, rho_s, drho_nlcc, drho_h, drho_s)
516 INTEGER,
INTENT(IN) :: nspins
517 LOGICAL,
INTENT(IN) :: grad_func
518 INTEGER,
INTENT(IN) :: ir
519 REAL(kind=
dp),
DIMENSION(:) :: rho_nlcc
520 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: rho_h, rho_s
521 REAL(kind=
dp),
DIMENSION(:) :: drho_nlcc
522 REAL(kind=
dp),
DIMENSION(:, :, :, :),
POINTER :: drho_h, drho_s
524 INTEGER :: ia, ispin, na
525 REAL(kind=
dp) :: drho, dx, dy, dz, rad, rho, urad, xsp
527 cpassert(
ASSOCIATED(rho_h))
528 cpassert(
ASSOCIATED(rho_s))
530 cpassert(
ASSOCIATED(drho_h))
531 cpassert(
ASSOCIATED(drho_s))
534 na = grid_atom%ng_sphere
535 rad = grid_atom%rad(ir)
536 urad = grid_atom%oorad2l(ir, 1)
538 xsp = real(nspins, kind=
dp)
539 rho = rho_nlcc(ir)/xsp
541 rho_h(1:na, ir, ispin) = rho_h(1:na, ir, ispin) + rho
542 rho_s(1:na, ir, ispin) = rho_s(1:na, ir, ispin) + rho
546 drho = drho_nlcc(ir)/xsp
549 IF (grid_atom%azi(ia) == 0.0_dp)
THEN
553 dx = grid_atom%sin_pol(ia)*grid_atom%sin_azi(ia)
554 dy = grid_atom%sin_pol(ia)*grid_atom%cos_azi(ia)
556 dz = grid_atom%cos_pol(ia)
558 drho_h(1, ia, ir, ispin) = drho_h(1, ia, ir, ispin) + drho*dx
559 drho_h(2, ia, ir, ispin) = drho_h(2, ia, ir, ispin) + drho*dy
560 drho_h(3, ia, ir, ispin) = drho_h(3, ia, ir, ispin) + drho*dz
562 drho_s(1, ia, ir, ispin) = drho_s(1, ia, ir, ispin) + drho*dx
563 drho_s(2, ia, ir, ispin) = drho_s(2, ia, ir, ispin) + drho*dy
564 drho_s(3, ia, ir, ispin) = drho_s(3, ia, ir, ispin) + drho*dz
566 drho_h(4, ia, ir, ispin) = sqrt( &
567 drho_h(1, ia, ir, ispin)*drho_h(1, ia, ir, ispin) + &
568 drho_h(2, ia, ir, ispin)*drho_h(2, ia, ir, ispin) + &
569 drho_h(3, ia, ir, ispin)*drho_h(3, ia, ir, ispin))
571 drho_s(4, ia, ir, ispin) = sqrt( &
572 drho_s(1, ia, ir, ispin)*drho_s(1, ia, ir, ispin) + &
573 drho_s(2, ia, ir, ispin)*drho_s(2, ia, ir, ispin) + &
574 drho_s(3, ia, ir, ispin)*drho_s(3, ia, ir, ispin))
592 SUBROUTINE gavxcgb_nogc(vxc_h, vxc_s, int_hh, int_ss, grid_atom, basis_1c, harmonics, nspins)
594 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: vxc_h, vxc_s
599 INTEGER,
INTENT(IN) :: nspins
601 CHARACTER(len=*),
PARAMETER :: routinen =
'gaVxcgb_noGC'
603 INTEGER :: handle, ia, ic, icg, ipgf1, ipgf2, ir, iset1, iset2, iso, iso1, iso2, ispin, l, &
604 ld, lmax12, lmax_expansion, lmin12, m1, m2, max_iso_not0, max_iso_not0_local, max_s_harm, &
605 maxl, maxso, n1, n2, na, ngau1, ngau2, nngau1, nr, nset, size1
606 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: cg_n_list
607 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :) :: cg_list
608 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf
609 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: g1, g2
610 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: gg, gvg_h, gvg_s, matso_h, matso_s, vx
611 REAL(
dp),
DIMENSION(:, :),
POINTER :: zet
612 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: my_cg
614 CALL timeset(routinen, handle)
616 NULLIFY (lmin, lmax, npgf, zet, my_cg)
619 maxso=maxso, maxl=maxl, npgf=npgf, &
623 na = grid_atom%ng_sphere
624 my_cg => harmonics%my_CG
625 max_iso_not0 = harmonics%max_iso_not0
626 lmax_expansion =
indso(1, max_iso_not0)
627 max_s_harm = harmonics%max_s_harm
629 ALLOCATE (g1(nr), g2(nr), gg(nr, 0:2*maxl))
630 ALLOCATE (gvg_h(na, 0:2*maxl), gvg_s(na, 0:2*maxl))
633 ALLOCATE (vx(na, nr))
634 ALLOCATE (cg_list(2,
nsoset(maxl)**2, max_s_harm), cg_n_list(max_s_harm))
643 CALL get_none0_cg_list(my_cg, lmin(iset1), lmax(iset1), lmin(iset2), lmax(iset2), &
644 max_s_harm, lmax_expansion, cg_list, cg_n_list, max_iso_not0_local)
645 cpassert(max_iso_not0_local <= max_iso_not0)
648 DO ipgf1 = 1, npgf(iset1)
649 ngau1 = n1*(ipgf1 - 1) + m1
651 nngau1 =
nsoset(lmin(iset1) - 1) + ngau1
653 g1(1:nr) = exp(-zet(ipgf1, iset1)*grid_atom%rad2(1:nr))
654 DO ipgf2 = 1, npgf(iset2)
655 ngau2 = n2*(ipgf2 - 1) + m2
657 g2(1:nr) = exp(-zet(ipgf2, iset2)*grid_atom%rad2(1:nr))
658 lmin12 = lmin(iset1) + lmin(iset2)
659 lmax12 = lmax(iset1) + lmax(iset2)
662 IF (lmin12 <= lmax_expansion)
THEN
665 IF (lmin12 == 0)
THEN
666 gg(1:nr, lmin12) = g1(1:nr)*g2(1:nr)
668 gg(1:nr, lmin12) = grid_atom%rad2l(1:nr, lmin12)*g1(1:nr)*g2(1:nr)
672 IF (lmax12 > lmax_expansion) lmax12 = lmax_expansion
674 DO l = lmin12 + 1, lmax12
675 gg(1:nr, l) = grid_atom%rad(1:nr)*gg(:, l - 1)
681 vx(1:na, ir) = vxc_h(1:na, ir, ispin)
683 CALL dgemm(
'N',
'N', na, ld, nr, 1.0_dp, vx(1:na, 1:nr), na, &
684 gg(1:nr, 0:lmax12), nr, 0.0_dp, gvg_h(1:na, 0:lmax12), na)
686 vx(1:na, ir) = vxc_s(1:na, ir, ispin)
688 CALL dgemm(
'N',
'N', na, ld, nr, 1.0_dp, vx(1:na, 1:nr), na, &
689 gg(1:nr, 0:lmax12), nr, 0.0_dp, gvg_s(1:na, 0:lmax12), na)
693 DO iso = 1, max_iso_not0_local
694 DO icg = 1, cg_n_list(iso)
695 iso1 = cg_list(1, icg, iso)
696 iso2 = cg_list(2, icg, iso)
699 cpassert(l <= lmax_expansion)
701 matso_h(iso1, iso2) = matso_h(iso1, iso2) + &
703 my_cg(iso1, iso2, iso)* &
704 harmonics%slm(ia, iso)
705 matso_s(iso1, iso2) = matso_s(iso1, iso2) + &
707 my_cg(iso1, iso2, iso)* &
708 harmonics%slm(ia, iso)
714 DO ic =
nsoset(lmin(iset2) - 1) + 1,
nsoset(lmax(iset2))
715 iso1 =
nsoset(lmin(iset1) - 1) + 1
717 CALL daxpy(size1, 1.0_dp, matso_h(iso1, ic), 1, &
718 int_hh(ispin)%r_coef(nngau1 + 1, iso2), 1)
719 CALL daxpy(size1, 1.0_dp, matso_s(iso1, ic), 1, &
720 int_ss(ispin)%r_coef(nngau1 + 1, iso2), 1)
734 DEALLOCATE (g1, g2, gg, matso_h, matso_s, gvg_s, gvg_h, vx)
736 DEALLOCATE (cg_list, cg_n_list)
738 CALL timestop(handle)
755 SUBROUTINE gavxcgb_gc(vxc_h, vxc_s, vxg_h, vxg_s, int_hh, int_ss, &
756 grid_atom, basis_1c, harmonics, nspins)
758 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: vxc_h, vxc_s
759 REAL(
dp),
DIMENSION(:, :, :, :),
POINTER :: vxg_h, vxg_s
764 INTEGER,
INTENT(IN) :: nspins
766 CHARACTER(len=*),
PARAMETER :: routinen =
'gaVxcgb_GC'
768 INTEGER :: dmax_iso_not0_local, handle, ia, ic, icg, ipgf1, ipgf2, ir, iset1, iset2, iso, &
769 iso1, iso2, ispin, l, lmax12, lmax_expansion, lmin12, m1, m2, max_iso_not0, &
770 max_iso_not0_local, max_s_harm, maxl, maxso, n1, n2, na, ngau1, ngau2, nngau1, nr, nset, &
772 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: cg_n_list, dcg_n_list
773 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :) :: cg_list, dcg_list
774 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf
776 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: g1, g2
777 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: dgg, gg, gvxcg_h, gvxcg_s, matso_h, &
779 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: gvxgg_h, gvxgg_s
780 REAL(
dp),
DIMENSION(:, :),
POINTER :: zet
781 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: my_cg
782 REAL(
dp),
DIMENSION(:, :, :, :),
POINTER :: my_cg_dxyz
784 CALL timeset(routinen, handle)
786 NULLIFY (lmin, lmax, npgf, zet, my_cg, my_cg_dxyz)
789 maxso=maxso, maxl=maxl, npgf=npgf, &
793 na = grid_atom%ng_sphere
794 my_cg => harmonics%my_CG
795 my_cg_dxyz => harmonics%my_CG_dxyz
796 max_iso_not0 = harmonics%max_iso_not0
797 lmax_expansion =
indso(1, max_iso_not0)
798 max_s_harm = harmonics%max_s_harm
800 ALLOCATE (g1(nr), g2(nr), gg(nr, 0:2*maxl), dgg(nr, 0:2*maxl))
801 ALLOCATE (gvxcg_h(na, 0:2*maxl), gvxcg_s(na, 0:2*maxl))
802 ALLOCATE (gvxgg_h(3, na, 0:2*maxl), gvxgg_s(3, na, 0:2*maxl))
803 ALLOCATE (cg_list(2,
nsoset(maxl)**2, max_s_harm), cg_n_list(max_s_harm), &
804 dcg_list(2,
nsoset(maxl)**2, max_s_harm), dcg_n_list(max_s_harm))
818 CALL get_none0_cg_list(my_cg, lmin(iset1), lmax(iset1), lmin(iset2), lmax(iset2), &
819 max_s_harm, lmax_expansion, cg_list, cg_n_list, max_iso_not0_local)
820 cpassert(max_iso_not0_local <= max_iso_not0)
821 CALL get_none0_cg_list(my_cg_dxyz, lmin(iset1), lmax(iset1), lmin(iset2), lmax(iset2), &
822 max_s_harm, lmax_expansion, dcg_list, dcg_n_list, dmax_iso_not0_local)
825 DO ipgf1 = 1, npgf(iset1)
826 ngau1 = n1*(ipgf1 - 1) + m1
828 nngau1 =
nsoset(lmin(iset1) - 1) + ngau1
830 g1(1:nr) = exp(-zet(ipgf1, iset1)*grid_atom%rad2(1:nr))
831 DO ipgf2 = 1, npgf(iset2)
832 ngau2 = n2*(ipgf2 - 1) + m2
834 g2(1:nr) = exp(-zet(ipgf2, iset2)*grid_atom%rad2(1:nr))
835 lmin12 = lmin(iset1) + lmin(iset2)
836 lmax12 = lmax(iset1) + lmax(iset2)
839 IF (lmin12 <= lmax_expansion)
THEN
844 IF (lmin12 == 0)
THEN
845 gg(1:nr, lmin12) = g1(1:nr)*g2(1:nr)
847 gg(1:nr, lmin12) = grid_atom%rad2l(1:nr, lmin12)*g1(1:nr)*g2(1:nr)
851 IF (lmax12 > lmax_expansion) lmax12 = lmax_expansion
853 DO l = lmin12 + 1, lmax12
854 gg(1:nr, l) = grid_atom%rad(1:nr)*gg(:, l - 1)
855 dgg(1:nr, l - 1) = dgg(1:nr, l - 1) - 2.0_dp*(zet(ipgf1, iset1) + &
856 zet(ipgf2, iset2))*gg(1:nr, l)
858 dgg(1:nr, lmax12) = dgg(1:nr, lmax12) - 2.0_dp*(zet(ipgf1, iset1) + &
859 zet(ipgf2, iset2))*grid_atom%rad(1:nr)* &
868 DO l = lmin12, lmax12
871 gvxcg_h(ia, l) = gvxcg_h(ia, l) + &
872 gg(ir, l)*vxc_h(ia, ir, ispin) + &
874 (vxg_h(1, ia, ir, ispin)*harmonics%a(1, ia) + &
875 vxg_h(2, ia, ir, ispin)*harmonics%a(2, ia) + &
876 vxg_h(3, ia, ir, ispin)*harmonics%a(3, ia))
878 gvxcg_s(ia, l) = gvxcg_s(ia, l) + &
879 gg(ir, l)*vxc_s(ia, ir, ispin) + &
881 (vxg_s(1, ia, ir, ispin)*harmonics%a(1, ia) + &
882 vxg_s(2, ia, ir, ispin)*harmonics%a(2, ia) + &
883 vxg_s(3, ia, ir, ispin)*harmonics%a(3, ia))
885 urad = grid_atom%oorad2l(ir, 1)
887 gvxgg_h(1, ia, l) = gvxgg_h(1, ia, l) + &
888 vxg_h(1, ia, ir, ispin)* &
891 gvxgg_h(2, ia, l) = gvxgg_h(2, ia, l) + &
892 vxg_h(2, ia, ir, ispin)* &
895 gvxgg_h(3, ia, l) = gvxgg_h(3, ia, l) + &
896 vxg_h(3, ia, ir, ispin)* &
899 gvxgg_s(1, ia, l) = gvxgg_s(1, ia, l) + &
900 vxg_s(1, ia, ir, ispin)* &
903 gvxgg_s(2, ia, l) = gvxgg_s(2, ia, l) + &
904 vxg_s(2, ia, ir, ispin)* &
907 gvxgg_s(3, ia, l) = gvxgg_s(3, ia, l) + &
908 vxg_s(3, ia, ir, ispin)* &
917 DO iso = 1, max_iso_not0_local
918 DO icg = 1, cg_n_list(iso)
919 iso1 = cg_list(1, icg, iso)
920 iso2 = cg_list(2, icg, iso)
925 cpassert(l <= lmax_expansion)
927 matso_h(iso1, iso2) = matso_h(iso1, iso2) + &
929 harmonics%slm(ia, iso)* &
930 my_cg(iso1, iso2, iso)
931 matso_s(iso1, iso2) = matso_s(iso1, iso2) + &
933 harmonics%slm(ia, iso)* &
934 my_cg(iso1, iso2, iso)
943 DO iso = 1, dmax_iso_not0_local
944 DO icg = 1, dcg_n_list(iso)
945 iso1 = dcg_list(1, icg, iso)
946 iso2 = dcg_list(2, icg, iso)
950 cpassert(l <= lmax_expansion)
952 matso_h(iso1, iso2) = matso_h(iso1, iso2) + &
953 (gvxgg_h(1, ia, l)*my_cg_dxyz(1, iso1, iso2, iso) + &
954 gvxgg_h(2, ia, l)*my_cg_dxyz(2, iso1, iso2, iso) + &
955 gvxgg_h(3, ia, l)*my_cg_dxyz(3, iso1, iso2, iso))* &
956 harmonics%slm(ia, iso)
958 matso_s(iso1, iso2) = matso_s(iso1, iso2) + &
959 (gvxgg_s(1, ia, l)*my_cg_dxyz(1, iso1, iso2, iso) + &
960 gvxgg_s(2, ia, l)*my_cg_dxyz(2, iso1, iso2, iso) + &
961 gvxgg_s(3, ia, l)*my_cg_dxyz(3, iso1, iso2, iso))* &
962 harmonics%slm(ia, iso)
974 DO ic =
nsoset(lmin(iset2) - 1) + 1,
nsoset(lmax(iset2))
975 iso1 =
nsoset(lmin(iset1) - 1) + 1
977 CALL daxpy(size1, 1.0_dp, matso_h(iso1, ic), 1, &
978 int_hh(ispin)%r_coef(nngau1 + 1, iso2), 1)
979 CALL daxpy(size1, 1.0_dp, matso_s(iso1, ic), 1, &
980 int_ss(ispin)%r_coef(nngau1 + 1, iso2), 1)
991 DEALLOCATE (g1, g2, gg, dgg, matso_h, matso_s, gvxcg_h, gvxcg_s, gvxgg_h, gvxgg_s)
992 DEALLOCATE (cg_list, cg_n_list, dcg_list, dcg_n_list)
994 CALL timestop(handle)
1009 SUBROUTINE dgavtaudgb(vtau_h, vtau_s, int_hh, int_ss, tau_cache, nspins)
1011 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: vtau_h, vtau_s
1014 INTEGER,
INTENT(IN) :: nspins
1016 CHARACTER(len=*),
PARAMETER :: routinen =
'dgaVtaudgb'
1018 INTEGER :: dir, handle, ia, ibas, igrid, iold, ir, &
1019 ispin, jbas, jold, max_old_basis, na, &
1021 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: int_h, int_s, weighted_grad
1023 CALL timeset(routinen, handle)
1025 cpassert(
ALLOCATED(tau_cache%grad))
1026 cpassert(
ASSOCIATED(tau_cache%n2oindex))
1030 nbas = tau_cache%nsatbas
1032 max_old_basis = maxval(tau_cache%n2oindex)
1033 ALLOCATE (int_h(nbas, nbas), int_s(nbas, nbas), weighted_grad(ngrid, nbas))
1035 DO ispin = 1, nspins
1036 cpassert(
SIZE(int_hh(ispin)%r_coef, 1) >= max_old_basis)
1037 cpassert(
SIZE(int_hh(ispin)%r_coef, 2) >= max_old_basis)
1038 cpassert(
SIZE(int_ss(ispin)%r_coef, 1) >= max_old_basis)
1039 cpassert(
SIZE(int_ss(ispin)%r_coef, 2) >= max_old_basis)
1049 igrid = ia + (ir - 1)*na
1050 weighted_grad(igrid, ibas) = vtau_h(ia, ir, ispin)* &
1051 tau_cache%grad(igrid, ibas, dir)
1056 CALL dgemm(
'T',
'N', nbas, nbas, ngrid, 0.5_dp, tau_cache%grad(:, :, dir), &
1057 ngrid, weighted_grad, ngrid, 1.0_dp, int_h, nbas)
1065 igrid = ia + (ir - 1)*na
1066 weighted_grad(igrid, ibas) = vtau_s(ia, ir, ispin)* &
1067 tau_cache%grad(igrid, ibas, dir)
1072 CALL dgemm(
'T',
'N', nbas, nbas, ngrid, 0.5_dp, tau_cache%grad(:, :, dir), &
1073 ngrid, weighted_grad, ngrid, 1.0_dp, int_s, nbas)
1081 jold = tau_cache%n2oindex(jbas)
1082 iold = tau_cache%n2oindex(ibas)
1083 int_hh(ispin)%r_coef(iold, jold) = int_hh(ispin)%r_coef(iold, jold) + &
1085 int_ss(ispin)%r_coef(iold, jold) = int_ss(ispin)%r_coef(iold, jold) + &
1092 DEALLOCATE (int_h, int_s, weighted_grad)
1094 CALL timestop(handle)
subroutine, public get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius, npgf_seg_sum, ccon)
...