21 #include "./base/base_uses.f90"
30 REAL(KIND=
dp),
DIMENSION(3) :: s_max, s_min
31 INTEGER,
DIMENSION(:),
POINTER :: atom_list
32 REAL(KIND=
dp),
DIMENSION(3, 8) :: corners
35 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'subcell_types'
56 TYPE(subcell_type),
DIMENSION(:, :, :),
POINTER :: subcell
57 INTEGER,
DIMENSION(3),
INTENT(IN) :: nsubcell
58 INTEGER,
INTENT(IN),
OPTIONAL :: maxatom
59 TYPE(cell_type),
OPTIONAL,
POINTER :: cell
61 INTEGER :: i, j, k, na, nb, nc
62 REAL(
dp) :: a_max, a_min, b_max, b_min, c_max, &
63 c_min, delta_a, delta_b, delta_c
69 ALLOCATE (subcell(na, nb, nc))
71 delta_a = 1.0_dp/real(na,
dp)
72 delta_b = 1.0_dp/real(nb,
dp)
73 delta_c = 1.0_dp/real(nc,
dp)
78 c_max = c_min + delta_c
81 b_max = b_min + delta_b
84 a_max = a_min + delta_a
85 subcell(i, j, k)%s_min(1) = a_min
86 subcell(i, j, k)%s_min(2) = b_min
87 subcell(i, j, k)%s_min(3) = c_min
88 subcell(i, j, k)%s_max(1) = a_max
89 subcell(i, j, k)%s_max(2) = b_max
90 subcell(i, j, k)%s_max(3) = c_max
91 subcell(i, j, k)%natom = 0
92 IF (
PRESENT(cell))
THEN
93 CALL scaled_to_real(subcell(i, j, k)%corners(:, 1), (/a_min, b_min, c_min/), cell)
94 CALL scaled_to_real(subcell(i, j, k)%corners(:, 2), (/a_max, b_min, c_min/), cell)
95 CALL scaled_to_real(subcell(i, j, k)%corners(:, 3), (/a_min, b_max, c_min/), cell)
96 CALL scaled_to_real(subcell(i, j, k)%corners(:, 4), (/a_max, b_max, c_min/), cell)
97 CALL scaled_to_real(subcell(i, j, k)%corners(:, 5), (/a_min, b_min, c_max/), cell)
98 CALL scaled_to_real(subcell(i, j, k)%corners(:, 6), (/a_max, b_min, c_max/), cell)
99 CALL scaled_to_real(subcell(i, j, k)%corners(:, 7), (/a_min, b_max, c_max/), cell)
100 CALL scaled_to_real(subcell(i, j, k)%corners(:, 8), (/a_max, b_max, c_max/), cell)
102 IF (
PRESENT(maxatom))
THEN
103 ALLOCATE (subcell(i, j, k)%atom_list(maxatom))
123 TYPE(subcell_type),
DIMENSION(:, :, :),
POINTER :: subcell
127 IF (
ASSOCIATED(subcell))
THEN
129 DO k = 1,
SIZE(subcell, 3)
130 DO j = 1,
SIZE(subcell, 2)
131 DO i = 1,
SIZE(subcell, 1)
132 DEALLOCATE (subcell(i, j, k)%atom_list)
155 INTEGER,
DIMENSION(:),
POINTER :: atom_list
156 INTEGER,
DIMENSION(:),
INTENT(IN) :: kind_of
157 INTEGER,
DIMENSION(:) :: work
159 INTEGER :: i, i0, i1, i2, j0, j1, j2
168 DO i = 1,
SIZE(atom_list)
169 work(i0 + i - 1) = kind_of(atom_list(i))
171 CALL sort(work(i0:j0),
SIZE(atom_list), work(i1:j1))
172 work(i2:j2) = atom_list
173 DO i = 1,
SIZE(atom_list)
174 atom_list(i) = work(i2 + work(i1 + i - 1) - 1)
191 REAL(kind=
dp) :: r(3)
192 INTEGER,
INTENT(OUT) :: i, j, k
193 TYPE(cell_type),
POINTER :: cell
194 INTEGER,
DIMENSION(3),
INTENT(IN) :: nsubcell
196 REAL(kind=
dp) :: r_pbc(3), s(3), s_pbc(3)
200 s(:) = s_pbc + 0.5_dp
201 i = int(s(1)*real(nsubcell(1), kind=
dp)) + 1
202 j = int(s(2)*real(nsubcell(2), kind=
dp)) + 1
203 k = int(s(3)*real(nsubcell(3), kind=
dp)) + 1
204 i = min(max(i, 1), nsubcell(1))
205 j = min(max(j, 1), nsubcell(2))
206 k = min(max(k, 1), nsubcell(3))
Handles all functions related to the CELL.
subroutine, public scaled_to_real(r, s, cell)
Transform scaled cell coordinates real coordinates. r=h*s.
subroutine, public real_to_scaled(s, r, cell)
Transform real to scaled cell coordinates. s=h_inv*r.
Defines the basic variable types.
integer, parameter, public dp
subcell types and allocation routines
subroutine, public deallocate_subcell(subcell)
Deallocate a subcell grid structure.
subroutine, public give_ijk_subcell(r, i, j, k, cell, nsubcell)
...
subroutine, public reorder_atoms_subcell(atom_list, kind_of, work)
...
subroutine, public allocate_subcell(subcell, nsubcell, maxatom, cell)
Allocate and initialize a subcell grid structure for the atomic neighbor search.
All kind of helpful little routines.