Statistiques
| Révision :

root / ase / dft / kpoints.py @ 18

Historique | Voir | Annoter | Télécharger (9,57 ko)

1 1 tkerber
from __future__ import division
2 1 tkerber
import numpy as np
3 1 tkerber
4 1 tkerber
5 1 tkerber
def monkhorst_pack(size):
6 1 tkerber
    """Construct a uniform sampling of k-space of given size."""
7 1 tkerber
    if np.less_equal(size, 0).any():
8 1 tkerber
        raise ValueError('Illegal size: %s' % list(size))
9 1 tkerber
    kpts = np.indices(size).transpose((1, 2, 3, 0)).reshape((-1, 3))
10 1 tkerber
    return (kpts + 0.5) / size - 0.5
11 1 tkerber
12 1 tkerber
13 1 tkerber
def get_monkhorst_shape(kpts, tol=1e-5):
14 1 tkerber
    """Return the number of k-points along each axis of input Monkhorst pack.
15 1 tkerber

16 1 tkerber
    The set of k-points must not have been symmetry reduced.
17 1 tkerber
    """
18 1 tkerber
    nkpts = len(kpts)
19 1 tkerber
    if nkpts == 1:
20 1 tkerber
        return np.ones(3, int)
21 1 tkerber
22 1 tkerber
    Nk_c = np.zeros(3, int)
23 1 tkerber
    for c in range(3):
24 1 tkerber
        # Determine increment between kpoints along current axis
25 1 tkerber
        DeltaK = max(np.diff(np.sort(kpts[:, c])))
26 1 tkerber
27 1 tkerber
        # Determine number of kpoints as inverse of distance between kpoints
28 1 tkerber
        if DeltaK > tol:
29 1 tkerber
            Nk_c[c] = int(round(1. / DeltaK))
30 1 tkerber
        else:
31 1 tkerber
            Nk_c[c] = 1
32 1 tkerber
    return Nk_c
33 1 tkerber
34 1 tkerber
35 1 tkerber
def kpoint_convert(cell_cv, skpts_kc=None, ckpts_kv=None):
36 1 tkerber
    """Convert k-points between scaled and cartesian coordinates.
37 1 tkerber

38 1 tkerber
    Given the atomic unit cell, and either the scaled or cartesian k-point
39 1 tkerber
    coordinates, the other is determined.
40 1 tkerber

41 1 tkerber
    The k-point arrays can be either a single point, or a list of points,
42 1 tkerber
    i.e. the dimension k can be empty or multidimensional.
43 1 tkerber
    """
44 1 tkerber
    if ckpts_kv is None:
45 1 tkerber
        icell_cv = 2 * np.pi * np.linalg.inv(cell_cv).T
46 1 tkerber
        return np.dot(skpts_kc, icell_cv)
47 1 tkerber
    elif skpts_kc is None:
48 1 tkerber
        return np.dot(ckpts_kv, cell_cv.T) / (2 * np.pi)
49 1 tkerber
    else:
50 1 tkerber
        raise KeyError('Either scaled or cartesian coordinates must be given.')
51 1 tkerber
52 1 tkerber
53 1 tkerber
def get_bandpath(points, cell, npoints=50):
54 1 tkerber
    """Make a list of kpoints defining the path between the given points.
55 1 tkerber

56 1 tkerber
    points: list
57 1 tkerber
        List of special IBZ point pairs, e.g. ``points =
58 1 tkerber
        [W, L, Gamma, X, W, K]``.  These should be given in
59 1 tkerber
        scaled coordinates.
60 1 tkerber
    cell: 3x3 ndarray
61 1 tkerber
        Unit cell of the atoms.
62 1 tkerber
    npoints: int
63 1 tkerber
        Length of the output kpts list.
64 1 tkerber

65 1 tkerber
    Return list of k-points, list of x-coordinates and list of
66 1 tkerber
    x-coordinates of special points."""
67 1 tkerber
68 1 tkerber
    points = np.asarray(points)
69 1 tkerber
    dists = points[1:] - points[:-1]
70 1 tkerber
    lengths = [np.linalg.norm(d) for d in kpoint_convert(cell, skpts_kc=dists)]
71 1 tkerber
    length = sum(lengths)
