21#include "./base/base_uses.f90"
27 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_o3c_types'
35 INTEGER :: katom = -1, kkind = -1
36 INTEGER :: ni = -1, nj = -1, nk = -1
37 REAL(KIND=
dp),
DIMENSION(3) :: rik = -1.0_dp
38 INTEGER,
DIMENSION(3) :: cellk = -1
39 REAL(KIND=
dp),
DIMENSION(:, :, :),
POINTER :: integral => null()
40 REAL(KIND=
dp),
DIMENSION(:, :),
POINTER :: tvec => null()
41 REAL(KIND=
dp),
DIMENSION(:, :),
POINTER :: force_i => null()
42 REAL(KIND=
dp),
DIMENSION(:, :),
POINTER :: force_j => null()
43 REAL(KIND=
dp),
DIMENSION(:, :),
POINTER :: force_k => null()
48 INTEGER :: iatom = -1, ikind = -1
49 INTEGER :: jatom = -1, jkind = -1
50 REAL(KIND=
dp),
DIMENSION(3) :: rij = -1.0_dp
51 INTEGER,
DIMENSION(3) :: cellj = -1
52 INTEGER :: nklist = -1
53 TYPE(o3c_int_type),
DIMENSION(:),
POINTER :: ijk => null()
54 END TYPE o3c_pair_type
58 LOGICAL :: ijsymmetric = .false.
59 INTEGER :: nijpairs = -1
61 TYPE(o3c_pair_type),
DIMENSION(:),
POINTER :: ijpair => null()
65 POINTER :: basis_set_list_a => null(), basis_set_list_b => null(), &
66 basis_set_list_c => null()
68 DIMENSION(:),
POINTER :: sab_nl => null(), sac_nl => null()
77 TYPE(o3c_container_type),
POINTER :: o3c => null()
78 INTEGER :: ijp_last = -1, k_last = -1
79 INTEGER,
DIMENSION(:),
POINTER :: ijp_thread => null(), k_thread => null()
89 REAL(kind=
dp),
DIMENSION(:),
POINTER :: v => null()
116 sab_nl, sac_nl, only_bc_same_center)
118 INTEGER,
INTENT(IN) :: nspin
122 POINTER :: sab_nl, sac_nl
123 LOGICAL,
INTENT(IN),
OPTIONAL :: only_bc_same_center
125 INTEGER :: kkind, nij, nk, nkind
126 LOGICAL :: my_sort_bc, symmetric
127 REAL(
dp) :: rik(3), rjk(3)
129 DIMENSION(:),
POINTER :: ac_iterator, nl_iterator
130 TYPE(o3c_int_type),
POINTER :: ijk
131 TYPE(o3c_pair_type),
POINTER :: ijpair
134 o3c%ijsymmetric = symmetric
139 o3c%basis_set_list_a => basis_set_list_a
140 o3c%basis_set_list_b => basis_set_list_b
141 o3c%basis_set_list_c => basis_set_list_c
146 nkind =
SIZE(basis_set_list_a)
149 IF (
PRESENT(only_bc_same_center)) my_sort_bc = only_bc_same_center
160 ALLOCATE (o3c%ijpair(nij))
168 ijpair => o3c%ijpair(nij)
170 iatom=ijpair%iatom, jatom=ijpair%jatom, &
171 r=ijpair%rij, cell=ijpair%cellj)
180 rjk(:) = rik(:) - ijpair%rij(:)
181 IF (.NOT. (all(abs(rjk) .LE. 1.0e-4_dp) .OR. all(abs(rik) .LE. 1.0e-4_dp))) cycle
188 ALLOCATE (ijpair%ijk(nk))
197 rjk(:) = rik(:) - ijpair%rij(:)
198 IF (.NOT. (all(abs(rjk) .LE. 1.0e-4_dp) .OR. all(abs(rik) .LE. 1.0e-4_dp))) cycle
202 ijk => ijpair%ijk(nk)
208 NULLIFY (ijk%integral)
210 NULLIFY (ijk%force_i)
211 NULLIFY (ijk%force_j)
212 NULLIFY (ijk%force_k)
228 o3c_container%ijsymmetric = .false.
229 o3c_container%nijpairs = 0
231 NULLIFY (o3c_container%basis_set_list_a)
232 NULLIFY (o3c_container%basis_set_list_b)
233 NULLIFY (o3c_container%basis_set_list_c)
235 NULLIFY (o3c_container%sab_nl)
236 NULLIFY (o3c_container%sac_nl)
238 IF (
ASSOCIATED(o3c_container%ijpair))
THEN
239 CALL release_ijpair(o3c_container%ijpair)
240 DEALLOCATE (o3c_container%ijpair)
249 SUBROUTINE release_ijpair(ijpair)
251 TYPE(o3c_pair_type),
DIMENSION(:) :: ijpair
255 DO i = 1,
SIZE(ijpair)
261 ijpair(i)%rij = 0.0_dp
263 IF (
ASSOCIATED(ijpair(i)%ijk))
THEN
264 CALL release_ijk(ijpair(i)%ijk)
265 DEALLOCATE (ijpair(i)%ijk)
269 END SUBROUTINE release_ijpair
275 SUBROUTINE release_ijk(ijk)
277 TYPE(o3c_int_type),
DIMENSION(:) :: ijk
289 IF (
ASSOCIATED(ijk(i)%integral))
THEN
290 DEALLOCATE (ijk(i)%integral)
292 IF (
ASSOCIATED(ijk(i)%tvec))
THEN
293 DEALLOCATE (ijk(i)%tvec)
295 IF (
ASSOCIATED(ijk(i)%force_i))
THEN
296 DEALLOCATE (ijk(i)%force_i)
298 IF (
ASSOCIATED(ijk(i)%force_j))
THEN
299 DEALLOCATE (ijk(i)%force_j)
301 IF (
ASSOCIATED(ijk(i)%force_k))
THEN
302 DEALLOCATE (ijk(i)%force_k)
306 END SUBROUTINE release_ijk
323 basis_set_list_a, basis_set_list_b, basis_set_list_c, &
326 LOGICAL,
OPTIONAL :: ijsymmetric
327 INTEGER,
OPTIONAL :: nspin, nijpairs
328 TYPE(o3c_pair_type),
DIMENSION(:),
OPTIONAL, &
331 OPTIONAL,
POINTER :: basis_set_list_a, basis_set_list_b, &
334 OPTIONAL,
POINTER :: sab_nl, sac_nl
336 IF (
PRESENT(ijsymmetric)) ijsymmetric = o3c%ijsymmetric
337 IF (
PRESENT(nspin)) nspin = o3c%nspin
338 IF (
PRESENT(nijpairs)) nijpairs = o3c%nijpairs
339 IF (
PRESENT(ijpair)) ijpair => o3c%ijpair
340 IF (
PRESENT(basis_set_list_a)) basis_set_list_a => o3c%basis_set_list_a
341 IF (
PRESENT(basis_set_list_b)) basis_set_list_b => o3c%basis_set_list_b
342 IF (
PRESENT(basis_set_list_c)) basis_set_list_c => o3c%basis_set_list_c
343 IF (
PRESENT(sab_nl)) sab_nl => o3c%sab_nl
344 IF (
PRESENT(sac_nl)) sac_nl => o3c%sac_nl
359 INTEGER,
OPTIONAL :: nthread
363 IF (
PRESENT(nthread))
THEN
369 o3c_iterator%o3c => o3c
370 o3c_iterator%ijp_last = 0
371 o3c_iterator%k_last = 0
372 ALLOCATE (o3c_iterator%ijp_thread(0:n - 1))
373 ALLOCATE (o3c_iterator%k_thread(0:n - 1))
374 o3c_iterator%ijp_thread = 0
375 o3c_iterator%k_thread = 0
386 NULLIFY (o3c_iterator%o3c)
387 o3c_iterator%ijp_last = 0
388 o3c_iterator%k_last = 0
389 DEALLOCATE (o3c_iterator%ijp_thread)
390 DEALLOCATE (o3c_iterator%k_thread)
415 iatom, jatom, katom, ikind, jkind, kkind, &
416 rij, rik, cellj, cellk, &
417 integral, tvec, force_i, force_j, force_k)
419 INTEGER,
OPTIONAL :: mepos, iatom, jatom, katom, ikind, &
421 REAL(kind=
dp),
DIMENSION(3),
OPTIONAL :: rij, rik
422 INTEGER,
DIMENSION(3),
OPTIONAL :: cellj, cellk
423 REAL(kind=
dp),
DIMENSION(:, :, :),
OPTIONAL, &
425 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: tvec, force_i, force_j, force_k
429 TYPE(o3c_int_type),
POINTER :: ijk
430 TYPE(o3c_pair_type),
POINTER :: ijp
432 IF (
PRESENT(mepos))
THEN
438 ij = o3c_iterator%ijp_thread(me)
439 k = o3c_iterator%k_thread(me)
441 o3c => o3c_iterator%o3c
442 ijp => o3c%ijpair(ij)
445 IF (
PRESENT(iatom)) iatom = ijp%iatom
446 IF (
PRESENT(jatom)) jatom = ijp%jatom
447 IF (
PRESENT(ikind)) ikind = ijp%ikind
448 IF (
PRESENT(jkind)) jkind = ijp%jkind
449 IF (
PRESENT(katom)) katom = ijk%katom
450 IF (
PRESENT(kkind)) kkind = ijk%kkind
452 IF (
PRESENT(rij)) rij(1:3) = ijp%rij(1:3)
453 IF (
PRESENT(rik)) rik(1:3) = ijk%rik(1:3)
455 IF (
PRESENT(cellj)) cellj(1:3) = ijp%cellj(1:3)
456 IF (
PRESENT(cellk)) cellk(1:3) = ijk%cellk(1:3)
458 IF (
PRESENT(integral)) integral => ijk%integral
459 IF (
PRESENT(tvec)) tvec => ijk%tvec
460 IF (
PRESENT(force_i)) force_i => ijk%force_i
461 IF (
PRESENT(force_j)) force_j => ijk%force_j
462 IF (
PRESENT(force_k)) force_k => ijk%force_k
474 INTEGER,
OPTIONAL :: mepos
477 INTEGER :: ij, ijpair, klist, me
480 IF (
PRESENT(mepos))
THEN
487 IF (o3c_iterator%o3c%nijpairs == 0)
THEN
493 o3c => o3c_iterator%o3c
495 ijpair = o3c_iterator%ijp_last
496 klist = o3c_iterator%k_last
498 IF (ijpair == 0 .AND. klist == 0)
THEN
501 DO ij = 1, o3c%nijpairs
502 IF (o3c%ijpair(ij)%nklist > 0)
THEN
503 o3c_iterator%ijp_thread(me) = ij
504 o3c_iterator%k_thread(me) = 1
509 ELSE IF (ijpair == o3c%nijpairs .AND. klist == o3c%ijpair(ijpair)%nklist)
THEN
512 ELSE IF (klist == o3c%ijpair(ijpair)%nklist)
THEN
515 DO ij = ijpair + 1, o3c%nijpairs
516 IF (o3c%ijpair(ij)%nklist > 0)
THEN
517 o3c_iterator%ijp_thread(me) = ij
518 o3c_iterator%k_thread(me) = 1
525 o3c_iterator%ijp_thread(me) = ijpair
526 o3c_iterator%k_thread(me) = klist + 1
532 o3c_iterator%ijp_last = o3c_iterator%ijp_thread(me)
533 o3c_iterator%k_last = o3c_iterator%k_thread(me)
536 o3c_iterator%ijp_last = o3c%nijpairs
537 o3c_iterator%k_last = o3c%ijpair(o3c%nijpairs)%nklist
555 INTEGER,
OPTIONAL :: mepos
556 REAL(kind=
dp),
DIMENSION(:, :, :),
OPTIONAL, &
558 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: tvec, force_i, force_j, force_k
562 TYPE(o3c_int_type),
POINTER :: ijk
563 TYPE(o3c_pair_type),
POINTER :: ijp
565 IF (
PRESENT(mepos))
THEN
571 ij = o3c_iterator%ijp_thread(me)
572 k = o3c_iterator%k_thread(me)
574 o3c => o3c_iterator%o3c
575 ijp => o3c%ijpair(ij)
578 IF (
PRESENT(integral)) ijk%integral => integral
579 IF (
PRESENT(tvec)) ijk%tvec => tvec
580 IF (
PRESENT(force_i)) ijk%force_i => force_i
581 IF (
PRESENT(force_j)) ijk%force_j => force_j
582 IF (
PRESENT(force_k)) ijk%force_k => force_k
593 INTEGER,
DIMENSION(:),
INTENT(IN) :: nsize
598 cpassert(
SIZE(nsize) == m)
602 ALLOCATE (o3c_vec(i)%v(n))
603 o3c_vec(i)%v = 0.0_dp
618 DO i = 1,
SIZE(o3c_vec)
619 IF (
ASSOCIATED(o3c_vec(i)%v))
THEN
620 DEALLOCATE (o3c_vec(i)%v)
635 INTEGER,
INTENT(IN) :: i
636 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: vec
637 INTEGER,
OPTIONAL :: n
639 cpassert(i > 0 .AND. i <=
SIZE(o3c_vec))
641 IF (
PRESENT(vec)) vec => o3c_vec(i)%v
642 IF (
PRESENT(n)) n = o3c_vec(i)%n
Defines the basic variable types.
integer, parameter, public dp
Define the neighbor list data types and the corresponding functionality.
subroutine, public neighbor_list_iterator_create(iterator_set, nl, search, nthread)
Neighbor list iterator functions.
subroutine, public nl_set_sub_iterator(iterator_set, ikind, jkind, iatom, mepos)
...
subroutine, public neighbor_list_iterator_release(iterator_set)
...
subroutine, public get_neighbor_list_set_p(neighbor_list_sets, nlist, symmetric)
Return the components of the first neighbor list set.
integer function, public neighbor_list_iterate(iterator_set, mepos)
...
subroutine, public get_iterator_info(iterator_set, mepos, ikind, jkind, nkind, ilist, nlist, inode, nnode, iatom, jatom, r, cell)
...
3-center overlap type integrals containers
subroutine, public o3c_vec_create(o3c_vec, nsize)
...
subroutine, public set_o3c_container(o3c_iterator, mepos, integral, tvec, force_i, force_j, force_k)
...
subroutine, public get_o3c_iterator_info(o3c_iterator, mepos, iatom, jatom, katom, ikind, jkind, kkind, rij, rik, cellj, cellk, integral, tvec, force_i, force_j, force_k)
...
subroutine, public o3c_iterator_create(o3c, o3c_iterator, nthread)
...
subroutine, public release_o3c_container(o3c_container)
...
subroutine, public o3c_iterator_release(o3c_iterator)
...
subroutine, public get_o3c_vec(o3c_vec, i, vec, n)
...
integer function, public o3c_iterate(o3c_iterator, mepos)
...
subroutine, public o3c_vec_release(o3c_vec)
...
subroutine, public init_o3c_container(o3c, nspin, basis_set_list_a, basis_set_list_b, basis_set_list_c, sab_nl, sac_nl, only_bc_same_center)
...
subroutine, public get_o3c_container(o3c, ijsymmetric, nspin, nijpairs, ijpair, basis_set_list_a, basis_set_list_b, basis_set_list_c, sab_nl, sac_nl)
...