69 rho, gradient, hessian)
70 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: point, center
73 REAL(
dp),
INTENT(OUT) :: rho
74 REAL(
dp),
DIMENSION(3),
INTENT(OUT) :: gradient
75 REAL(
dp),
DIMENSION(3, 3),
INTENT(OUT) :: hessian
77 INTEGER :: ic, idir, iexp, jdir, n_nlcc, nexp_nlcc, &
79 INTEGER,
DIMENSION(:),
POINTER :: nct_nlcc
80 LOGICAL :: has_sgp_nlcc, nlcc_present
81 REAL(
dp) :: alpha, beta, d2poly, dpoly, exponential, &
82 poly, r2, rho_x, rho_xx, scaled_r2
83 REAL(
dp),
DIMENSION(3) :: displacement
84 REAL(
dp),
DIMENSION(:),
POINTER :: a_nlcc, alpha_nlcc, c_nlcc
85 REAL(
dp),
DIMENSION(:, :),
POINTER :: cval_nlcc
87 NULLIFY (a_nlcc, alpha_nlcc, c_nlcc, cval_nlcc, nct_nlcc)
91 displacement = point - center
92 r2 = dot_product(displacement, displacement)
94 IF (
ASSOCIATED(gth_potential))
THEN
95 CALL get_potential(gth_potential, nlcc_present=nlcc_present, &
96 nexp_nlcc=nexp_nlcc, alpha_nlcc=alpha_nlcc, &
97 nct_nlcc=nct_nlcc, cval_nlcc=cval_nlcc)
98 IF (nlcc_present)
THEN
99 DO iexp = 1, nexp_nlcc
100 alpha = alpha_nlcc(iexp)
101 beta = 0.5_dp/(alpha*alpha)
102 scaled_r2 = r2/(alpha*alpha)
103 exponential = exp(-0.5_dp*scaled_r2)
104 DO ic = 1, nct_nlcc(iexp)
106 poly = cval_nlcc(ic, iexp)*scaled_r2**power
109 dpoly = cval_nlcc(ic, iexp)*real(power,
dp)* &
110 scaled_r2**(power - 1)/(alpha*alpha)
114 d2poly = cval_nlcc(ic, iexp)*real(power*(power - 1),
dp)* &
115 scaled_r2**(power - 2)/(alpha**4)
117 rho = rho + exponential*poly
118 rho_x = rho_x + exponential*(dpoly - beta*poly)
119 rho_xx = rho_xx + exponential*(d2poly - 2.0_dp*beta*dpoly + beta*beta*poly)
123 ELSE IF (
ASSOCIATED(sgp_potential))
THEN
125 a_nlcc=a_nlcc, c_nlcc=c_nlcc)
126 IF (has_sgp_nlcc)
THEN
128 exponential = exp(-a_nlcc(iexp)*r2)
129 rho = rho + c_nlcc(iexp)*exponential
130 rho_x = rho_x - a_nlcc(iexp)*c_nlcc(iexp)*exponential
131 rho_xx = rho_xx + a_nlcc(iexp)**2*c_nlcc(iexp)*exponential
136 gradient = 2.0_dp*rho_x*displacement
139 hessian(idir, jdir) = 4.0_dp*rho_xx*displacement(idir)*displacement(jdir)
141 hessian(idir, idir) = hessian(idir, idir) + 2.0_dp*rho_x
217 ir, r_h, r_s, rho_h, rho_s, &
218 dr_h, dr_s, r_h_d, r_s_d, drho_h, drho_s)
222 INTEGER,
INTENT(IN) :: nspins
223 LOGICAL,
INTENT(IN) :: grad_func
224 INTEGER,
INTENT(IN) :: ir
226 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: rho_h, rho_s
229 REAL(kind=
dp),
DIMENSION(:, :, :, :),
POINTER :: drho_h, drho_s
231 INTEGER :: ia, iso, ispin, na
232 REAL(kind=
dp) :: rad, urad
234 cpassert(
ASSOCIATED(r_h))
235 cpassert(
ASSOCIATED(r_s))
236 cpassert(
ASSOCIATED(rho_h))
237 cpassert(
ASSOCIATED(rho_s))
239 cpassert(
ASSOCIATED(dr_h))
240 cpassert(
ASSOCIATED(dr_s))
241 cpassert(
ASSOCIATED(r_h_d))
242 cpassert(
ASSOCIATED(r_s_d))
243 cpassert(
ASSOCIATED(drho_h))
244 cpassert(
ASSOCIATED(drho_s))
247 na = grid_atom%ng_sphere
248 rad = grid_atom%rad(ir)
249 urad = grid_atom%oorad2l(ir, 1)
251 DO iso = 1, harmonics%max_iso_not0
253 rho_h(ia, ir, ispin) = rho_h(ia, ir, ispin) + &
254 r_h(ispin)%r_coef(ir, iso)*harmonics%slm(ia, iso)
255 rho_s(ia, ir, ispin) = rho_s(ia, ir, ispin) + &
256 r_s(ispin)%r_coef(ir, iso)*harmonics%slm(ia, iso)
263 DO iso = 1, harmonics%max_iso_not0
267 drho_h(1, ia, ir, ispin) = drho_h(1, ia, ir, ispin) + &
268 dr_h(ispin)%r_coef(ir, iso)* &
269 harmonics%a(1, ia)*harmonics%slm(ia, iso) + &
270 r_h_d(1, ispin)%r_coef(ir, iso)* &
271 harmonics%slm(ia, iso)
273 drho_h(2, ia, ir, ispin) = drho_h(2, ia, ir, ispin) + &
274 dr_h(ispin)%r_coef(ir, iso)* &
275 harmonics%a(2, ia)*harmonics%slm(ia, iso) + &
276 r_h_d(2, ispin)%r_coef(ir, iso)* &
277 harmonics%slm(ia, iso)
279 drho_h(3, ia, ir, ispin) = drho_h(3, ia, ir, ispin) + &
280 dr_h(ispin)%r_coef(ir, iso)* &
281 harmonics%a(3, ia)*harmonics%slm(ia, iso) + &
282 r_h_d(3, ispin)%r_coef(ir, iso)* &
283 harmonics%slm(ia, iso)
286 drho_s(1, ia, ir, ispin) = drho_s(1, ia, ir, ispin) + &
287 dr_s(ispin)%r_coef(ir, iso)* &
288 harmonics%a(1, ia)*harmonics%slm(ia, iso) + &
289 r_s_d(1, ispin)%r_coef(ir, iso)* &
290 harmonics%slm(ia, iso)
292 drho_s(2, ia, ir, ispin) = drho_s(2, ia, ir, ispin) + &
293 dr_s(ispin)%r_coef(ir, iso)* &
294 harmonics%a(2, ia)*harmonics%slm(ia, iso) + &
295 r_s_d(2, ispin)%r_coef(ir, iso)* &
296 harmonics%slm(ia, iso)
298 drho_s(3, ia, ir, ispin) = drho_s(3, ia, ir, ispin) + &
299 dr_s(ispin)%r_coef(ir, iso)* &
300 harmonics%a(3, ia)*harmonics%slm(ia, iso) + &
301 r_s_d(3, ispin)%r_coef(ir, iso)* &
302 harmonics%slm(ia, iso)
307 drho_h(4, ia, ir, ispin) = sqrt( &
308 drho_h(1, ia, ir, ispin)*drho_h(1, ia, ir, ispin) + &
309 drho_h(2, ia, ir, ispin)*drho_h(2, ia, ir, ispin) + &
310 drho_h(3, ia, ir, ispin)*drho_h(3, ia, ir, ispin))
312 drho_s(4, ia, ir, ispin) = sqrt( &
313 drho_s(1, ia, ir, ispin)*drho_s(1, ia, ir, ispin) + &
314 drho_s(2, ia, ir, ispin)*drho_s(2, ia, ir, ispin) + &
315 drho_s(3, ia, ir, ispin)*drho_s(3, ia, ir, ispin))
336 INTEGER :: dir, ia, igrid, ip, ipgf, ir, iset, iso, &
338 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: a1, a2, gexp, r1, r2
339 REAL(
dp),
DIMENSION(:, :),
POINTER :: slm
340 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: dslm_dxyz
342 NULLIFY (slm, dslm_dxyz)
347 lmin=tau_cache%lmin, maxso=tau_cache%maxso, &
348 npgf=tau_cache%npgf, nset=tau_cache%nset, &
351 n2oindex=tau_cache%n2oindex, &
352 nsatbas=tau_cache%nsatbas)
354 tau_cache%nr = grid_atom%nr
355 tau_cache%na = grid_atom%ng_sphere
357 dslm_dxyz => harmonics%dslm_dxyz
359 ALLOCATE (tau_cache%grad(tau_cache%na*tau_cache%nr, tau_cache%nsatbas, 3))
360 ALLOCATE (a1(tau_cache%na), a2(tau_cache%na), gexp(tau_cache%nr), &
361 r1(tau_cache%nr), r2(tau_cache%nr))
362 tau_cache%grad = 0.0_dp
364 DO iset = 1, tau_cache%nset
365 DO ipgf = 1, tau_cache%npgf(iset)
366 starti = (iset - 1)*tau_cache%maxso + &
367 (ipgf - 1)*
nsoset(tau_cache%lmax(iset))
368 gexp(1:tau_cache%nr) = exp(-tau_cache%zet(ipgf, iset)* &
369 grid_atom%rad2(1:tau_cache%nr))
370 DO iso =
nsoset(tau_cache%lmin(iset) - 1) + 1,
nsoset(tau_cache%lmax(iset))
371 ip = tau_cache%o2nindex(starti + iso)
375 r1(1:tau_cache%nr) = grid_atom%rad(1:tau_cache%nr)**(l - 1)*gexp(1:tau_cache%nr)
376 r2(1:tau_cache%nr) = -2.0_dp*tau_cache%zet(ipgf, iset)* &
377 grid_atom%rad2(1:tau_cache%nr)*r1(1:tau_cache%nr)
380 a1(1:tau_cache%na) = dslm_dxyz(dir, 1:tau_cache%na, iso)
381 a2(1:tau_cache%na) = harmonics%a(dir, 1:tau_cache%na)*slm(1:tau_cache%na, iso)
382 DO ir = 1, tau_cache%nr
383 DO ia = 1, tau_cache%na
384 igrid = ia + (ir - 1)*tau_cache%na
385 tau_cache%grad(igrid, ip, dir) = r1(ir)*a1(ia) + r2(ir)*a2(ia)
393 DEALLOCATE (a1, a2, gexp, r1, r2)
515 ir, rho_nlcc, rho_h, rho_s, drho_nlcc, drho_h, drho_s)
518 INTEGER,
INTENT(IN) :: nspins
519 LOGICAL,
INTENT(IN) :: grad_func
520 INTEGER,
INTENT(IN) :: ir
521 REAL(kind=
dp),
DIMENSION(:) :: rho_nlcc
522 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: rho_h, rho_s
523 REAL(kind=
dp),
DIMENSION(:) :: drho_nlcc
524 REAL(kind=
dp),
DIMENSION(:, :, :, :),
POINTER :: drho_h, drho_s
526 INTEGER :: ia, ispin, na
527 REAL(kind=
dp) :: drho, dx, dy, dz, rad, rho, urad, xsp
529 cpassert(
ASSOCIATED(rho_h))
530 cpassert(
ASSOCIATED(rho_s))
532 cpassert(
ASSOCIATED(drho_h))
533 cpassert(
ASSOCIATED(drho_s))
536 na = grid_atom%ng_sphere
537 rad = grid_atom%rad(ir)
538 urad = grid_atom%oorad2l(ir, 1)
540 xsp = real(nspins, kind=
dp)
541 rho = rho_nlcc(ir)/xsp
543 rho_h(1:na, ir, ispin) = rho_h(1:na, ir, ispin) + rho
544 rho_s(1:na, ir, ispin) = rho_s(1:na, ir, ispin) + rho
548 drho = drho_nlcc(ir)/xsp
551 IF (grid_atom%azi(ia) == 0.0_dp)
THEN
555 dx = grid_atom%sin_pol(ia)*grid_atom%sin_azi(ia)
556 dy = grid_atom%sin_pol(ia)*grid_atom%cos_azi(ia)
558 dz = grid_atom%cos_pol(ia)
560 drho_h(1, ia, ir, ispin) = drho_h(1, ia, ir, ispin) + drho*dx
561 drho_h(2, ia, ir, ispin) = drho_h(2, ia, ir, ispin) + drho*dy
562 drho_h(3, ia, ir, ispin) = drho_h(3, ia, ir, ispin) + drho*dz
564 drho_s(1, ia, ir, ispin) = drho_s(1, ia, ir, ispin) + drho*dx
565 drho_s(2, ia, ir, ispin) = drho_s(2, ia, ir, ispin) + drho*dy
566 drho_s(3, ia, ir, ispin) = drho_s(3, ia, ir, ispin) + drho*dz
568 drho_h(4, ia, ir, ispin) = sqrt( &
569 drho_h(1, ia, ir, ispin)*drho_h(1, ia, ir, ispin) + &
570 drho_h(2, ia, ir, ispin)*drho_h(2, ia, ir, ispin) + &
571 drho_h(3, ia, ir, ispin)*drho_h(3, ia, ir, ispin))
573 drho_s(4, ia, ir, ispin) = sqrt( &
574 drho_s(1, ia, ir, ispin)*drho_s(1, ia, ir, ispin) + &
575 drho_s(2, ia, ir, ispin)*drho_s(2, ia, ir, ispin) + &
576 drho_s(3, ia, ir, ispin)*drho_s(3, ia, ir, ispin))
594 SUBROUTINE gavxcgb_nogc(vxc_h, vxc_s, int_hh, int_ss, grid_atom, basis_1c, harmonics, nspins)
596 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: vxc_h, vxc_s
601 INTEGER,
INTENT(IN) :: nspins
603 CHARACTER(len=*),
PARAMETER :: routinen =
'gaVxcgb_noGC'
605 INTEGER :: handle, ia, ic, icg, ipgf1, ipgf2, ir, iset1, iset2, iso, iso1, iso2, ispin, l, &
606 ld, lmax12, lmax_expansion, lmin12, m1, m2, max_iso_not0, max_iso_not0_local, max_s_harm, &
607 maxl, maxso, n1, n2, na, ngau1, ngau2, nngau1, nr, nset, size1
608 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: cg_n_list
609 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :) :: cg_list
610 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf
611 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: g1, g2
612 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: gg, gvg_h, gvg_s, matso_h, matso_s, vx
613 REAL(
dp),
DIMENSION(:, :),
POINTER :: zet
614 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: my_cg
616 CALL timeset(routinen, handle)
618 NULLIFY (lmin, lmax, npgf, zet, my_cg)
621 maxso=maxso, maxl=maxl, npgf=npgf, &
625 na = grid_atom%ng_sphere
626 my_cg => harmonics%my_CG
627 max_iso_not0 = harmonics%max_iso_not0
628 lmax_expansion =
indso(1, max_iso_not0)
629 max_s_harm = harmonics%max_s_harm
631 ALLOCATE (g1(nr), g2(nr), gg(nr, 0:2*maxl))
632 ALLOCATE (gvg_h(na, 0:2*maxl), gvg_s(na, 0:2*maxl))
635 ALLOCATE (vx(na, nr))
636 ALLOCATE (cg_list(2,
nsoset(maxl)**2, max_s_harm), cg_n_list(max_s_harm))
645 CALL get_none0_cg_list(my_cg, lmin(iset1), lmax(iset1), lmin(iset2), lmax(iset2), &
646 max_s_harm, lmax_expansion, cg_list, cg_n_list, max_iso_not0_local)
647 cpassert(max_iso_not0_local <= max_iso_not0)
650 DO ipgf1 = 1, npgf(iset1)
651 ngau1 = n1*(ipgf1 - 1) + m1
653 nngau1 =
nsoset(lmin(iset1) - 1) + ngau1
655 g1(1:nr) = exp(-zet(ipgf1, iset1)*grid_atom%rad2(1:nr))
656 DO ipgf2 = 1, npgf(iset2)
657 ngau2 = n2*(ipgf2 - 1) + m2
659 g2(1:nr) = exp(-zet(ipgf2, iset2)*grid_atom%rad2(1:nr))
660 lmin12 = lmin(iset1) + lmin(iset2)
661 lmax12 = lmax(iset1) + lmax(iset2)
664 IF (lmin12 <= lmax_expansion)
THEN
667 IF (lmin12 == 0)
THEN
668 gg(1:nr, lmin12) = g1(1:nr)*g2(1:nr)
670 gg(1:nr, lmin12) = grid_atom%rad2l(1:nr, lmin12)*g1(1:nr)*g2(1:nr)
674 IF (lmax12 > lmax_expansion) lmax12 = lmax_expansion
676 DO l = lmin12 + 1, lmax12
677 gg(1:nr, l) = grid_atom%rad(1:nr)*gg(:, l - 1)
683 vx(1:na, ir) = vxc_h(1:na, ir, ispin)
685 CALL dgemm(
'N',
'N', na, ld, nr, 1.0_dp, vx(1:na, 1:nr), na, &
686 gg(1:nr, 0:lmax12), nr, 0.0_dp, gvg_h(1:na, 0:lmax12), na)
688 vx(1:na, ir) = vxc_s(1:na, ir, ispin)
690 CALL dgemm(
'N',
'N', na, ld, nr, 1.0_dp, vx(1:na, 1:nr), na, &
691 gg(1:nr, 0:lmax12), nr, 0.0_dp, gvg_s(1:na, 0:lmax12), na)
695 DO iso = 1, max_iso_not0_local
696 DO icg = 1, cg_n_list(iso)
697 iso1 = cg_list(1, icg, iso)
698 iso2 = cg_list(2, icg, iso)
701 cpassert(l <= lmax_expansion)
703 matso_h(iso1, iso2) = matso_h(iso1, iso2) + &
705 my_cg(iso1, iso2, iso)* &
706 harmonics%slm(ia, iso)
707 matso_s(iso1, iso2) = matso_s(iso1, iso2) + &
709 my_cg(iso1, iso2, iso)* &
710 harmonics%slm(ia, iso)
716 DO ic =
nsoset(lmin(iset2) - 1) + 1,
nsoset(lmax(iset2))
717 iso1 =
nsoset(lmin(iset1) - 1) + 1
719 CALL daxpy(size1, 1.0_dp, matso_h(iso1, ic), 1, &
720 int_hh(ispin)%r_coef(nngau1 + 1, iso2), 1)
721 CALL daxpy(size1, 1.0_dp, matso_s(iso1, ic), 1, &
722 int_ss(ispin)%r_coef(nngau1 + 1, iso2), 1)
736 DEALLOCATE (g1, g2, gg, matso_h, matso_s, gvg_s, gvg_h, vx)
738 DEALLOCATE (cg_list, cg_n_list)
740 CALL timestop(handle)
757 SUBROUTINE gavxcgb_gc(vxc_h, vxc_s, vxg_h, vxg_s, int_hh, int_ss, &
758 grid_atom, basis_1c, harmonics, nspins)
760 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: vxc_h, vxc_s
761 REAL(
dp),
DIMENSION(:, :, :, :),
POINTER :: vxg_h, vxg_s
766 INTEGER,
INTENT(IN) :: nspins
768 CHARACTER(len=*),
PARAMETER :: routinen =
'gaVxcgb_GC'
770 INTEGER :: dmax_iso_not0_local, handle, ia, ic, icg, ipgf1, ipgf2, ir, iset1, iset2, iso, &
771 iso1, iso2, ispin, l, lmax12, lmax_expansion, lmin12, m1, m2, max_iso_not0, &
772 max_iso_not0_local, max_s_harm, maxl, maxso, n1, n2, na, ngau1, ngau2, nngau1, nr, nset, &
774 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: cg_n_list, dcg_n_list
775 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :) :: cg_list, dcg_list
776 INTEGER,
DIMENSION(:),
POINTER :: lmax, lmin, npgf
778 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: g1, g2
779 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: dgg, gg, gvxcg_h, gvxcg_s, matso_h, &
781 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: gvxgg_h, gvxgg_s
782 REAL(
dp),
DIMENSION(:, :),
POINTER :: zet
783 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: my_cg
784 REAL(
dp),
DIMENSION(:, :, :, :),
POINTER :: my_cg_dxyz
786 CALL timeset(routinen, handle)
788 NULLIFY (lmin, lmax, npgf, zet, my_cg, my_cg_dxyz)
791 maxso=maxso, maxl=maxl, npgf=npgf, &
795 na = grid_atom%ng_sphere
796 my_cg => harmonics%my_CG
797 my_cg_dxyz => harmonics%my_CG_dxyz
798 max_iso_not0 = harmonics%max_iso_not0
799 lmax_expansion =
indso(1, max_iso_not0)
800 max_s_harm = harmonics%max_s_harm
802 ALLOCATE (g1(nr), g2(nr), gg(nr, 0:2*maxl), dgg(nr, 0:2*maxl))
803 ALLOCATE (gvxcg_h(na, 0:2*maxl), gvxcg_s(na, 0:2*maxl))
804 ALLOCATE (gvxgg_h(3, na, 0:2*maxl), gvxgg_s(3, na, 0:2*maxl))
805 ALLOCATE (cg_list(2,
nsoset(maxl)**2, max_s_harm), cg_n_list(max_s_harm), &
806 dcg_list(2,
nsoset(maxl)**2, max_s_harm), dcg_n_list(max_s_harm))
820 CALL get_none0_cg_list(my_cg, lmin(iset1), lmax(iset1), lmin(iset2), lmax(iset2), &
821 max_s_harm, lmax_expansion, cg_list, cg_n_list, max_iso_not0_local)
822 cpassert(max_iso_not0_local <= max_iso_not0)
823 CALL get_none0_cg_list(my_cg_dxyz, lmin(iset1), lmax(iset1), lmin(iset2), lmax(iset2), &
824 max_s_harm, lmax_expansion, dcg_list, dcg_n_list, dmax_iso_not0_local)
827 DO ipgf1 = 1, npgf(iset1)
828 ngau1 = n1*(ipgf1 - 1) + m1
830 nngau1 =
nsoset(lmin(iset1) - 1) + ngau1
832 g1(1:nr) = exp(-zet(ipgf1, iset1)*grid_atom%rad2(1:nr))
833 DO ipgf2 = 1, npgf(iset2)
834 ngau2 = n2*(ipgf2 - 1) + m2
836 g2(1:nr) = exp(-zet(ipgf2, iset2)*grid_atom%rad2(1:nr))
837 lmin12 = lmin(iset1) + lmin(iset2)
838 lmax12 = lmax(iset1) + lmax(iset2)
841 IF (lmin12 <= lmax_expansion)
THEN
846 IF (lmin12 == 0)
THEN
847 gg(1:nr, lmin12) = g1(1:nr)*g2(1:nr)
849 gg(1:nr, lmin12) = grid_atom%rad2l(1:nr, lmin12)*g1(1:nr)*g2(1:nr)
853 IF (lmax12 > lmax_expansion) lmax12 = lmax_expansion
855 DO l = lmin12 + 1, lmax12
856 gg(1:nr, l) = grid_atom%rad(1:nr)*gg(:, l - 1)
857 dgg(1:nr, l - 1) = dgg(1:nr, l - 1) - 2.0_dp*(zet(ipgf1, iset1) + &
858 zet(ipgf2, iset2))*gg(1:nr, l)
860 dgg(1:nr, lmax12) = dgg(1:nr, lmax12) - 2.0_dp*(zet(ipgf1, iset1) + &
861 zet(ipgf2, iset2))*grid_atom%rad(1:nr)* &
870 DO l = lmin12, lmax12
873 gvxcg_h(ia, l) = gvxcg_h(ia, l) + &
874 gg(ir, l)*vxc_h(ia, ir, ispin) + &
876 (vxg_h(1, ia, ir, ispin)*harmonics%a(1, ia) + &
877 vxg_h(2, ia, ir, ispin)*harmonics%a(2, ia) + &
878 vxg_h(3, ia, ir, ispin)*harmonics%a(3, ia))
880 gvxcg_s(ia, l) = gvxcg_s(ia, l) + &
881 gg(ir, l)*vxc_s(ia, ir, ispin) + &
883 (vxg_s(1, ia, ir, ispin)*harmonics%a(1, ia) + &
884 vxg_s(2, ia, ir, ispin)*harmonics%a(2, ia) + &
885 vxg_s(3, ia, ir, ispin)*harmonics%a(3, ia))
887 urad = grid_atom%oorad2l(ir, 1)
889 gvxgg_h(1, ia, l) = gvxgg_h(1, ia, l) + &
890 vxg_h(1, ia, ir, ispin)* &
893 gvxgg_h(2, ia, l) = gvxgg_h(2, ia, l) + &
894 vxg_h(2, ia, ir, ispin)* &
897 gvxgg_h(3, ia, l) = gvxgg_h(3, ia, l) + &
898 vxg_h(3, ia, ir, ispin)* &
901 gvxgg_s(1, ia, l) = gvxgg_s(1, ia, l) + &
902 vxg_s(1, ia, ir, ispin)* &
905 gvxgg_s(2, ia, l) = gvxgg_s(2, ia, l) + &
906 vxg_s(2, ia, ir, ispin)* &
909 gvxgg_s(3, ia, l) = gvxgg_s(3, ia, l) + &
910 vxg_s(3, ia, ir, ispin)* &
919 DO iso = 1, max_iso_not0_local
920 DO icg = 1, cg_n_list(iso)
921 iso1 = cg_list(1, icg, iso)
922 iso2 = cg_list(2, icg, iso)
927 cpassert(l <= lmax_expansion)
929 matso_h(iso1, iso2) = matso_h(iso1, iso2) + &
931 harmonics%slm(ia, iso)* &
932 my_cg(iso1, iso2, iso)
933 matso_s(iso1, iso2) = matso_s(iso1, iso2) + &
935 harmonics%slm(ia, iso)* &
936 my_cg(iso1, iso2, iso)
945 DO iso = 1, dmax_iso_not0_local
946 DO icg = 1, dcg_n_list(iso)
947 iso1 = dcg_list(1, icg, iso)
948 iso2 = dcg_list(2, icg, iso)
952 cpassert(l <= lmax_expansion)
954 matso_h(iso1, iso2) = matso_h(iso1, iso2) + &
955 (gvxgg_h(1, ia, l)*my_cg_dxyz(1, iso1, iso2, iso) + &
956 gvxgg_h(2, ia, l)*my_cg_dxyz(2, iso1, iso2, iso) + &
957 gvxgg_h(3, ia, l)*my_cg_dxyz(3, iso1, iso2, iso))* &
958 harmonics%slm(ia, iso)
960 matso_s(iso1, iso2) = matso_s(iso1, iso2) + &
961 (gvxgg_s(1, ia, l)*my_cg_dxyz(1, iso1, iso2, iso) + &
962 gvxgg_s(2, ia, l)*my_cg_dxyz(2, iso1, iso2, iso) + &
963 gvxgg_s(3, ia, l)*my_cg_dxyz(3, iso1, iso2, iso))* &
964 harmonics%slm(ia, iso)
976 DO ic =
nsoset(lmin(iset2) - 1) + 1,
nsoset(lmax(iset2))
977 iso1 =
nsoset(lmin(iset1) - 1) + 1
979 CALL daxpy(size1, 1.0_dp, matso_h(iso1, ic), 1, &
980 int_hh(ispin)%r_coef(nngau1 + 1, iso2), 1)
981 CALL daxpy(size1, 1.0_dp, matso_s(iso1, ic), 1, &
982 int_ss(ispin)%r_coef(nngau1 + 1, iso2), 1)
993 DEALLOCATE (g1, g2, gg, dgg, matso_h, matso_s, gvxcg_h, gvxcg_s, gvxgg_h, gvxgg_s)
994 DEALLOCATE (cg_list, cg_n_list, dcg_list, dcg_n_list)
996 CALL timestop(handle)
1011 SUBROUTINE dgavtaudgb(vtau_h, vtau_s, int_hh, int_ss, tau_cache, nspins)
1013 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: vtau_h, vtau_s
1016 INTEGER,
INTENT(IN) :: nspins
1018 CHARACTER(len=*),
PARAMETER :: routinen =
'dgaVtaudgb'
1020 INTEGER :: dir, handle, ia, ibas, igrid, iold, ir, &
1021 ispin, jbas, jold, max_old_basis, na, &
1023 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: int_h, int_s, weighted_grad
1025 CALL timeset(routinen, handle)
1027 cpassert(
ALLOCATED(tau_cache%grad))
1028 cpassert(
ASSOCIATED(tau_cache%n2oindex))
1032 nbas = tau_cache%nsatbas
1034 max_old_basis = maxval(tau_cache%n2oindex)
1035 ALLOCATE (int_h(nbas, nbas), int_s(nbas, nbas), weighted_grad(ngrid, nbas))
1037 DO ispin = 1, nspins
1038 cpassert(
SIZE(int_hh(ispin)%r_coef, 1) >= max_old_basis)
1039 cpassert(
SIZE(int_hh(ispin)%r_coef, 2) >= max_old_basis)
1040 cpassert(
SIZE(int_ss(ispin)%r_coef, 1) >= max_old_basis)
1041 cpassert(
SIZE(int_ss(ispin)%r_coef, 2) >= max_old_basis)
1051 igrid = ia + (ir - 1)*na
1052 weighted_grad(igrid, ibas) = vtau_h(ia, ir, ispin)* &
1053 tau_cache%grad(igrid, ibas, dir)
1058 CALL dgemm(
'T',
'N', nbas, nbas, ngrid, 0.5_dp, tau_cache%grad(:, :, dir), &
1059 ngrid, weighted_grad, ngrid, 1.0_dp, int_h, nbas)
1067 igrid = ia + (ir - 1)*na
1068 weighted_grad(igrid, ibas) = vtau_s(ia, ir, ispin)* &
1069 tau_cache%grad(igrid, ibas, dir)
1074 CALL dgemm(
'T',
'N', nbas, nbas, ngrid, 0.5_dp, tau_cache%grad(:, :, dir), &
1075 ngrid, weighted_grad, ngrid, 1.0_dp, int_s, nbas)
1083 jold = tau_cache%n2oindex(jbas)
1084 iold = tau_cache%n2oindex(ibas)
1085 int_hh(ispin)%r_coef(iold, jold) = int_hh(ispin)%r_coef(iold, jold) + &
1087 int_ss(ispin)%r_coef(iold, jold) = int_ss(ispin)%r_coef(iold, jold) + &
1094 DEALLOCATE (int_h, int_s, weighted_grad)
1096 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)
...