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 .LE. 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 .EQ. 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 REAL(kind=
dp) :: dab, rcprj
528 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: sab, work
529 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: ai_work
530 REAL(kind=
dp),
DIMENSION(3) :: rab
531 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a
532 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: rpgfa, rzetprj, sphi_a, zeta, zetb
539 IF (calculate_forces)
THEN
540 CALL timeset(routinen//
"_forces", handle)
542 CALL timeset(routinen, handle)
545 IF (
ASSOCIATED(sap_oce))
THEN
547 nkind =
SIZE(qs_kind_set)
548 natom =
SIZE(particle_set)
559 maxl = max(maxlgto, maxlprj)
562 DO i = 1, nkind*nkind
563 NULLIFY (intac(i)%alist, intac(i)%asort, intac(i)%aindex)
568 DO slot = 1, sap_oce(1)%nl_size
569 ikind = sap_oce(1)%nlist_task(slot)%ikind
570 jkind = sap_oce(1)%nlist_task(slot)%jkind
571 atom_a = sap_oce(1)%nlist_task(slot)%iatom
572 nlist = sap_oce(1)%nlist_task(slot)%nlist
573 ilist = sap_oce(1)%nlist_task(slot)%ilist
574 nneighbor = sap_oce(1)%nlist_task(slot)%nnode
576 iac = ikind + nkind*(jkind - 1)
578 qs_kind => qs_kind_set(ikind)
579 CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis_set)
580 IF (.NOT.
ASSOCIATED(orb_basis_set)) cycle
581 qs_kind => qs_kind_set(jkind)
583 CALL get_qs_kind(qs_kind=qs_kind, paw_proj_set=paw_proj_b, paw_atom=paw_atom_b)
584 IF (.NOT. paw_atom_b) cycle
585 CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis_paw, basis_type=
"GAPW_1C")
586 IF (.NOT.
ASSOCIATED(orb_basis_paw)) cycle
587 IF (.NOT.
ASSOCIATED(intac(iac)%alist))
THEN
588 intac(iac)%a_kind = ikind
589 intac(iac)%p_kind = jkind
590 intac(iac)%nalist = nlist
591 ALLOCATE (intac(iac)%alist(nlist))
593 NULLIFY (intac(iac)%alist(i)%clist)
594 intac(iac)%alist(i)%aatom = 0
595 intac(iac)%alist(i)%nclist = 0
598 IF (.NOT.
ASSOCIATED(intac(iac)%alist(ilist)%clist))
THEN
599 intac(iac)%alist(ilist)%aatom = atom_a
600 intac(iac)%alist(ilist)%nclist = nneighbor
601 ALLOCATE (intac(iac)%alist(ilist)%clist(nneighbor))
605 ldsab = max(maxco,
ncoset(maxlprj), maxsgf, maxprj)
606 ldai =
ncoset(maxl + nder + 1)
617 ALLOCATE (sab(ldsab, ldsab*maxder), work(ldsab, ldsab*maxder))
619 ALLOCATE (ai_work(ldai, ldai,
ncoset(nder + 1)))
621 ALLOCATE (oceh(maxder), oces(maxder))
624 DO slot = 1, sap_oce(1)%nl_size
625 ikind = sap_oce(1)%nlist_task(slot)%ikind
626 jkind = sap_oce(1)%nlist_task(slot)%jkind
627 atom_a = sap_oce(1)%nlist_task(slot)%iatom
628 atom_b = sap_oce(1)%nlist_task(slot)%jatom
629 ilist = sap_oce(1)%nlist_task(slot)%ilist
630 jneighbor = sap_oce(1)%nlist_task(slot)%inode
631 rab(1:3) = sap_oce(1)%nlist_task(slot)%r(1:3)
632 cell_b(1:3) = sap_oce(1)%nlist_task(slot)%cell(1:3)
634 iac = ikind + nkind*(jkind - 1)
635 dab = sqrt(sum(rab*rab))
637 qs_kind => qs_kind_set(ikind)
638 CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis_set)
640 IF (.NOT.
ASSOCIATED(orb_basis_set)) cycle
642 first_sgf=first_sgfa, &
650 nsgf_set=nsgf_seta, &
652 set_radius=set_radius_a, &
656 qs_kind => qs_kind_set(jkind)
659 CALL get_qs_kind(qs_kind=qs_kind, paw_proj_set=paw_proj_b, paw_atom=paw_atom_b)
660 IF (.NOT. paw_atom_b) cycle
662 CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis_paw, basis_type=
"GAPW_1C")
663 IF (.NOT.
ASSOCIATED(orb_basis_paw)) cycle
678 clist => intac(iac)%alist(ilist)%clist(jneighbor)
684 clist%maxach = 0.0_dp
685 NULLIFY (clist%acint, clist%achint, clist%sgf_list)
687 ALLOCATE (sgf_list(nsgfa))
689 at_a => qs_kind_set(jkind)
690 at_b => qs_kind_set(ikind)
692 local = (atom_a == atom_b .AND. all(cell_b == 0))
696 ALLOCATE (oceh(i)%block(nsobtot, nsgfa), oces(i)%block(nsobtot, nsgfa))
697 oceh(i)%block = 0._dp
698 oces(i)%block = 0._dp
700 CALL build_oce_block_local(oceh, oces, at_a, sgf_list, nsgf_cnt)
701 clist%nsgf_cnt = nsgf_cnt
702 clist%sgf_soft_only = .false.
703 IF (nsgf_cnt > 0)
THEN
704 ALLOCATE (clist%acint(nsgf_cnt, nsobtot, maxder), clist%sgf_list(nsgf_cnt))
705 clist%acint(:, :, :) = 0._dp
706 clist%sgf_list(:) = huge(0)
707 cpassert(nsgf_cnt == nsgfa)
709 ALLOCATE (clist%achint(nsgfa, nsobtot, maxder))
711 clist%acint(1:nsgfa, 1:nsobtot, 1) = transpose(oces(1)%block(1:nsobtot, 1:nsgfa))
712 clist%achint(1:nsgfa, 1:nsobtot, 1) = transpose(oceh(1)%block(1:nsobtot, 1:nsgfa))
713 clist%maxac = maxval(abs(clist%acint(:, :, 1)))
715 clist%sgf_list(1:nsgf_cnt) = sgf_list(1:nsgf_cnt)
718 DEALLOCATE (oceh(i)%block, oces(i)%block)
722 ALLOCATE (oces(i)%block(nsobtot, nsgfa))
723 oces(i)%block = 0._dp
725 CALL build_oce_block(oces, at_a, at_b, rab, nder, sgf_list, nsgf_cnt, sgf_soft_only, eps_fit)
726 clist%nsgf_cnt = nsgf_cnt
727 clist%sgf_soft_only = sgf_soft_only
728 IF (nsgf_cnt > 0)
THEN
729 ALLOCATE (clist%acint(nsgf_cnt, nsobtot, maxder), clist%sgf_list(nsgf_cnt))
730 clist%acint(:, :, :) = 0._dp
731 clist%sgf_list(:) = huge(0)
733 clist%acint(1:nsgf_cnt, 1:nsobtot, i) = transpose(oces(i)%block(1:nsobtot, 1:nsgf_cnt))
735 clist%maxac = maxval(abs(clist%acint(:, :, 1)))
737 clist%sgf_list(1:nsgf_cnt) = sgf_list(1:nsgf_cnt)
740 DEALLOCATE (oces(i)%block)
744 DEALLOCATE (sgf_list)
748 DEALLOCATE (sab, work, ai_work)
749 DEALLOCATE (oceh, oces)
757 CALL timestop(handle)
783 SUBROUTINE proj_blk(h_a, s_a, na, h_b, s_b, nb, blk, ldb, proj_h, proj_s, nso, len1, len2, fac, distab)
785 INTEGER,
INTENT(IN) :: na
786 REAL(kind=
dp),
INTENT(IN) :: s_a(na, *), h_a(na, *)
787 INTEGER,
INTENT(IN) :: nb
788 REAL(kind=
dp),
INTENT(IN) :: s_b(nb, *), h_b(nb, *)
789 INTEGER,
INTENT(IN) :: ldb
790 REAL(kind=
dp),
INTENT(IN) :: blk(ldb, *)
791 INTEGER,
INTENT(IN) ::
nso
792 REAL(kind=
dp),
INTENT(INOUT) :: proj_s(
nso, *), proj_h(
nso, *)
793 INTEGER,
INTENT(IN) :: len1, len2
794 REAL(kind=
dp),
INTENT(IN) ::
fac
795 LOGICAL,
INTENT(IN) :: distab
797 REAL(kind=
dp) :: buf1(len1), buf2(len2)
799 IF (na .EQ. 0 .OR. nb .EQ. 0 .OR.
nso .EQ. 0)
RETURN
802 IF (na .EQ. 1 .AND. nb .EQ. 1)
THEN
804 CALL dger(
nso,
nso,
fac*blk(1, 1), h_a(1, 1), 1, h_b(1, 1), 1, proj_h(1, 1),
nso)
806 CALL dger(
nso,
nso,
fac*blk(1, 1), s_a(1, 1), 1, s_b(1, 1), 1, proj_s(1, 1),
nso)
810 CALL dgemm(
'N',
'N', na,
nso, nb,
fac, blk(1, 1), ldb, h_b(1, 1), nb, 0.0_dp, buf1(1), na)
811 CALL dgemm(
'T',
'N',
nso,
nso, na, 1.0_dp, h_a(1, 1), na, buf1(1), na, 0.0_dp, buf2(1),
nso)
812 CALL daxpy(
nso*
nso, 1.0_dp, buf2(1), 1, proj_h(1, 1), 1)
814 CALL daxpy(
nso*
nso, 1.0_dp, buf2(1), 1, proj_s(1, 1), 1)
817 CALL dgemm(
'N',
'N', na,
nso, nb,
fac, blk(1, 1), ldb, h_b(1, 1), nb, 0.0_dp, buf1(1), na)
818 CALL dgemm(
'T',
'N',
nso,
nso, na, 1.0_dp, h_a(1, 1), na, buf1(1), na, 1.0_dp, proj_h(1, 1),
nso)
820 CALL dgemm(
'N',
'N', na,
nso, nb,
fac, blk(1, 1), ldb, s_b(1, 1), nb, 0.0_dp, buf1(1), na)
821 CALL dgemm(
'T',
'N',
nso,
nso, na, 1.0_dp, s_a(1, 1), na, buf1(1), na, 1.0_dp, proj_s(1, 1),
nso)
835 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: ain
836 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: aout
839 INTEGER :: i, ip, j, jp, nbas
840 INTEGER,
DIMENSION(:),
POINTER :: n2oindex
844 CALL get_qs_kind(qs_kind=
atom, basis_set=basis_1c, basis_type=
"GAPW_1C")
852 aout(j, i) = ain(jp, ip)
856 DEALLOCATE (n2oindex)
868 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: ain
869 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: aout
872 INTEGER :: i, ip, j, jp, nbas
873 INTEGER,
DIMENSION(:),
POINTER :: n2oindex
877 CALL get_qs_kind(qs_kind=
atom, basis_set=basis_1c, basis_type=
"GAPW_1C")
885 aout(jp, ip) = aout(jp, ip) + ain(j, i)
889 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)
...
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, 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, 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)
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 proj_blk(h_a, s_a, na, h_b, s_b, nb, blk, ldb, proj_h, proj_s, nso, len1, len2, fac, distab)
Project a matrix block onto the local atomic functions.
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 prj_scatter(ain, aout, atom)
...
General overlap type integrals containers.
subroutine, public sap_sort(sap_int)
...
Provides all information about a quickstep kind.