Guest User

Untitled

a guest
May 23rd, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.08 KB | None | 0 0
  1. import numpy as np
  2.  
  3. #
  4. # Delaunay reduction (originally from phonopy)
  5. #
  6. def get_Delaunay_reduction(lattice, tolerance):
  7. extended_bases = np.zeros((4, 3), dtype=float)
  8. extended_bases[:3,:] = np.transpose(lattice)
  9. extended_bases[3] = -np.sum(lattice, axis=1)
  10.  
  11. for i in range(100):
  12. if reduce_bases(extended_bases, tolerance):
  13. break
  14. if i == 99:
  15. print("Delaunary reduction failed.")
  16.  
  17. shortest3 = get_shortest_bases(extended_bases, tolerance)
  18.  
  19. return shortest3.T.copy()
  20.  
  21. def reduce_bases(extended_bases, tolerance):
  22. metric = np.dot(extended_bases, extended_bases.T)
  23. for i in range(4):
  24. for j in range(i+1, 4):
  25. if metric[i, j] > tolerance:
  26. for k in range(4):
  27. if (not k == i) and (not k == j):
  28. extended_bases[k] += extended_bases[i]
  29. extended_bases[i] = -extended_bases[i]
  30. extended_bases[j] = extended_bases[j]
  31. return False
  32.  
  33. # All non diagonal elements of metric tensor is negative.
  34. # Reduction is completed.
  35. return True
  36.  
  37. def get_shortest_bases(extended_bases, tolerance):
  38.  
  39. def mycmp(x, y):
  40. return cmp(np.vdot(x, x), np.vdot(y, y))
  41.  
  42. basis = np.zeros((7, 3), dtype=float)
  43. basis[:4] = extended_bases
  44. basis[4] = extended_bases[0] + extended_bases[1]
  45. basis[5] = extended_bases[1] + extended_bases[2]
  46. basis[6] = extended_bases[2] + extended_bases[0]
  47. # Sort bases by the lengthes (shorter is earlier)
  48. basis = sorted(basis, cmp=mycmp)
  49.  
  50. # Choose shortest and linearly independent three bases
  51. # This algorithm may not be perfect.
  52. for i in range(7):
  53. for j in range(i+1, 7):
  54. for k in range(j+1, 7):
  55. if abs(np.linalg.det([basis[i],
  56. basis[j],
  57. basis[k]])) > tolerance:
  58. return np.array([basis[i],
  59. basis[j],
  60. basis[k]])
  61.  
  62. print("Delaunary reduction is failed.")
  63. return basis[:3]
Add Comment
Please, Sign In to add comment