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))
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
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))