72 1 tkerber
    kpts = []
73 1 tkerber
    x0 = 0
74 1 tkerber
    x = []
75 1 tkerber
    X = [0]
76 1 tkerber
    for P, d, L in zip(points[:-1], dists, lengths):
77 1 tkerber
        n = int(round(L * (npoints - 1 - len(x)) / (length - x0)))
78 1 tkerber
        for t in np.linspace(0, 1, n, endpoint=False):
79 1 tkerber
            kpts.append(P + t * d)
80 1 tkerber
            x.append(x0 + t * L)
81 1 tkerber
        x0 += L
82 1 tkerber
        X.append(x0)
83 1 tkerber
    kpts.append(points[-1])
84 1 tkerber
    x.append(x0)
85 1 tkerber
    return kpts, np.array(x), np.array(X)
86 1 tkerber
87 1 tkerber
88 1 tkerber
# The following is a list of the critical points in the 1. Brillouin zone
89 1 tkerber
# for some typical crystal structures.
90 1 tkerber
# (In units of the reciprocal basis vectors)
91 1 tkerber
# See http://en.wikipedia.org/wiki/Brillouin_zone
92 1 tkerber
ibz_points = {'cubic': {'Gamma': [0,     0,     0    ],
93 1 tkerber
                        'X':     [0,     0 / 2, 1 / 2],
94 1 tkerber
                        'R':     [1 / 2, 1 / 2, 1 / 2],
95 1 tkerber
                        'M':     [0 / 2, 1 / 2, 1 / 2]},
96 1 tkerber
97 1 tkerber
              'fcc':   {'Gamma': [0,     0,     0    ],
98 1 tkerber
                        'X':     [1 / 2, 0,     1 / 2],
99 1 tkerber
                        'W':     [1 / 2, 1 / 4, 3 / 4],
100 1 tkerber
                        'K':     [3 / 8, 3 / 8, 3 / 4],
101 1 tkerber
                        'U':     [5 / 8, 1 / 4, 5 / 8],
102 1 tkerber
                        'L':     [1 / 2, 1 / 2, 1 / 2]},
103 1 tkerber
104 1 tkerber
              'bcc':   {'Gamma': [0,      0,     0    ],
105 1 tkerber
                        'H':     [1 / 2, -1 / 2, 1 / 2],
106 1 tkerber
                        'N':     [0,      0,     1 / 2],
107 1 tkerber
                        'P':     [1 / 4,  1 / 4, 1 / 4]},
108 1 tkerber
109 1 tkerber
              }
110 1 tkerber
111 1 tkerber
# ChadiCohen k point grids. The k point grids are given in units of the
112 1 tkerber
# reciprocal unit cell. The variables are named after the following
113 1 tkerber
# convention: cc+'<Nkpoints>'+_+'shape'. For example an 18 k point
114 1 tkerber
# sq(3)xsq(3) is named 'cc18_sq3xsq3'.
115 1 tkerber
116 1 tkerber
cc6_1x1 = np.array([1, 1, 0, 1, 0, 0, 0, -1, 0, -1, -1, 0, -1, 0, 0,
117 1 tkerber
    0, 1, 0] ).reshape((6, 3)) / 3.0
118 1 tkerber
119 1 tkerber
cc12_2x3 = np.array([3, 4, 0, 3, 10, 0, 6, 8, 0, 3, -2, 0, 6, -4, 0,
120 1 tkerber
    6, 2, 0, -3, 8, 0, -3, 2, 0, -3, -4, 0, -6, 4, 0, -6, -2, 0, -6,
121 1 tkerber
    -8, 0] ).reshape((12, 3)) / 18.0
122 1 tkerber
123 1 tkerber
cc18_sq3xsq3 = np.array([2, 2, 0, 4, 4, 0, 8, 2, 0, 4, -2, 0, 8, -4,
124 1 tkerber
    0, 10, -2, 0, 10, -8, 0, 8, -10, 0, 2, -10, 0, 4, -8, 0, -2, -8,
125 1 tkerber
    0, 2, -4, 0, -4, -4, 0, -2, -2, 0, -4, 2, 0, -2, 4, 0, -8, 4, 0,
126 1 tkerber
    -4, 8, 0] ).reshape((18, 3)) / 18.0
