22 #include "./base/base_uses.f90"
30 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_neighbor_list_types'
35 TYPE neighbor_node_type
37 TYPE(neighbor_node_type),
POINTER :: next_neighbor_node
38 REAL(dp),
DIMENSION(3) :: r
39 INTEGER,
DIMENSION(3) :: cell
41 END TYPE neighbor_node_type
44 TYPE neighbor_list_type
46 TYPE(neighbor_list_type),
POINTER :: next_neighbor_list
47 TYPE(neighbor_node_type),
POINTER :: first_neighbor_node, &
49 INTEGER :: atom, nnode
50 END TYPE neighbor_list_type
53 TYPE neighbor_list_set_type
55 TYPE(neighbor_list_type),
POINTER :: first_neighbor_list, &
59 END TYPE neighbor_list_set_type
62 TYPE neighbor_list_p_type
63 TYPE(neighbor_list_type),
POINTER :: neighbor_list
64 END TYPE neighbor_list_p_type
67 TYPE neighbor_list_set_p_type
68 TYPE(neighbor_list_set_type),
POINTER :: neighbor_list_set
72 TYPE(neighbor_list_task_type),
DIMENSION(:),
POINTER :: nlist_task
73 END TYPE neighbor_list_set_p_type
79 INTEGER,
DIMENSION(:),
POINTER :: atom_list
80 INTEGER,
DIMENSION(:),
POINTER :: atom_index
81 TYPE(neighbor_list_p_type), &
82 DIMENSION(:),
POINTER :: neighbor_list
83 END TYPE list_search_type
86 TYPE neighbor_list_task_type
87 INTEGER :: iatom, jatom, &
88 ikind, jkind, nkind, &
89 ilist, nlist, inode, nnode
90 REAL(KIND=
dp),
DIMENSION(3) :: r
91 INTEGER,
DIMENSION(3) :: cell
92 TYPE(neighbor_list_task_type), &
94 END TYPE neighbor_list_task_type
98 MODULE PROCEDURE nl_sub_iterate_ref
104 TYPE neighbor_list_iterator_type
106 INTEGER :: ikind, jkind, ilist, inode
107 INTEGER :: nkind, nlist, nnode
108 INTEGER :: iatom, jatom
109 TYPE(neighbor_list_set_p_type), &
110 DIMENSION(:),
POINTER :: nl
111 TYPE(neighbor_list_type),
POINTER :: neighbor_list
112 TYPE(neighbor_node_type),
POINTER :: neighbor_node
113 TYPE(list_search_type), &
114 DIMENSION(:),
POINTER :: list_search
115 END TYPE neighbor_list_iterator_type
117 TYPE neighbor_list_iterator_p_type
119 TYPE(neighbor_list_iterator_type),
POINTER :: neighbor_list_iterator
121 END TYPE neighbor_list_iterator_p_type
126 PUBLIC :: neighbor_list_p_type, &
127 neighbor_list_set_type, &
128 neighbor_list_set_p_type, &
129 neighbor_list_task_type
144 PUBLIC :: neighbor_list_iterator_p_type, &
165 TYPE(neighbor_list_iterator_p_type), &
166 DIMENSION(:),
POINTER :: iterator_set
167 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
169 LOGICAL,
INTENT(IN),
OPTIONAL :: search
170 INTEGER,
INTENT(IN),
OPTIONAL :: nthread
172 INTEGER :: iatom, il, ilist, mthread, nlist
173 TYPE(list_search_type),
DIMENSION(:),
POINTER :: list_search
174 TYPE(neighbor_list_iterator_type),
POINTER :: iterator
175 TYPE(neighbor_list_type),
POINTER :: neighbor_list
178 IF (
PRESENT(nthread)) mthread = nthread
180 ALLOCATE (iterator_set(0:mthread - 1))
182 DO il = 0, mthread - 1
183 ALLOCATE (iterator_set(il)%neighbor_list_iterator)
185 iterator => iterator_set(il)%neighbor_list_iterator
191 iterator%nkind = nint(sqrt(real(
SIZE(nl),
dp)))
201 NULLIFY (iterator%neighbor_list)
202 NULLIFY (iterator%neighbor_node)
203 NULLIFY (iterator%list_search)
206 iterator_set(:)%last = 0
208 IF (
PRESENT(search))
THEN
210 ALLOCATE (list_search(
SIZE(nl)))
212 IF (
ASSOCIATED(nl(il)%neighbor_list_set))
THEN
214 list_search(il)%nlist = nlist
215 ALLOCATE (list_search(il)%atom_list(nlist))
216 ALLOCATE (list_search(il)%atom_index(nlist))
217 ALLOCATE (list_search(il)%neighbor_list(nlist))
219 NULLIFY (neighbor_list)
221 IF (.NOT.
ASSOCIATED(neighbor_list))
THEN
222 neighbor_list => first_list(nl(il)%neighbor_list_set)
224 neighbor_list => neighbor_list%next_neighbor_list
226 CALL get_neighbor_list(neighbor_list=neighbor_list,
atom=iatom)
227 list_search(il)%atom_list(ilist) = iatom
228 list_search(il)%neighbor_list(ilist)%neighbor_list => neighbor_list
230 CALL sort(list_search(il)%atom_list, nlist, list_search(il)%atom_index)
233 list_search(il)%nlist = -1
234 NULLIFY (list_search(il)%atom_list, list_search(il)%atom_index, list_search(il)%neighbor_list)
237 DO il = 0, mthread - 1
238 iterator => iterator_set(il)%neighbor_list_iterator
239 iterator%list_search => list_search
251 TYPE(neighbor_list_iterator_p_type), &
252 DIMENSION(:),
POINTER :: iterator_set
254 INTEGER :: il, mthread
255 TYPE(neighbor_list_iterator_type),
POINTER :: iterator
259 iterator => iterator_set(0)%neighbor_list_iterator
260 IF (
ASSOCIATED(iterator%list_search))
THEN
261 DO il = 1,
SIZE(iterator%list_search)
262 IF (iterator%list_search(il)%nlist >= 0)
THEN
263 DEALLOCATE (iterator%list_search(il)%atom_list)
264 DEALLOCATE (iterator%list_search(il)%atom_index)
265 DEALLOCATE (iterator%list_search(il)%neighbor_list)
268 DEALLOCATE (iterator%list_search)
271 mthread =
SIZE(iterator_set)
272 DO il = 0, mthread - 1
273 DEALLOCATE (iterator_set(il)%neighbor_list_iterator)
275 DEALLOCATE (iterator_set)
288 TYPE(neighbor_list_iterator_p_type), &
289 DIMENSION(:),
POINTER :: iterator_set
290 INTEGER,
INTENT(IN) :: ikind, jkind, iatom
291 INTEGER,
INTENT(IN),
OPTIONAL :: mepos
293 INTEGER :: i, ij, ilist, me, nlist, nnode
294 TYPE(list_search_type),
POINTER :: list_search
295 TYPE(neighbor_list_iterator_type),
POINTER :: iterator
296 TYPE(neighbor_list_type),
POINTER :: neighbor_list
298 IF (
PRESENT(mepos))
THEN
306 iterator => iterator_set(me)%neighbor_list_iterator
307 ij = ikind + iterator%nkind*(jkind - 1)
308 IF (
ASSOCIATED(iterator%list_search))
THEN
309 list_search => iterator%list_search(ij)
310 nlist = list_search%nlist
312 NULLIFY (neighbor_list)
314 i =
locate(list_search%atom_list, iatom)
315 i = list_search%atom_index(i)
316 IF (i > 0) neighbor_list => list_search%neighbor_list(i)%neighbor_list
319 IF (
ASSOCIATED(neighbor_list))
THEN
320 CALL get_neighbor_list(neighbor_list=neighbor_list, nnode=nnode)
328 iterator%ikind = ikind
329 iterator%jkind = jkind
331 iterator%ilist = ilist
332 iterator%nlist = nlist
334 iterator%nnode = nnode
336 iterator%iatom = iatom
339 iterator%neighbor_list => neighbor_list
340 NULLIFY (iterator%neighbor_node)
351 TYPE(neighbor_list_iterator_p_type), &
352 DIMENSION(:),
POINTER :: iterator_set
353 INTEGER,
OPTIONAL :: mepos
356 INTEGER :: iab, last, me
357 TYPE(neighbor_list_iterator_type),
POINTER :: iterator
358 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
361 IF (
SIZE(iterator_set) .NE. 1 .AND. .NOT.
PRESENT(mepos)) &
362 cpabort(
"Parallel iterator calls must include 'mepos'")
364 IF (
PRESENT(mepos))
THEN
373 last = iterator_set(0)%last
375 iterator_set(me)%neighbor_list_iterator = iterator_set(last)%neighbor_list_iterator
377 iterator => iterator_set(me)%neighbor_list_iterator
380 IF (iterator%inode < iterator%nnode)
THEN
382 iterator%inode = iterator%inode + 1
383 iterator%neighbor_node => iterator%neighbor_node%next_neighbor_node
385 iab = max(iterator%ikind + iterator%nkind*(iterator%jkind - 1), 0)
388 IF (iterator%ilist >= iterator%nlist)
EXIT listloop
389 iterator%ilist = iterator%ilist + 1
390 IF (
ASSOCIATED(iterator%neighbor_list))
THEN
391 iterator%neighbor_list => iterator%neighbor_list%next_neighbor_list
393 iterator%neighbor_list => first_list(nl(iab)%neighbor_list_set)
395 CALL get_neighbor_list(neighbor_list=iterator%neighbor_list,
atom=iterator%iatom, &
396 nnode=iterator%nnode)
397 IF (iterator%nnode > 0)
EXIT kindloop
399 IF (iab >= iterator%nkind**2)
THEN
404 iterator%jkind = (iab - 1)/iterator%nkind + 1
405 iterator%ikind = iab - iterator%nkind*(iterator%jkind - 1)
407 IF (.NOT.
ASSOCIATED(nl(iab)%neighbor_list_set))
THEN
412 nl(iab)%neighbor_list_set, nlist=iterator%nlist)
415 NULLIFY (iterator%neighbor_list)
420 iterator%neighbor_node => first_node(iterator%neighbor_list)
424 CALL get_neighbor_node(neighbor_node=iterator%neighbor_node, neighbor=iterator%jatom)
428 iterator_set(:)%last = me
440 TYPE(neighbor_list_iterator_p_type), &
441 DIMENSION(:),
POINTER :: iterator_set
442 INTEGER,
INTENT(IN),
OPTIONAL :: mepos
446 TYPE(neighbor_list_iterator_type),
POINTER :: iterator
450 IF (
PRESENT(mepos))
THEN
458 iterator => iterator_set(me)%neighbor_list_iterator
460 IF (
ASSOCIATED(iterator%neighbor_list))
THEN
461 IF (iterator%inode >= iterator%nnode)
THEN
464 ELSEIF (iterator%inode == 0)
THEN
466 iterator%neighbor_node => first_node(iterator%neighbor_list)
467 ELSEIF (iterator%inode > 0)
THEN
469 iterator%inode = iterator%inode + 1
470 iterator%neighbor_node => iterator%neighbor_node%next_neighbor_node
479 CALL get_neighbor_node(neighbor_node=iterator%neighbor_node, neighbor=iterator%jatom)
492 RECURSIVE FUNCTION nl_sub_iterate_ref(iter_sub, iter_ref, mepos)
RESULT(iter_stat)
493 TYPE(neighbor_list_iterator_p_type), &
494 DIMENSION(:),
POINTER :: iter_sub, iter_ref
495 INTEGER,
INTENT(IN),
OPTIONAL :: mepos
498 INTEGER :: atom_ref, kind_ref, kind_sub, me, nkind
499 TYPE(neighbor_list_iterator_type),
POINTER :: iterator
501 IF (
PRESENT(mepos))
THEN
507 iterator => iter_sub(me)%neighbor_list_iterator
508 kind_sub = iterator%jkind
512 IF (iterator%inode == 0)
THEN
516 IF (iter_stat == 0)
RETURN
518 nkind = iterator%nkind
520 IF (kind_sub == nkind)
THEN
524 kind_sub = kind_sub + 1
526 iter_stat = nl_sub_iterate_ref(iter_sub, iter_ref)
548 ikind, jkind, nkind, ilist, nlist, inode, nnode, iatom, jatom, r, cell)
549 TYPE(neighbor_list_iterator_p_type), &
550 DIMENSION(:),
POINTER :: iterator_set
551 INTEGER,
OPTIONAL :: mepos, ikind, jkind, nkind, ilist, &
552 nlist, inode, nnode, iatom, jatom
553 REAL(
dp),
DIMENSION(3),
OPTIONAL :: r
554 INTEGER,
DIMENSION(3),
OPTIONAL :: cell
557 TYPE(neighbor_list_iterator_type),
POINTER :: iterator
559 IF (
SIZE(iterator_set) .NE. 1 .AND. .NOT.
PRESENT(mepos)) &
560 cpabort(
"Parallel iterator calls must include 'mepos'")
562 IF (
PRESENT(mepos))
THEN
567 iterator => iterator_set(me)%neighbor_list_iterator
569 IF (
PRESENT(ikind)) ikind = iterator%ikind
570 IF (
PRESENT(jkind)) jkind = iterator%jkind
571 IF (
PRESENT(nkind)) nkind = iterator%nkind
572 IF (
PRESENT(ilist)) ilist = iterator%ilist
573 IF (
PRESENT(nlist)) nlist = iterator%nlist
574 IF (
PRESENT(inode)) inode = iterator%inode
575 IF (
PRESENT(nnode)) nnode = iterator%nnode
576 IF (
PRESENT(iatom)) iatom = iterator%iatom
577 IF (
PRESENT(jatom)) jatom = iterator%jatom
579 CALL get_neighbor_node(neighbor_node=iterator%neighbor_node, r=r)
581 IF (
PRESENT(cell))
THEN
582 CALL get_neighbor_node(neighbor_node=iterator%neighbor_node, cell=cell)
594 TYPE(neighbor_list_iterator_p_type), &
595 DIMENSION(:),
POINTER :: iterator_set
596 TYPE(neighbor_list_task_type),
INTENT(OUT) :: task
597 INTEGER,
OPTIONAL :: mepos
599 IF (
PRESENT(mepos))
THEN
600 CALL get_iterator_info(iterator_set, mepos=mepos, ikind=task%ikind, jkind=task%jkind, &
602 ilist=task%ilist, nlist=task%nlist, &
603 inode=task%inode, nnode=task%nnode, &
604 iatom=task%iatom, jatom=task%jatom, &
605 r=task%r, cell=task%cell)
609 ilist=task%ilist, nlist=task%nlist, &
610 inode=task%inode, nnode=task%nnode, &
611 iatom=task%iatom, jatom=task%jatom, &
612 r=task%r, cell=task%cell)
630 TYPE(neighbor_list_set_type),
POINTER :: neighbor_list_set
631 INTEGER,
INTENT(IN) ::
atom
632 TYPE(neighbor_list_type),
POINTER :: neighbor_list
634 TYPE(neighbor_list_type),
POINTER :: new_neighbor_list
636 IF (
ASSOCIATED(neighbor_list_set))
THEN
638 IF (
ASSOCIATED(neighbor_list_set%last_neighbor_list))
THEN
640 new_neighbor_list => &
641 neighbor_list_set%last_neighbor_list%next_neighbor_list
643 IF (.NOT.
ASSOCIATED(new_neighbor_list))
THEN
647 ALLOCATE (new_neighbor_list)
649 NULLIFY (new_neighbor_list%next_neighbor_list)
650 NULLIFY (new_neighbor_list%first_neighbor_node)
654 neighbor_list_set%last_neighbor_list%next_neighbor_list => new_neighbor_list
660 new_neighbor_list => neighbor_list_set%first_neighbor_list
662 IF (.NOT.
ASSOCIATED(new_neighbor_list))
THEN
666 ALLOCATE (new_neighbor_list)
668 NULLIFY (new_neighbor_list%next_neighbor_list)
669 NULLIFY (new_neighbor_list%first_neighbor_node)
673 neighbor_list_set%first_neighbor_list => new_neighbor_list
681 NULLIFY (new_neighbor_list%last_neighbor_node)
682 new_neighbor_list%atom =
atom
683 new_neighbor_list%nnode = 0
688 neighbor_list_set%last_neighbor_list => new_neighbor_list
692 neighbor_list_set%nlist = neighbor_list_set%nlist + 1
696 neighbor_list => new_neighbor_list
700 cpabort(
"The requested neighbor list set is not associated")
720 TYPE(neighbor_list_type),
POINTER :: neighbor_list
721 INTEGER,
INTENT(IN) :: neighbor
722 INTEGER,
DIMENSION(3),
INTENT(IN) :: cell
723 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: r
724 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: exclusion_list
725 INTEGER,
INTENT(IN),
OPTIONAL :: nkind
727 INTEGER :: iatom, my_nkind
728 TYPE(neighbor_node_type),
POINTER :: new_neighbor_node
730 IF (
ASSOCIATED(neighbor_list))
THEN
734 IF (
PRESENT(exclusion_list))
THEN
735 IF (
ASSOCIATED(exclusion_list))
THEN
736 DO iatom = 1,
SIZE(exclusion_list)
737 IF (exclusion_list(iatom) == 0)
EXIT
738 IF (exclusion_list(iatom) == neighbor)
RETURN
744 IF (
PRESENT(nkind)) my_nkind = nkind
746 IF (
ASSOCIATED(neighbor_list%last_neighbor_node))
THEN
748 new_neighbor_node => neighbor_list%last_neighbor_node%next_neighbor_node
750 IF (.NOT.
ASSOCIATED(new_neighbor_node))
THEN
754 ALLOCATE (new_neighbor_node)
756 NULLIFY (new_neighbor_node%next_neighbor_node)
760 neighbor_list%last_neighbor_node%next_neighbor_node => new_neighbor_node
766 new_neighbor_node => neighbor_list%first_neighbor_node
768 IF (.NOT.
ASSOCIATED(new_neighbor_node))
THEN
772 ALLOCATE (new_neighbor_node)
774 NULLIFY (new_neighbor_node%next_neighbor_node)
778 neighbor_list%first_neighbor_node => new_neighbor_node
786 new_neighbor_node%neighbor = neighbor
787 new_neighbor_node%cell(:) = cell(:)
788 new_neighbor_node%r(:) = r(:)
792 neighbor_list%last_neighbor_node => new_neighbor_node
796 neighbor_list%nnode = neighbor_list%nnode + 1
800 cpabort(
"The requested neighbor list is not associated")
816 TYPE(neighbor_list_set_type),
POINTER :: neighbor_list_set
817 LOGICAL,
INTENT(IN) :: symmetric
821 IF (
ASSOCIATED(neighbor_list_set))
THEN
827 ALLOCATE (neighbor_list_set)
829 NULLIFY (neighbor_list_set%first_neighbor_list)
833 CALL init_neighbor_list_set(neighbor_list_set, symmetric)
844 SUBROUTINE deallocate_neighbor_list(neighbor_list)
846 TYPE(neighbor_list_type),
POINTER :: neighbor_list
848 TYPE(neighbor_node_type),
POINTER :: neighbor_node, next_neighbor_node
850 IF (
ASSOCIATED(neighbor_list))
THEN
852 neighbor_node => neighbor_list%first_neighbor_node
854 DO WHILE (
ASSOCIATED(neighbor_node))
855 next_neighbor_node => neighbor_node%next_neighbor_node
856 DEALLOCATE (neighbor_node)
857 neighbor_node => next_neighbor_node
860 DEALLOCATE (neighbor_list)
864 END SUBROUTINE deallocate_neighbor_list
874 TYPE(neighbor_list_set_type),
POINTER :: neighbor_list_set
876 TYPE(neighbor_list_type),
POINTER :: neighbor_list, next_neighbor_list
878 IF (
ASSOCIATED(neighbor_list_set))
THEN
880 neighbor_list => neighbor_list_set%first_neighbor_list
882 DO WHILE (
ASSOCIATED(neighbor_list))
883 next_neighbor_list => neighbor_list%next_neighbor_list
884 CALL deallocate_neighbor_list(neighbor_list)
885 neighbor_list => next_neighbor_list
888 DEALLOCATE (neighbor_list_set)
902 FUNCTION first_list(neighbor_list_set)
RESULT(first_neighbor_list)
904 TYPE(neighbor_list_set_type),
POINTER :: neighbor_list_set
905 TYPE(neighbor_list_type),
POINTER :: first_neighbor_list
907 first_neighbor_list => neighbor_list_set%first_neighbor_list
909 END FUNCTION first_list
919 FUNCTION first_node(neighbor_list)
RESULT(first_neighbor_node)
921 TYPE(neighbor_list_type),
POINTER :: neighbor_list
922 TYPE(neighbor_node_type),
POINTER :: first_neighbor_node
924 first_neighbor_node => neighbor_list%first_neighbor_node
926 END FUNCTION first_node
937 SUBROUTINE get_neighbor_list(neighbor_list, atom, nnode)
939 TYPE(neighbor_list_type),
POINTER :: neighbor_list
940 INTEGER,
INTENT(OUT),
OPTIONAL ::
atom, nnode
942 IF (
ASSOCIATED(neighbor_list))
THEN
944 IF (
PRESENT(
atom))
atom = neighbor_list%atom
945 IF (
PRESENT(nnode)) nnode = neighbor_list%nnode
949 cpabort(
"The requested neighbor list is not associated")
953 END SUBROUTINE get_neighbor_list
966 TYPE(neighbor_list_set_type),
POINTER :: neighbor_list_set
967 INTEGER,
INTENT(OUT),
OPTIONAL :: nlist
968 LOGICAL,
INTENT(OUT),
OPTIONAL :: symmetric
970 IF (
ASSOCIATED(neighbor_list_set))
THEN
972 IF (
PRESENT(nlist)) nlist = neighbor_list_set%nlist
973 IF (
PRESENT(symmetric)) symmetric = neighbor_list_set%symmetric
977 cpabort(
"The requested neighbor list set is not associated")
994 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
995 POINTER :: neighbor_list_sets
996 INTEGER,
INTENT(OUT),
OPTIONAL :: nlist
997 LOGICAL,
INTENT(OUT),
OPTIONAL :: symmetric
1000 TYPE(neighbor_list_set_type),
POINTER :: neighbor_list_set
1002 IF (
ASSOCIATED(neighbor_list_sets))
THEN
1004 NULLIFY (neighbor_list_set)
1005 DO i = 1,
SIZE(neighbor_list_sets)
1006 neighbor_list_set => neighbor_list_sets(i)%neighbor_list_set
1007 IF (
ASSOCIATED(neighbor_list_set))
EXIT
1010 IF (
ASSOCIATED(neighbor_list_set))
THEN
1011 IF (
PRESENT(nlist)) nlist = neighbor_list_set%nlist
1012 IF (
PRESENT(symmetric)) symmetric = neighbor_list_set%symmetric
1014 CALL cp_abort(__location__,
"No neighbor list set is associated. "// &
1015 "Did you specify *all* required basis-sets, eg. for ADMM?")
1020 cpabort(
"The requested neighbor list sets are not associated")
1036 SUBROUTINE get_neighbor_node(neighbor_node, neighbor, cell, r)
1038 TYPE(neighbor_node_type),
POINTER :: neighbor_node
1039 INTEGER,
INTENT(OUT),
OPTIONAL :: neighbor
1040 INTEGER,
DIMENSION(3),
INTENT(OUT),
OPTIONAL :: cell
1041 REAL(
dp),
DIMENSION(3),
INTENT(OUT),
OPTIONAL :: r
1043 IF (
ASSOCIATED(neighbor_node))
THEN
1045 IF (
PRESENT(neighbor)) neighbor = neighbor_node%neighbor
1046 IF (
PRESENT(r)) r(:) = neighbor_node%r(:)
1047 IF (
PRESENT(cell)) cell(:) = neighbor_node%cell(:)
1051 cpabort(
"The requested neighbor node is not associated")
1055 END SUBROUTINE get_neighbor_node
1067 SUBROUTINE init_neighbor_list_set(neighbor_list_set, symmetric)
1069 TYPE(neighbor_list_set_type),
POINTER :: neighbor_list_set
1070 LOGICAL,
INTENT(IN) :: symmetric
1072 IF (
ASSOCIATED(neighbor_list_set))
THEN
1075 NULLIFY (neighbor_list_set%last_neighbor_list)
1078 neighbor_list_set%nlist = 0
1081 neighbor_list_set%symmetric = symmetric
1085 cpabort(
"The requested neighbor list set is not associated")
1089 END SUBROUTINE init_neighbor_list_set
1097 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
1102 IF (
ASSOCIATED(nlists))
THEN
1103 DO i = 1,
SIZE(nlists)
1106 IF (
ASSOCIATED(nlists(1)%nlist_task))
THEN
1107 DEALLOCATE (nlists(1)%nlist_task)
Defines the basic variable types.
integer, parameter, public dp
Define the neighbor list data types and the corresponding functionality.
subroutine, public get_iterator_task(iterator_set, task, mepos)
Captures the current state of the iterator in a neighbor_list_task_type.
subroutine, public deallocate_neighbor_list_set(neighbor_list_set)
Deallocate a neighbor list set.
subroutine, public release_neighbor_list_sets(nlists)
releases an array of neighbor_list_sets
subroutine, public add_neighbor_node(neighbor_list, neighbor, cell, r, exclusion_list, nkind)
Add a new neighbor list node to a neighbor list.
integer function, public nl_sub_iterate(iterator_set, mepos)
...
subroutine, public add_neighbor_list(neighbor_list_set, atom, neighbor_list)
Add a new neighbor list to a neighbor list set.
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 get_neighbor_list_set(neighbor_list_set, nlist, symmetric)
Return the components of a neighbor list set.
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 allocate_neighbor_list_set(neighbor_list_set, symmetric)
Allocate and initialize a set of neighbor lists.
subroutine, public get_iterator_info(iterator_set, mepos, ikind, jkind, nkind, ilist, nlist, inode, nnode, iatom, jatom, r, cell)
...
All kind of helpful little routines.
pure integer function, public locate(array, x)
Purpose: Given an array array(1:n), and given a value x, a value x_index is returned which is the ind...