Generate a supercell based on a realspace cutoff, this subroutine doesn’t know anything about the convergence behaviour of the associated property.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=wp), | intent(in) | :: | lat(3,3) | |||
real(kind=wp), | intent(in) | :: | rthr | |||
integer, | intent(out) | :: | rep(3) |
pure subroutine get_translations(lat, rthr, rep) real(wp), intent(in) :: rthr real(wp), intent(in) :: lat(3, 3) integer, intent(out) :: rep(3) real(wp) :: normx(3), normy(3), normz(3) real(wp) :: cos10, cos21, cos32 ! find normal to the plane... call crossproduct(lat(:, 2), lat(:, 3), normx) call crossproduct(lat(:, 3), lat(:, 1), normy) call crossproduct(lat(:, 1), lat(:, 2), normz) ! ...normalize it... normx = normx/norm2(normx) normy = normy/norm2(normy) normz = normz/norm2(normz) ! cos angles between normals and lattice vectors cos10 = sum(normx*lat(:, 1)) cos21 = sum(normy*lat(:, 2)) cos32 = sum(normz*lat(:, 3)) rep(1) = ceiling(abs(rthr/cos10)) rep(2) = ceiling(abs(rthr/cos21)) rep(3) = ceiling(abs(rthr/cos32)) contains pure subroutine crossproduct(a, b, c) real(wp), intent(in) :: a(3) real(wp), intent(in) :: b(3) real(wp), intent(out) :: c(3) c(1)=a(2)*b(3)-b(2)*a(3) c(2)=a(3)*b(1)-b(3)*a(1) c(3)=a(1)*b(2)-b(1)*a(2) end subroutine crossproduct end subroutine get_translations