127 1 tkerber
128 1 tkerber
cc18_1x1 = np.array([2, 4, 0, 2, 10, 0, 4, 8, 0, 8, 4, 0, 8, 10, 0,
129 1 tkerber
    10, 8, 0, 2, -2, 0, 4, -4, 0, 4, 2, 0, -2, 8, 0, -2, 2, 0, -2, -4,
130 1 tkerber
    0, -4, 4, 0, -4, -2, 0, -4, -8, 0, -8, 2, 0, -8, -4, 0, -10, -2,
131 1 tkerber
    0] ).reshape((18, 3)) / 18.0
132 1 tkerber
133 1 tkerber
cc54_sq3xsq3 = np.array([4, -10, 0, 6, -10, 0, 0, -8, 0, 2, -8, 0, 6,
134 1 tkerber
    -8, 0, 8, -8, 0, -4, -6, 0, -2, -6, 0, 2, -6, 0, 4, -6, 0, 8, -6,
135 1 tkerber
    0, 10, -6, 0, -6, -4, 0, -2, -4, 0, 0, -4, 0, 4, -4, 0, 6, -4, 0,
136 1 tkerber
    10, -4, 0, -6, -2, 0, -4, -2, 0, 0, -2, 0, 2, -2, 0, 6, -2, 0, 8,
137 1 tkerber
    -2, 0, -8, 0, 0, -4, 0, 0, -2, 0, 0, 2, 0, 0, 4, 0, 0, 8, 0, 0,
138 1 tkerber
    -8, 2, 0, -6, 2, 0, -2, 2, 0, 0, 2, 0, 4, 2, 0, 6, 2, 0, -10, 4,
139 1 tkerber
    0, -6, 4, 0, -4, 4, 0, 0, 4, 0, 2, 4, 0, 6, 4, 0, -10, 6, 0, -8,
140 1 tkerber
    6, 0, -4, 6, 0, -2, 6, 0, 2, 6, 0, 4, 6, 0, -8, 8, 0, -6, 8, 0,
141 1 tkerber
    -2, 8, 0, 0, 8, 0, -6, 10, 0, -4, 10, 0]).reshape((54, 3)) / 18.0
142 1 tkerber
143 1 tkerber
cc54_1x1 = np.array([2, 2, 0, 4, 4, 0, 8, 8, 0, 6, 8, 0, 4, 6, 0, 6,
144 1 tkerber
    10, 0, 4, 10, 0, 2, 6, 0, 2, 8, 0, 0, 2, 0, 0, 4, 0, 0, 8, 0, -2,
145 1 tkerber
    6, 0, -2, 4, 0, -4, 6, 0, -6, 4, 0, -4, 2, 0, -6, 2, 0, -2, 0, 0,
146 1 tkerber
    -4, 0, 0, -8, 0, 0, -8, -2, 0, -6, -2, 0, -10, -4, 0, -10, -6, 0,
147 1 tkerber
    -6, -4, 0, -8, -6, 0, -2, -2, 0, -4, -4, 0, -8, -8, 0, 4, -2, 0,
148 1 tkerber
    6, -2, 0, 6, -4, 0, 2, 0, 0, 4, 0, 0, 6, 2, 0, 6, 4, 0, 8, 6, 0,
149 1 tkerber
    8, 0, 0, 8, 2, 0, 10, 4, 0, 10, 6, 0, 2, -4, 0, 2, -6, 0, 4, -6,
150 1 tkerber
    0, 0, -2, 0, 0, -4, 0, -2, -6, 0, -4, -6, 0, -6, -8, 0, 0, -8, 0,
151 1 tkerber
    -2, -8, 0, -4, -10, 0, -6, -10, 0] ).reshape((54, 3)) / 18.0
