Find the nearest translation images for an interatomic vector
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(out) | :: | iws |
Number of nearest images |
||
| real(kind=wp), | intent(in) | :: | trans(:,:) |
Translation vectors |
||
| real(kind=wp), | intent(in) | :: | rij(3) |
Interatomic vector |
||
| integer, | intent(out) | :: | list(:) |
Indices of the nearest translation images |
subroutine get_pairs(iws, trans, rij, list) !> Number of nearest images integer, intent(out) :: iws !> Translation vectors real(wp), intent(in) :: trans(:, :) !> Interatomic vector real(wp), intent(in) :: rij(3) !> Indices of the nearest translation images integer, intent(out) :: list(:) logical :: mask(size(list)) real(wp) :: dist(size(list)), vec(3), r2 integer :: itr, img, pos integer :: index(size(list)) iws = 0 img = 0 list(:) = 0 index(:) = 0 mask(:) = .true. do itr = 1, size(trans, 2) vec(:) = rij - trans(:, itr) r2 = vec(1)**2 + vec(2)**2 + vec(3)**2 if (r2 < thr) cycle img = img + 1 dist(img) = r2 index(img) = itr end do if (img == 0) return pos = minloc(dist(:img), dim=1) r2 = dist(pos) mask(pos) = .false. iws = 1 list(iws) = index(pos) if (img <= iws) return do pos = minloc(dist(:img), dim=1, mask=mask(:img)) if (dist(pos) - r2 > tol) exit mask(pos) = .false. iws = iws + 1 list(iws) = index(pos) end do end subroutine get_pairs