40#include "./base/base_uses.f90"
48 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_oce_methods'
68 SUBROUTINE build_oce_block(oces, atom_ka, atom_kb, rab, nder, sgf_list, nsgf_cnt, sgf_soft_only, &
71 TYPE(block_p_type),
DIMENSION(:),
POINTER :: oces
72 TYPE(qs_kind_type),
POINTER :: atom_ka, atom_kb
73 REAL(KIND=
dp),
DIMENSION(3) :: rab
74 INTEGER,
INTENT(IN) :: nder
75 INTEGER,
DIMENSION(:),
INTENT(OUT) :: sgf_list
76 INTEGER,
INTENT(OUT) :: nsgf_cnt
77 LOGICAL,
INTENT(OUT) :: sgf_soft_only
78 REAL(KIND=
dp),
INTENT(IN) :: eps_fit
80 INTEGER :: first_col, ic, ider, ig1, igau, ip, ipgf, is, isgfb, isgfb_cnt, isp, jc, jset, &
81 lds, lm, lpoint, lprj, lsgfb, lsgfb_cnt, lshell, m, m1, maxcob, maxder, maxlb, maxlprj, &
82 maxnprja, maxsoa, msab, n, ncob, np_car, np_sph, nsatbas, nseta, nsetb, nsoatot, &
83 ntotsgfb, sgf_hard_only
84 INTEGER,
DIMENSION(:),
POINTER :: fp_cara, fp_spha, lb_max, lb_min, npgfb, &
86 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfb
87 LOGICAL :: calculate_forces, paw_atom_a, paw_atom_b
88 REAL(KIND=
dp) :: dab, hard_radius_a, hard_radius_b, &
90 REAL(KIND=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ovs, spa_sb
91 REAL(KIND=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: s
92 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: set_radius_b, zisomina, zisominb
93 REAL(KIND=
dp),
DIMENSION(:, :),
POINTER :: csprj, rpgfb, rzetprja, spa_tmp, sphi_b, &
95 TYPE(gto_basis_set_type),
POINTER :: basis_1c_a, orb_basis_b
96 TYPE(paw_proj_set_type),
POINTER :: paw_proj_a, paw_proj_b
98 NULLIFY (basis_1c_a, paw_proj_a)
99 CALL get_qs_kind(qs_kind=atom_ka, basis_set=basis_1c_a, basis_type=
"GAPW_1C", &
100 paw_proj_set=paw_proj_a, paw_atom=paw_atom_a, &
101 hard_radius=hard_radius_a)
103 NULLIFY (orb_basis_b, paw_proj_b)
104 CALL get_qs_kind(qs_kind=atom_kb, basis_set=orb_basis_b, &
105 paw_proj_set=paw_proj_b, paw_atom=paw_atom_b, &
106 hard_radius=hard_radius_b)
108 IF (.NOT. paw_atom_a)
RETURN
110 NULLIFY (nprjla, fp_cara, fp_spha, rzetprja, zetprja)
112 nprj=nprjla, ncgauprj=np_car, nsgauprj=np_sph, nsatbas=nsatbas, rcprj=rcprja, &
113 first_prj=fp_cara, first_prjs=fp_spha, &
114 zisomin=zisomina, rzetprj=rzetprja, zetprj=zetprja)
116 NULLIFY (first_sgfb, lb_max, lb_min, npgfb, nsgfb, rpgfb, sphi_b, set_radius_b, zetb, zisominb)
118 set_radius=set_radius_b, lmax=lb_max, lmin=lb_min, &
119 npgf=npgfb, nsgf_set=nsgfb, pgf_radius=rpgfb, &
120 sphi=sphi_b, zet=zetb, first_sgf=first_sgfb, &
121 maxco=maxcob, maxl=maxlb)
126 dab = sqrt(sum(rab*rab))
129 nsoatot = maxsoa*nseta
130 maxnprja =
SIZE(zetprja, 1)
132 calculate_forces = .false.
134 calculate_forces = .true.
137 lm = max(maxlb, maxlprj)
138 lds =
ncoset(lm + nder + 1)
139 msab = max(maxnprja*
ncoset(maxlprj), maxcob)
141 ALLOCATE (s(lds, lds,
ncoset(nder + 1)))
142 ALLOCATE (spa_sb(np_car, ntotsgfb))
143 ALLOCATE (spa_tmp(msab, msab*maxder))
144 ALLOCATE (ovs(np_sph, maxcob*nsetb*maxder))
153 IF (hard_radius_a + set_radius_b(jset) >= dab)
THEN
154 isgfb = first_sgfb(1, jset)
155 lsgfb = isgfb - 1 + nsgfb(jset)
157 nsgf_cnt = nsgf_cnt + 1
158 sgf_list(nsgf_cnt) = jc
162 radius =
exp_radius(lb_max(jset), maxval(zetb(1:npgfb(jset), jset)), eps_fit, 1.0_dp)
163 IF (radius <= hard_radius_b) sgf_hard_only = sgf_hard_only + 1
170 ncob = npgfb(jset)*
ncoset(lb_max(jset))
171 isgfb = first_sgfb(1, jset)
172 lsgfb = isgfb - 1 + nsgfb(jset)
174 lsgfb_cnt = isgfb_cnt - 1 + nsgfb(jset)
177 CALL overlap(lprj, lprj, nprjla(lprj), &
178 rzetprja(:, lprj), zetprja(:, lprj), &
179 lb_max(jset), lb_min(jset), npgfb(jset), &
180 rpgfb(:, jset), zetb(:, jset), &
181 -rab, dab, spa_tmp, &
182 nder, .true., s, lds)
184 is = (ider - 1)*
SIZE(spa_tmp, 1)
185 isp = (ider - 1)*maxcob*nsetb
186 DO ipgf = 1, nprjla(lprj)
188 m = fp_spha(lprj) + (ipgf - 1)*
nso(lprj)
189 DO ip = 1, npgfb(jset)
190 ic = (ip - 1)*
ncoset(lb_max(jset))
191 igau = isp + ic + m1 +
ncoset(lb_min(jset) - 1) + 1
192 ig1 = is + ic +
ncoset(lb_min(jset) - 1) + 1
194 ovs(m:m +
nso(lprj) - 1, igau:igau + n - 1) = &
196 spa_tmp(lpoint:lpoint +
nco(lprj) - 1, ig1:ig1 + n - 1))
204 DO ipgf = 1, npgfb(jset)
205 DO lshell = lb_min(jset), lb_max(jset)
206 IF (zetb(ipgf, jset) >= zisominb(lshell))
THEN
208 igau = n*(ipgf - 1) +
ncoset(lshell - 1)
210 is = maxcob*(ider - 1)
211 isp = (ider - 1)*maxcob*nsetb
212 ovs(:, igau + 1 + isp + m1:igau +
nco(lshell) + isp + m1) = 0.0_dp
221 first_col = (ider - 1)*maxcob*nsetb + 1 + m1
226 spa_sb(1:np_sph, isgfb:isgfb + nsgfb(jset) - 1) = &
227 matmul(ovs(1:np_sph, first_col:first_col + ncob - 1), &
228 sphi_b(1:ncob, isgfb:isgfb + nsgfb(jset) - 1))
234 oces(ider)%block(1:nsatbas, isgfb_cnt:isgfb_cnt + nsgfb(jset) - 1) = &
235 oces(ider)%block(1:nsatbas, isgfb_cnt:isgfb_cnt + nsgfb(jset) - 1) + &
236 matmul(transpose(csprj(1:np_sph, 1:nsatbas)), &
237 spa_sb(1:np_sph, isgfb:isgfb + nsgfb(jset) - 1))
239 isgfb_cnt = isgfb_cnt + nsgfb(jset)
245 sgf_soft_only = .false.
246 IF (sgf_hard_only == 0) sgf_soft_only = .true.
248 DEALLOCATE (s, spa_sb, spa_tmp, ovs)
250 END SUBROUTINE build_oce_block
260 SUBROUTINE build_oce_block_local(oceh, oces, atom_ka, sgf_list, nsgf_cnt)
262 TYPE(block_p_type),
DIMENSION(:),
POINTER :: oceh, oces
263 TYPE(qs_kind_type),
POINTER :: atom_ka
264 INTEGER,
DIMENSION(:),
INTENT(OUT) :: sgf_list
265 INTEGER,
INTENT(OUT) :: nsgf_cnt
267 INTEGER :: i, iset, isgfa, j, jc, lsgfa, maxlprj, &
268 maxso1a, n, nsatbas, nset1a, nseta, &
270 INTEGER,
DIMENSION(:),
POINTER :: n2oindex, nsgf_seta
271 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa
272 LOGICAL :: paw_atom_a
273 REAL(KIND=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: prjloc_h, prjloc_s
274 REAL(KIND=
dp),
DIMENSION(:, :),
POINTER :: local_oce_h, local_oce_s
275 TYPE(gto_basis_set_type),
POINTER :: basis_1c_a, orb_basis_a
276 TYPE(paw_proj_set_type),
POINTER :: paw_proj_a
278 NULLIFY (orb_basis_a, basis_1c_a, paw_proj_a)
279 CALL get_qs_kind(qs_kind=atom_ka, basis_set=orb_basis_a, &
280 paw_proj_set=paw_proj_a, paw_atom=paw_atom_a)
282 IF (.NOT. paw_atom_a)
RETURN
285 CALL get_qs_kind(qs_kind=atom_ka, basis_set=basis_1c_a, basis_type=
"GAPW_1C")
291 nsgf=nsgfa, nsgf_set=nsgf_seta, nset=nseta)
293 NULLIFY (local_oce_h, local_oce_s)
295 local_oce_sphi_h=local_oce_h, &
296 local_oce_sphi_s=local_oce_s)
298 ALLOCATE (prjloc_h(nset1a*maxso1a, nsgfa), prjloc_s(nset1a*maxso1a, nsgfa))
304 isgfa = first_sgfa(1, iset)
305 lsgfa = isgfa - 1 + nsgf_seta(iset)
307 nsgf_cnt = nsgf_cnt + 1
308 sgf_list(nsgf_cnt) = jc
311 n = maxso1a*(iset - 1)
312 prjloc_h(n + 1:n + maxso1a, isgfa:lsgfa) = local_oce_h(1:maxso1a, isgfa:lsgfa)
313 prjloc_s(n + 1:n + maxso1a, isgfa:lsgfa) = local_oce_s(1:maxso1a, isgfa:lsgfa)
319 oceh(1)%block(j, i) = prjloc_h(jc, i)
320 oces(1)%block(j, i) = prjloc_s(jc, i)
324 DEALLOCATE (prjloc_h, prjloc_s)
325 DEALLOCATE (n2oindex)
327 END SUBROUTINE build_oce_block_local
338 SUBROUTINE build_oce_block_1c(oceh, oces, atom_ka, sgf_list, nsgf_cnt, eps_fit)
340 TYPE(block_p_type),
DIMENSION(:),
POINTER :: oceh, oces
341 TYPE(qs_kind_type),
POINTER :: atom_ka
342 INTEGER,
DIMENSION(:),
INTENT(OUT) :: sgf_list
343 INTEGER,
INTENT(OUT) :: nsgf_cnt
344 REAL(KIND=
dp),
INTENT(IN) :: eps_fit
346 INTEGER :: first_col, ic, ig1, igau, ip, ipgf, isgfb, isgfb_cnt, jc, jset, lds, lm, lpoint, &
347 lprj, lsgfb, lsgfb_cnt, lshell, m, m1, maxcob, maxlb, maxlprj, maxnprja, maxsoa, msab, n, &
348 ncob, np_car, np_sph, nsatbas, nseta, nsetb, nsoatot, ntotsgfb
349 INTEGER,
DIMENSION(:),
POINTER :: fp_cara, fp_spha, lb_max, lb_min, npgfb, &
351 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfb
352 LOGICAL :: paw_atom_a
353 REAL(KIND=
dp) :: radius, rc, rcprja
354 REAL(KIND=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ovh, ovs, spa_sb
355 REAL(KIND=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: s
356 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: set_radius_b, zisominb
357 REAL(KIND=
dp),
DIMENSION(:, :),
POINTER :: chprj, csprj, rpgfb, rzetprja, spa_tmp, &
358 sphi_b, zetb, zetprja
359 TYPE(gto_basis_set_type),
POINTER :: basis_1c_a, orb_basis_b
360 TYPE(paw_proj_set_type),
POINTER :: paw_proj_a
362 NULLIFY (orb_basis_b, basis_1c_a, paw_proj_a)
363 CALL get_qs_kind(qs_kind=atom_ka, paw_atom=paw_atom_a)
365 IF (.NOT. paw_atom_a)
RETURN
367 CALL get_qs_kind(qs_kind=atom_ka, paw_proj_set=paw_proj_a)
368 NULLIFY (nprjla, fp_cara, fp_spha, rzetprja, zetprja)
369 CALL get_paw_proj_set(paw_proj_set=paw_proj_a, csprj=csprj, chprj=chprj, maxl=maxlprj, &
370 nprj=nprjla, ncgauprj=np_car, nsgauprj=np_sph, nsatbas=nsatbas, rcprj=rcprja, &
371 first_prj=fp_cara, first_prjs=fp_spha, &
372 rzetprj=rzetprja, zetprj=zetprja)
374 CALL get_qs_kind(qs_kind=atom_ka, basis_set=orb_basis_b)
375 NULLIFY (first_sgfb, lb_max, lb_min, npgfb, nsgfb, rpgfb, sphi_b, set_radius_b, zetb, zisominb)
377 set_radius=set_radius_b, lmax=lb_max, lmin=lb_min, &
378 npgf=npgfb, nsgf_set=nsgfb, pgf_radius=rpgfb, &
379 sphi=sphi_b, zet=zetb, first_sgf=first_sgfb, &
380 maxco=maxcob, maxl=maxlb)
384 CALL get_qs_kind(qs_kind=atom_ka, basis_set=basis_1c_a, basis_type=
"GAPW_1C")
388 nsoatot = maxsoa*nseta
389 maxnprja =
SIZE(zetprja, 1)
391 lm = max(maxlb, maxlprj)
393 msab = max(maxnprja*
ncoset(maxlprj), maxcob)
395 ALLOCATE (s(lds, lds, 1))
396 ALLOCATE (spa_sb(np_car, ntotsgfb))
397 ALLOCATE (spa_tmp(msab, msab))
398 ALLOCATE (ovs(np_sph, maxcob*nsetb))
399 ALLOCATE (ovh(np_sph, maxcob*nsetb))
407 isgfb = first_sgfb(1, jset)
408 lsgfb = isgfb - 1 + nsgfb(jset)
410 nsgf_cnt = nsgf_cnt + 1
411 sgf_list(nsgf_cnt) = jc
420 ncob = npgfb(jset)*
ncoset(lb_max(jset))
421 isgfb = first_sgfb(1, jset)
422 lsgfb = isgfb - 1 + nsgfb(jset)
424 lsgfb_cnt = isgfb_cnt - 1 + nsgfb(jset)
427 CALL overlap(lprj, lprj, nprjla(lprj), &
428 rzetprja(:, lprj), zetprja(:, lprj), &
429 lb_max(jset), lb_min(jset), npgfb(jset), &
430 rpgfb(:, jset), zetb(:, jset), &
431 -[0._dp, 0._dp, 0._dp], 0.0_dp, spa_tmp, &
433 DO ipgf = 1, nprjla(lprj)
435 m = fp_spha(lprj) + (ipgf - 1)*
nso(lprj)
436 DO ip = 1, npgfb(jset)
437 ic = (ip - 1)*
ncoset(lb_max(jset))
438 igau = ic + m1 +
ncoset(lb_min(jset) - 1) + 1
439 ig1 = ic +
ncoset(lb_min(jset) - 1) + 1
441 ovs(m:m +
nso(lprj) - 1, igau:igau + n - 1) = &
443 spa_tmp(lpoint:lpoint +
nco(lprj) - 1, ig1:ig1 + n - 1))
448 ovh(:, :) = ovs(:, :)
451 DO ipgf = 1, npgfb(jset)
452 DO lshell = lb_min(jset), lb_max(jset)
453 radius =
exp_radius(lshell, zetb(ipgf, jset), eps_fit, 1.0_dp)
454 IF (radius < rc)
THEN
456 igau = n*(ipgf - 1) +
ncoset(lshell - 1)
457 ovs(:, igau + 1 + m1:igau +
nco(lshell) + m1) = 0.0_dp
464 spa_sb(1:np_sph, isgfb:isgfb + nsgfb(jset) - 1) = &
465 matmul(ovs(1:np_sph, first_col:first_col + ncob - 1), &
466 sphi_b(1:ncob, isgfb:isgfb + nsgfb(jset) - 1))
468 oces(1)%block(1:nsatbas, isgfb_cnt:isgfb_cnt + nsgfb(jset) - 1) = &
469 oces(1)%block(1:nsatbas, isgfb_cnt:isgfb_cnt + nsgfb(jset) - 1) + &
470 matmul(transpose(csprj(1:np_sph, 1:nsatbas)), &
471 spa_sb(1:np_sph, isgfb:isgfb + nsgfb(jset) - 1))
473 spa_sb(1:np_sph, isgfb:isgfb + nsgfb(jset) - 1) = &
474 matmul(ovh(1:np_sph, first_col:first_col + ncob - 1), &
475 sphi_b(1:ncob, isgfb:isgfb + nsgfb(jset) - 1))
477 oceh(1)%block(1:nsatbas, isgfb_cnt:isgfb_cnt + nsgfb(jset) - 1) = &
478 oceh(1)%block(1:nsatbas, isgfb_cnt:isgfb_cnt + nsgfb(jset) - 1) + &
479 matmul(transpose(chprj(1:np_sph, 1:nsatbas)), &
480 spa_sb(1:np_sph, isgfb:isgfb + nsgfb(jset) - 1))
482 isgfb_cnt = isgfb_cnt + nsgfb(jset)
486 DEALLOCATE (s, spa_sb, spa_tmp, ovs)
488 END SUBROUTINE build_oce_block_1c
505 qs_kind_set, particle_set, sap_oce, eps_fit)
508 LOGICAL,
INTENT(IN) :: calculate_forces
510 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
514 REAL(kind=
dp),
INTENT(IN) :: eps_fit
516 CHARACTER(LEN=*),
PARAMETER :: routinen =
'build_oce_matrices'
518 INTEGER :: atom_a, atom_b, handle, i, iac, ikind, ilist, jkind, jneighbor, ldai, ldsab, &
519 maxco, maxder, maxl, maxlgto, maxlprj, maxprj, maxsgf, maxsoa, maxsob, mlprj, natom, &
520 ncoa_sum, nkind, nlist, nneighbor, nsatbas, nseta, nsetb, nsgf_cnt, nsgfa, nsobtot, slot
521 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: sgf_list
522 INTEGER,
DIMENSION(3) :: cell_b
523 INTEGER,
DIMENSION(:),
POINTER :: fp_car, fp_sph, la_max, la_min, npgfa, &
525 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa
526 LOGICAL :: local, paw_atom_b, sgf_soft_only
527 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: has_1c_basis, has_orb_basis, paw_kind
528 REAL(kind=
dp) :: dab, rcprj
529 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: sab, work
530 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: ai_work
531 REAL(kind=
dp),
DIMENSION(3) :: rab
532 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a
533 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: rpgfa, rzetprj, sphi_a, zeta, zetb
540 IF (calculate_forces)
THEN
541 CALL timeset(routinen//
"_forces", handle)
543 CALL timeset(routinen, handle)
546 IF (
ASSOCIATED(sap_oce))
THEN
548 nkind =
SIZE(qs_kind_set)
549 natom =
SIZE(particle_set)
560 maxl = max(maxlgto, maxlprj)
563 DO i = 1, nkind*nkind
564 NULLIFY (intac(i)%alist, intac(i)%asort, intac(i)%aindex)
568 ALLOCATE (has_orb_basis(nkind), paw_kind(nkind), has_1c_basis(nkind))
569 has_orb_basis(:) = .false.
570 paw_kind(:) = .false.
571 has_1c_basis(:) = .false.
573 NULLIFY (orb_basis_set)
574 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), basis_set=orb_basis_set)
575 has_orb_basis(ikind) =
ASSOCIATED(orb_basis_set)
577 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), paw_proj_set=paw_proj_b, paw_atom=paw_kind(ikind))
578 NULLIFY (orb_basis_paw)
579 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), basis_set=orb_basis_paw, basis_type=
"GAPW_1C")
580 has_1c_basis(ikind) =
ASSOCIATED(orb_basis_paw)
584 DO slot = 1, sap_oce(1)%nl_size
585 ikind = sap_oce(1)%nlist_task(slot)%ikind
586 jkind = sap_oce(1)%nlist_task(slot)%jkind
587 atom_a = sap_oce(1)%nlist_task(slot)%iatom
588 nlist = sap_oce(1)%nlist_task(slot)%nlist
589 ilist = sap_oce(1)%nlist_task(slot)%ilist
590 nneighbor = sap_oce(1)%nlist_task(slot)%nnode
592 iac = ikind + nkind*(jkind - 1)
594 IF (.NOT. has_orb_basis(ikind)) cycle
595 IF (.NOT. paw_kind(jkind)) cycle
596 IF (.NOT. has_1c_basis(jkind)) cycle
597 IF (.NOT.
ASSOCIATED(intac(iac)%alist))
THEN
598 intac(iac)%a_kind = ikind
599 intac(iac)%p_kind = jkind
600 intac(iac)%nalist = nlist
601 ALLOCATE (intac(iac)%alist(nlist))
603 NULLIFY (intac(iac)%alist(i)%clist)
604 intac(iac)%alist(i)%aatom = 0
605 intac(iac)%alist(i)%nclist = 0
608 IF (.NOT.
ASSOCIATED(intac(iac)%alist(ilist)%clist))
THEN
609 intac(iac)%alist(ilist)%aatom = atom_a
610 intac(iac)%alist(ilist)%nclist = nneighbor
611 ALLOCATE (intac(iac)%alist(ilist)%clist(nneighbor))
615 ldsab = max(maxco,
ncoset(maxlprj), maxsgf, maxprj)
616 ldai =
ncoset(maxl + nder + 1)
628 ALLOCATE (sab(ldsab, ldsab*maxder), work(ldsab, ldsab*maxder))
630 ALLOCATE (ai_work(ldai, ldai,
ncoset(nder + 1)))
632 ALLOCATE (oceh(maxder), oces(maxder))
633 ALLOCATE (sgf_list(maxsgf))
636 DO slot = 1, sap_oce(1)%nl_size
637 ikind = sap_oce(1)%nlist_task(slot)%ikind
638 jkind = sap_oce(1)%nlist_task(slot)%jkind
639 atom_a = sap_oce(1)%nlist_task(slot)%iatom
640 atom_b = sap_oce(1)%nlist_task(slot)%jatom
641 ilist = sap_oce(1)%nlist_task(slot)%ilist
642 jneighbor = sap_oce(1)%nlist_task(slot)%inode
643 rab(1:3) = sap_oce(1)%nlist_task(slot)%r(1:3)
644 cell_b(1:3) = sap_oce(1)%nlist_task(slot)%cell(1:3)
646 iac = ikind + nkind*(jkind - 1)
647 dab = sqrt(sum(rab*rab))
649 IF (.NOT. has_orb_basis(ikind)) cycle
650 IF (.NOT. paw_kind(jkind)) cycle
651 IF (.NOT. has_1c_basis(jkind)) cycle
653 qs_kind => qs_kind_set(ikind)
654 CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis_set)
656 IF (.NOT.
ASSOCIATED(orb_basis_set)) cycle
658 first_sgf=first_sgfa, &
666 nsgf_set=nsgf_seta, &
668 set_radius=set_radius_a, &
672 qs_kind => qs_kind_set(jkind)
675 CALL get_qs_kind(qs_kind=qs_kind, paw_proj_set=paw_proj_b, paw_atom=paw_atom_b)
676 IF (.NOT. paw_atom_b) cycle
678 CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis_paw, basis_type=
"GAPW_1C")
679 IF (.NOT.
ASSOCIATED(orb_basis_paw)) cycle
694 clist => intac(iac)%alist(ilist)%clist(jneighbor)
700 clist%maxach = 0.0_dp
701 NULLIFY (clist%acint, clist%achint, clist%sgf_list)
703 at_a => qs_kind_set(jkind)
704 at_b => qs_kind_set(ikind)
706 local = (atom_a == atom_b .AND. all(cell_b == 0))
710 ALLOCATE (oceh(i)%block(nsobtot, nsgfa), oces(i)%block(nsobtot, nsgfa))
711 oceh(i)%block = 0._dp
712 oces(i)%block = 0._dp
714 CALL build_oce_block_local(oceh, oces, at_a, sgf_list, nsgf_cnt)
715 clist%nsgf_cnt = nsgf_cnt
716 clist%sgf_soft_only = .false.
717 IF (nsgf_cnt > 0)
THEN
718 ALLOCATE (clist%acint(nsgf_cnt, nsobtot, maxder), clist%sgf_list(nsgf_cnt))
719 clist%acint(:, :, :) = 0._dp
720 clist%sgf_list(:) = huge(0)
721 cpassert(nsgf_cnt == nsgfa)
723 ALLOCATE (clist%achint(nsgfa, nsobtot, maxder))
725 clist%acint(1:nsgfa, 1:nsobtot, 1) = transpose(oces(1)%block(1:nsobtot, 1:nsgfa))
726 clist%achint(1:nsgfa, 1:nsobtot, 1) = transpose(oceh(1)%block(1:nsobtot, 1:nsgfa))
727 clist%maxac = maxval(abs(clist%acint(:, :, 1)))
729 clist%sgf_list(1:nsgf_cnt) = sgf_list(1:nsgf_cnt)
732 DEALLOCATE (oceh(i)%block, oces(i)%block)
736 ALLOCATE (oces(i)%block(nsobtot, nsgfa))
737 oces(i)%block = 0._dp
739 CALL build_oce_block(oces, at_a, at_b, rab, nder, sgf_list, nsgf_cnt, sgf_soft_only, eps_fit)
740 clist%nsgf_cnt = nsgf_cnt
741 clist%sgf_soft_only = sgf_soft_only
742 IF (nsgf_cnt > 0)
THEN
743 ALLOCATE (clist%acint(nsgf_cnt, nsobtot, maxder), clist%sgf_list(nsgf_cnt))
744 clist%acint(:, :, :) = 0._dp
745 clist%sgf_list(:) = huge(0)
747 clist%acint(1:nsgf_cnt, 1:nsobtot, i) = transpose(oces(i)%block(1:nsobtot, 1:nsgf_cnt))
749 clist%maxac = maxval(abs(clist%acint(:, :, 1)))
751 clist%sgf_list(1:nsgf_cnt) = sgf_list(1:nsgf_cnt)
754 DEALLOCATE (oces(i)%block)
760 DEALLOCATE (sab, work, ai_work)
761 DEALLOCATE (sgf_list)
762 DEALLOCATE (oceh, oces)
768 DEALLOCATE (has_orb_basis, paw_kind, has_1c_basis)
772 CALL timestop(handle)
801 SUBROUTINE proj_blk(h_a, s_a, na, h_b, s_b, nb, blk, ldb, proj_h, proj_s, nso, len1, len2, fac, distab, &
804 INTEGER,
INTENT(IN) :: na
805 REAL(kind=
dp),
INTENT(IN) :: s_a(na, *), h_a(na, *)
806 INTEGER,
INTENT(IN) :: nb
807 REAL(kind=
dp),
INTENT(IN) :: s_b(nb, *), h_b(nb, *)
808 INTEGER,
INTENT(IN) :: ldb
809 REAL(kind=
dp),
INTENT(IN) :: blk(ldb, *)
810 INTEGER,
INTENT(IN) ::
nso
811 REAL(kind=
dp),
INTENT(INOUT) :: proj_s(
nso, *), proj_h(
nso, *)
812 INTEGER,
INTENT(IN) :: len1, len2
813 REAL(kind=
dp),
INTENT(IN) ::
fac
814 LOGICAL,
INTENT(IN) :: distab
815 REAL(kind=
dp),
INTENT(INOUT) :: work1(len1), work2(len2)
817 IF (na == 0 .OR. nb == 0 .OR.
nso == 0)
RETURN
820 IF (na == 1 .AND. nb == 1)
THEN
822 CALL dger(
nso,
nso,
fac*blk(1, 1), h_a(1, 1), 1, h_b(1, 1), 1, proj_h(1, 1),
nso)
824 CALL dger(
nso,
nso,
fac*blk(1, 1), s_a(1, 1), 1, s_b(1, 1), 1, proj_s(1, 1),
nso)
828 CALL dgemm(
'N',
'N', na,
nso, nb,
fac, blk(1, 1), ldb, h_b(1, 1), nb, 0.0_dp, work1(1), na)
829 CALL dgemm(
'T',
'N',
nso,
nso, na, 1.0_dp, h_a(1, 1), na, work1(1), na, 0.0_dp, work2(1),
nso)
830 CALL daxpy(
nso*
nso, 1.0_dp, work2(1), 1, proj_h(1, 1), 1)
832 CALL daxpy(
nso*
nso, 1.0_dp, work2(1), 1, proj_s(1, 1), 1)
835 CALL dgemm(
'N',
'N', na,
nso, nb,
fac, blk(1, 1), ldb, h_b(1, 1), nb, 0.0_dp, work1(1), na)
836 CALL dgemm(
'T',
'N',
nso,
nso, na, 1.0_dp, h_a(1, 1), na, work1(1), na, 1.0_dp, proj_h(1, 1),
nso)
838 CALL dgemm(
'N',
'N', na,
nso, nb,
fac, blk(1, 1), ldb, s_b(1, 1), nb, 0.0_dp, work1(1), na)
839 CALL dgemm(
'T',
'N',
nso,
nso, na, 1.0_dp, s_a(1, 1), na, work1(1), na, 1.0_dp, proj_s(1, 1),
nso)
853 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: ain
854 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: aout
857 INTEGER :: i, ip, j, jp, nbas
858 INTEGER,
DIMENSION(:),
POINTER :: n2oindex
862 CALL get_qs_kind(qs_kind=
atom, basis_set=basis_1c, basis_type=
"GAPW_1C")
870 aout(j, i) = ain(jp, ip)
874 DEALLOCATE (n2oindex)
886 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: ain
887 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: aout
890 INTEGER :: i, ip, j, jp, nbas
891 INTEGER,
DIMENSION(:),
POINTER :: n2oindex
895 CALL get_qs_kind(qs_kind=
atom, basis_set=basis_1c, basis_type=
"GAPW_1C")
903 aout(jp, ip) = aout(jp, ip) + ain(j, i)
907 DEALLOCATE (n2oindex)
static GRID_HOST_DEVICE double fac(const int i)
Factorial function, e.g. fac(5) = 5! = 120.
static void dgemm(const char transa, const char transb, const int m, const int n, const int k, const double alpha, const double *a, const int lda, const double *b, const int ldb, const double beta, double *c, const int ldc)
Convenient wrapper to hide Fortran nature of dgemm_, swapping a and b.
Calculation of the overlap integrals over Cartesian Gaussian-type functions.
subroutine, public overlap(la_max_set, la_min_set, npgfa, rpgfa, zeta, lb_max_set, lb_min_set, npgfb, rpgfb, zetb, rab, dab, sab, da_max_set, return_derivatives, s, lds, sdab, pab, force_a)
Purpose: Calculation of the two-center overlap integrals [a|b] over Cartesian Gaussian-type functions...
All kind of helpful little routines.
real(kind=dp) function, public exp_radius(l, alpha, threshold, prefactor, epsabs, epsrel, rlow)
The radius of a primitive Gaussian function for a given threshold is calculated. g(r) = prefactor*r**...
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)
...
collect pointers to a block of reals
Defines the basic variable types.
integer, parameter, public dp
Provides Cartesian and spherical orbital pointers and indices.
subroutine, public init_orbital_pointers(maxl)
Initialize or update the orbital pointers.
integer, dimension(:), allocatable, public nco
integer, dimension(:), allocatable, public ncoset
integer, dimension(:), allocatable, public nso
Define the data structure for the particle information.
subroutine, public get_paw_basis_info(basis_1c, o2nindex, n2oindex, nsatbas)
Return some info on the PAW basis derived from a GTO basis set.
subroutine, public get_paw_proj_set(paw_proj_set, csprj, chprj, first_prj, first_prjs, last_prj, local_oce_sphi_h, local_oce_sphi_s, maxl, ncgauprj, nsgauprj, nsatbas, nsotot, nprj, o2nindex, n2oindex, rcprj, rzetprj, zisomin, zetprj)
Get informations about a paw projectors set.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
Get attributes of an atomic kind set.
Define the neighbor list data types and the corresponding functionality.
Routines for the construction of the coefficients for the expansion of the atomic densities rho1_hard...
subroutine, public prj_gather(ain, aout, atom)
...
subroutine, public build_oce_matrices(intac, calculate_forces, nder, qs_kind_set, particle_set, sap_oce, eps_fit)
Set up the sparse matrix for the coefficients of one center expansions This routine uses the same log...
subroutine, public proj_blk(h_a, s_a, na, h_b, s_b, nb, blk, ldb, proj_h, proj_s, nso, len1, len2, fac, distab, work1, work2)
Project a matrix block onto the local atomic functions.
subroutine, public prj_scatter(ain, aout, atom)
...
General overlap type integrals containers.
subroutine, public sap_sort(sap_int)
...
Provides all information about a quickstep kind.