152 1 tkerber
153 1 tkerber
cc162_sq3xsq3 = np.array([-8, 16, 0, -10, 14, 0, -7, 14, 0, -4, 14,
154 1 tkerber
    0, -11, 13, 0, -8, 13, 0, -5, 13, 0, -2, 13, 0, -13, 11, 0, -10,
155 1 tkerber
    11, 0, -7, 11, 0, -4, 11, 0, -1, 11, 0, 2, 11, 0, -14, 10, 0, -11,
156 1 tkerber
    10, 0, -8, 10, 0, -5, 10, 0, -2, 10, 0, 1, 10, 0, 4, 10, 0, -16,
157 1 tkerber
    8, 0, -13, 8, 0, -10, 8, 0, -7, 8, 0, -4, 8, 0, -1, 8, 0, 2, 8, 0,
158 1 tkerber
    5, 8, 0, 8, 8, 0, -14, 7, 0, -11, 7, 0, -8, 7, 0, -5, 7, 0, -2, 7,
159 1 tkerber
    0, 1, 7, 0, 4, 7, 0, 7, 7, 0, 10, 7, 0, -13, 5, 0, -10, 5, 0, -7,
160 1 tkerber
    5, 0, -4, 5, 0, -1, 5, 0, 2, 5, 0, 5, 5, 0, 8, 5, 0, 11, 5, 0,
161 1 tkerber
    -14, 4, 0, -11, 4, 0, -8, 4, 0, -5, 4, 0, -2, 4, 0, 1, 4, 0, 4, 4,
162 1 tkerber
    0, 7, 4, 0, 10, 4, 0, -13, 2, 0, -10, 2, 0, -7, 2, 0, -4, 2, 0,
163 1 tkerber
    -1, 2, 0, 2, 2, 0, 5, 2, 0, 8, 2, 0, 11, 2, 0, -11, 1, 0, -8, 1,
164 1 tkerber
    0, -5, 1, 0, -2, 1, 0, 1, 1, 0, 4, 1, 0, 7, 1, 0, 10, 1, 0, 13, 1,
165 1 tkerber
    0, -10, -1, 0, -7, -1, 0, -4, -1, 0, -1, -1, 0, 2, -1, 0, 5, -1,
166 1 tkerber
    0, 8, -1, 0, 11, -1, 0, 14, -1, 0, -11, -2, 0, -8, -2, 0, -5, -2,
167 1 tkerber
    0, -2, -2, 0, 1, -2, 0, 4, -2, 0, 7, -2, 0, 10, -2, 0, 13, -2, 0,
168 1 tkerber
    -10, -4, 0, -7, -4, 0, -4, -4, 0, -1, -4, 0, 2, -4, 0, 5, -4, 0,
169 1 tkerber
    8, -4, 0, 11, -4, 0, 14, -4, 0, -8, -5, 0, -5, -5, 0, -2, -5, 0,
170 1 tkerber
    1, -5, 0, 4, -5, 0, 7, -5, 0, 10, -5, 0, 13, -5, 0, 16, -5, 0, -7,
171 1 tkerber
    -7, 0, -4, -7, 0, -1, -7, 0, 2, -7, 0, 5, -7, 0, 8, -7, 0, 11, -7,
172 1 tkerber
    0, 14, -7, 0, 17, -7, 0, -8, -8, 0, -5, -8, 0, -2, -8, 0, 1, -8,
173 1 tkerber
    0, 4, -8, 0, 7, -8, 0, 10, -8, 0, 13, -8, 0, 16, -8, 0, -7, -10,
174 1 tkerber
    0, -4, -10, 0, -1, -10, 0, 2, -10, 0, 5, -10, 0, 8, -10, 0, 11,
175 1 tkerber
    -10, 0, 14, -10, 0, 17, -10, 0, -5, -11, 0, -2, -11, 0, 1, -11, 0,
176 1 tkerber
    4, -11, 0, 7, -11, 0, 10, -11, 0, 13, -11, 0, 16, -11, 0, -1, -13,
177 1 tkerber
    0, 2, -13, 0, 5, -13, 0, 8, -13, 0, 11, -13, 0, 14, -13, 0, 1,
178 1 tkerber
    -14, 0, 4, -14, 0, 7, -14, 0, 10, -14, 0, 13, -14, 0, 5, -16, 0,
179 1 tkerber
    8, -16, 0, 11, -16, 0, 7, -17, 0, 10, -17, 0]).reshape((162, 3)) / 27.0
180 1 tkerber
181 1 tkerber
cc162_1x1 = np.array([-8, -16, 0, -10, -14, 0, -7, -14, 0, -4, -14,
182 1 tkerber
    0, -11, -13, 0, -8, -13, 0, -5, -13, 0, -2, -13, 0, -13, -11, 0,
183 1 tkerber
    -10, -11, 0, -7, -11, 0, -4, -11, 0, -1, -11, 0, 2, -11, 0, -14,
184 1 tkerber
    -10, 0, -11, -10, 0, -8, -10, 0, -5, -10, 0, -2, -10, 0, 1, -10,
185 1 tkerber
    0, 4, -10, 0, -16, -8, 0, -13, -8, 0, -10, -8, 0, -7, -8, 0, -4,
186 1 tkerber
    -8, 0, -1, -8, 0, 2, -8, 0, 5, -8, 0, 8, -8, 0, -14, -7, 0, -11,
187 1 tkerber
    -7, 0, -8, -7, 0, -5, -7, 0, -2, -7, 0, 1, -7, 0, 4, -7, 0, 7, -7,
188 1 tkerber
    0, 10, -7, 0, -13, -5, 0, -10, -5, 0, -7, -5, 0, -4, -5, 0, -1,
189 1 tkerber
    -5, 0, 2, -5, 0, 5, -5, 0, 8, -5, 0, 11, -5, 0, -14, -4, 0, -11,
190 1 tkerber
    -4, 0, -8, -4, 0, -5, -4, 0, -2, -4, 0, 1, -4, 0, 4, -4, 0, 7, -4,
191 1 tkerber
    0, 10, -4, 0, -13, -2, 0, -10, -2, 0, -7, -2, 0, -4, -2, 0, -1,
192 1 tkerber
    -2, 0, 2, -2, 0, 5, -2, 0, 8, -2, 0, 11, -2, 0, -11, -1, 0, -8,
193 1 tkerber
    -1, 0, -5, -1, 0, -2, -1, 0, 1, -1, 0, 4, -1, 0, 7, -1, 0, 10, -1,
194 1 tkerber
    0, 13, -1, 0, -10, 1, 0, -7, 1, 0, -4, 1, 0, -1, 1, 0, 2, 1, 0, 5,
195 1 tkerber
    1, 0, 8, 1, 0, 11, 1, 0, 14, 1, 0, -11, 2, 0, -8, 2, 0, -5, 2, 0,
196 1 tkerber
    -2, 2, 0, 1, 2, 0, 4, 2, 0, 7, 2, 0, 10, 2, 0, 13, 2, 0, -10, 4,
197 1 tkerber
    0, -7, 4, 0, -4, 4, 0, -1, 4, 0, 2, 4, 0, 5, 4, 0, 8, 4, 0, 11, 4,
198 1 tkerber
    0, 14, 4, 0, -8, 5, 0, -5, 5, 0, -2, 5, 0, 1, 5, 0, 4, 5, 0, 7, 5,
199 1 tkerber
    0, 10, 5, 0, 13, 5, 0, 16, 5, 0, -7, 7, 0, -4, 7, 0, -1, 7, 0, 2,
200 1 tkerber
    7, 0, 5, 7, 0, 8, 7, 0, 11, 7, 0, 14, 7, 0, 17, 7, 0, -8, 8, 0,
201 1 tkerber
    -5, 8, 0, -2, 8, 0, 1, 8, 0, 4, 8, 0, 7, 8, 0, 10, 8, 0, 13, 8, 0,
202 1 tkerber
    16, 8, 0, -7, 10, 0, -4, 10, 0, -1, 10, 0, 2, 10, 0, 5, 10, 0, 8,
203 1 tkerber
    10, 0, 11, 10, 0, 14, 10, 0, 17, 10, 0, -5, 11, 0, -2, 11, 0, 1,
204 1 tkerber
    11, 0, 4, 11, 0, 7, 11, 0, 10, 11, 0, 13, 11, 0, 16, 11, 0, -1,
205 1 tkerber
    13, 0, 2, 13, 0, 5, 13, 0, 8, 13, 0, 11, 13, 0, 14, 13, 0, 1, 14,
206 1 tkerber
    0, 4, 14, 0, 7, 14, 0, 10, 14, 0, 13, 14, 0, 5, 16, 0, 8, 16, 0,
207 1 tkerber
    11, 16, 0, 7, 17, 0, 10, 17, 0]).reshape((162, 3)) / 27.0