This paper was converted on www.awesomepapers.org from LaTeX by an anonymous user.
Want to know more? Visit the Converter page.

A Python code for calculating the mean-value (Baldereschi’s) point for any crystal structure

Vladan Stevanović [email protected] Colorado School of Mines, Golden, CO 80401,USA
Abstract

A python code (mvp.py) is presented for computing the mean-value point (MVP) in the Brillouin zone first introduced by Baldereschi [1]. The code allows calculations of the MVP for any input crystal structure. Having MVP allows approximating the Brillouin zone integrals of relatively smooth, periodic functions defined in the reciprocal space by the value of the same function at only one, mean-value, 𝐤\mathbf{k}-point. This approximation decreases computational cost at a relatively small decrease in accuracy. The MVP coordinates for the 14 Bravais lattices are evaluated and the underlying theory is discussed.

I Introduction

In his original paper Baldereschi defined the mean-value point in the Brillouin zone as: “the point such that the value which any given periodic function of wave vector assumes at this point is an excellent approximation to the average value of the same function throughout the Brillouin zone” [1]. The conditions that define the mean-value point (MVP) follow from the expansion of any periodic function defined on the 𝐤\mathbf{k}-space into plane waves:

f(𝐤)=𝐑F(𝐑)ei𝐑𝐤,f(\mathbf{k})\,=\,\sum_{\mathbf{R}}\,F(\mathbf{R})\,e^{i\,\mathbf{R}\,\mathbf{k}}, (1)

where ff stands for a periodic function of the wave vector 𝐤\mathbf{k}, the 𝐑\mathbf{R} represent vectors of the direct (Bravais) lattice, which take the role of the wave vectors in the above expansion, and F(𝐑)F(\mathbf{R}) are the Fourier components of the function ff. Generally, the function ff needs to fulfill Dirichlet conditions for the expansion from eq. (1) to converge to ff.

From eq. (1) it is easy to show that the integral of ff over the entire Brilloiun zone equals the F(𝐑=0)F(\mathbf{R}=0) term in the expansion multiplied by the volume of the Brilloiun zone ((2π)3/V(2\pi)^{3}/V). Hence, if there were a point 𝐤=𝐤o\mathbf{k}=\mathbf{k}_{\mathrm{o}} at which the sum of all terms in the expansion above, excluding the 𝐑=0\mathbf{R}=0 term, vanishes, the value f(𝐤o)(2π)3/Vf(\mathbf{k}_{\mathrm{o}})\,(2\pi)^{3}/V would be exactly equal to the integral of f(𝐤)f(\mathbf{k}) over the entire Brillouin zone. The existence of 𝐤o\mathbf{k}_{\mathrm{o}} is guaranteed by the mean-value theorem of the integral calculus, but its coordinates are dependent on the function ff. The mean-value point from Baldereschi’s work is a point defined by the symmetry of the crystal that is independent of ff, at which the value of a function ff is an “excellent” approximation of its integral over the Brillouin zone.

Hence, approximating the integral of f(𝐤)f(\mathbf{k}) over the entire Brillouin zone can be reduced to finding f(𝐤o)f(\mathbf{k}_{\mathrm{o}}), provided that 𝐤o\mathbf{k}_{\mathrm{o}} is known. In the original work of Baldereschi [1], the coordinates of 𝐤o\mathbf{k}_{\mathrm{o}} are evaluated for the three cubic Bravais lattices, face centered cubic (fcc), body centered cubic (bcc), and simple cubic (sc). Subsequently, the mean-value point has been found for some non cubic lattices (see for example [2]). However, to the best of my knowledge, the mean-value point has not been evaluated for all 14 Bravais lattices, and a general, stndalone code for doing so for any input crystal structure is not available. Herein, both the mvp.py code and the resulting MVPs for the 14 Bravais lattice are presented, and various aspects of the procedure are discussed.

II Problem setup and code description

The key to evaluating the MVP for a given crystal structure is the requirement that the sum of all terms in eq. (1) for 𝐑0\mathbf{R}\neq 0 vanishes at some 𝐤=𝐤o\mathbf{k}=\mathbf{k}_{\mathrm{o}}. These conditions provide a system of equations whose solution(s) define 𝐤o\mathbf{k}_{\mathrm{o}}. For the purpose of finding an approximate, function independent 𝐤o\mathbf{k}_{\mathrm{o}} the sum from eq. (1) can be rewritten in a more suitable form using the symmetry of the crystal. As already discussed by Baldereschi in Ref. [1] one can assume, without any loss of generality, that all F(𝐑)F(\mathbf{R}) are equal for 𝐑\mathbf{R} vectors that are connected by the point group symmetry operations, that is, that belong to the same star of 𝐑\mathbf{R}. One can then write:

f(𝐤)=sFsnsei𝐑sns𝐤=sFsWs(𝐤),f(\mathbf{k})\,=\,\sum_{s}F_{s}\sum_{n_{s}}\,e^{i\,\mathbf{R}_{sn_{s}}\,\mathbf{k}}\,=\,\sum_{s}F_{s}\,W_{s}(\mathbf{k}), (2)

where ss goes over all stars of 𝐑\mathbf{R}, nsn_{s} counts all the lattice vectors within a given star, and Ws(𝐤)W_{s}(\mathbf{k}) are the “symmetrized” plane waves belonging to the Γ1\Gamma_{1} (fully symmetric) irreducible representation of the point group.

Hence, the ff-independent conditions that determine 𝐤o\mathbf{k}_{\mathrm{o}} are that all Ws(𝐤o)=0W_{s}(\mathbf{k}_{\mathrm{o}})=0 for any s>0s>0. This is, of course, too much to ask and this system of equations does not have a solution. However, two simplifications can be made. First, one can assume that FsF_{s} decrease sufficiently fast with ss, so that after a relatively small number of terms the non-zero value of WsW_{s} becomes irrelevant. Second, even if the number of zero terms is smaller than three, which is necessary for all three components of 𝐤o\mathbf{k}_{\mathrm{o}} to be uniquely determined, the values can be chosen so to minimize the first nonzero Ws(𝐤)W_{s}(\mathbf{k}). These two assumptions allowed Baldereschi to evaluate the coordinates of the mean-value points for the three cubic systems (sc, bcc, fcc).

The mvp.py code follows the outlined protocol. For any given crystal structure, a set of lattice vectors 𝐑=n1𝐚1+n2𝐚2+n3𝐚3\mathbf{R}=n_{1}\mathbf{a}_{1}+n_{2}\mathbf{a}_{2}+n_{3}\mathbf{a}_{3} is constructed. Here 𝐚1,𝐚2,𝐚3\mathbf{a}_{1},\mathbf{a}_{2},\mathbf{a}_{3} are the unit cell vectors and the integers n1,n2,n3n_{1},n_{2},n_{3} are chosen to cover a range of values so that a sufficiently large number of 𝐑\mathbf{R}s is produced; large enough to enclose the first 4 stars of 𝐑\mathbf{R} (s=0,1,2,3s=0,1,2,3). The number of 𝐑\mathbf{R} vectors is controlled by the R_range input integer variable (- R_range n1,n2,n3\leq n_{1},n_{2},n_{3}\leq R_range), whose default value is 4. All results presented in this paper are obtained with R_range = 4.

Then the point group symmetry operations are found with the help of spglib library [3]. For this purpose the tolerance factors for the spglib are set to symprec = 1e-02 Å (length) and angle_tolerance = 1.0-1.0 (angles). The full set of orthogonal transformations (rotations and mirror planes) including those that are parts of screw axes and glide planes is used for the classification of 𝐑\mathbf{R} vectors into stars. Conveniently, the spglib library provides a separation of the of the space group operations into orthogonal parts (labeled “rotations”) and associated translational parts (fractional translations for the glide planes and screw axes). The mvp.py code takes the entire set of orthogonal parts, and uses that set to classify 𝐑\mathbf{R} into stars.

In the next step, the 𝐑\mathbf{R} vectors are classified into classes of symmetry equivalent members forming the stars. This is done by applying the entire set of orthogonal transformations successively on 𝐑\mathbf{R} vectors and grouping them with those they transform into. The equality of a given O^𝐑\hat{O}\mathbf{R} and some 𝐑\mathbf{R}^{\prime} is determined using the condition |O^𝐑𝐑|=0|\hat{O}\mathbf{R}-\mathbf{R}^{\prime}|=0 with the tolerance factor gen_tol = 1e-5. Also, applying the symmetry operations may map a given 𝐑\mathbf{R} to itself. All these duplicate occurrences are removed when constructing the stars. In the next step the functions Wi(𝐤)W_{i}(\mathbf{k}) are constructed for i=1,2,3,4i=1,2,3,4.

The roots of Wi(𝐤)W_{i}(\mathbf{k}) functions are found in the following way. First, a 𝐤\mathbf{k}-point grid is constructed spanning the one unit cell of the reciprocal lattice. The number of 𝐤\mathbf{k}-points is controlled by the nkpts input parameter (default value 2e+7). When constructing the 𝐤\mathbf{k}-point grid the unit vectors of the reciprocal lattice (𝐛1,𝐛2,𝐛3)(\mathbf{b}_{1},\mathbf{b}_{2},\mathbf{b}_{3}) are divided into (n1,n2,n3)(n_{1},n_{2},n_{3}) sub-divisions so that the grid spacing is uniform. The grid spacing is computed as step=[𝐛1(𝐛2×𝐛3)/nkpts]1/3\texttt{step}=[\mathbf{b}_{1}\cdot(\mathbf{b}_{2}\times\mathbf{b}_{3})/\texttt{nkpts}]^{1/3} and ni=|𝐛i|/stepn_{i}=|\mathbf{b}_{i}|/\texttt{step}. Then, the values of W1(𝐤)W_{1}(\mathbf{k}) are evaluated over the entire grid and its zeros are used as starting points near which the simultaneous roots of the W1(𝐤)W_{1}(\mathbf{k}), W2(𝐤)W_{2}(\mathbf{k}) and W3(𝐤)W_{3}(\mathbf{k}) will be evaluated. The situation in which no zeros of W1(𝐤)W_{1}(\mathbf{k}) are found for any grid point is easily remedied by increasing the nkpts.

In the mvp.py code the 𝐤\mathbf{k}-points at which W1(𝐤)W_{1}(\mathbf{k})\leq\,1e-12 (input parameter zero) are extracted and the function fsolve from scipy.optimize package is used to find roots of a vector function 𝐟𝐮𝐧𝐜1=(W1(𝐤),W2(𝐤),W3(𝐤))\mathbf{func}_{1}=(W_{1}(\mathbf{k}),W_{2}(\mathbf{k}),W_{3}(\mathbf{k})) near every one of those 𝐤\mathbf{k}-points. If the roots of 𝐟𝐮𝐧𝐜1\mathbf{func}_{1} exist then the roots that minimize W4(𝐤)W_{4}(\mathbf{k}) are extracted and those that are possibly outside the reciprocal unit cell are mapped back inside. The list of these 𝐤\mathbf{k}-points then represents the list of mean-value points (symmetry equivalent). User can then extract (on their own) those that belong to the first Brillouin zone, or choose to output only the 𝐤\mathbf{k}-point from this set with the lowest norm (input parameter only_lowest_norm). In case 𝐟𝐮𝐧𝐜1\mathbf{func}_{1} has no roots, the roots of 𝐟𝐮𝐧𝐜2=(W1(𝐤),W2(𝐤))\mathbf{func}_{2}=(W_{1}(\mathbf{k}),W_{2}(\mathbf{k})) are then solved for and those that minimize W3(𝐤)W_{3}(\mathbf{k}) are extracted and mapped back into the reciprocal unit cell. Lastly, our tests indicate that relatively large default value of nkpts is unfortunately required to converge the MVP value. Using different solvers might help converge the MVP faster, but that will be explored in the future.

The mvp.py code is available on github [4] as part of the toolbox package [5] for pylada [6], a collection of python tools for structure prediction (random structure generation), surface cutting, various structure manipulations, etc. All dependencies include: python, numpy, scipy, spglib, pylada, and toolbox. The mvp.py is constructed around the pylada structure object but is easily adaptable to use other structure objects from other codes (e.g ASE [7], aflow [8], pymatgen [9],…), which will remove the pylada dependency.

Finally, the choice to write the mvp.py in Cartesian rather then more elegant crystal coordinates is mainly driven by the differences in how the integers are treated between python2 and python3. In this way the code works with both versions. The price to pay is the introduction of various tolerance factors whose default values are set to best reflect extensive testing. That said, the convergence of the results with respect to various tolerance factors needs to be tested before use.

III Results

Table LABEL:tab:results below lists the MVP coordinates for the 14 Bravais lattices. For clarity, the specific unit cells that are used are displayed together with the choice of unit vectors and their coordinates. The corresponding first Brillouin zones are also displayed as well as the location of the MVP points. In the first three rows the original results of Baldereschi are reproduced. The coordinates of the MVPs for the simple cubic, face centered and body centered cubic lattices correspond well to those reported in Ref. [1]. The rest are original results.

Importantly, coordinates of the MVPs in general depend on the choice of the lattice parameters. Table  LABEL:tab:results only lists MVP coordinates for the specific choices provided in the table. For other lattice parameters users should compute the MVPs on their own.

Table 1: The mean-value points (MVPs) for the 14 Bravais lattices are presented. Lattice name, the corresponding unit cell with the lattice vectors denoted, the unit cell matrix in the units of lattice constant aa, the Brillouin zone showing the location of the MVP, the cartesian and crystal coordinates of the MVP, and finally, the values of the symmetrized waves WiW_{i} (i=1,2,3,4i=1,2,3,4) from eq. (2) at the MVP are shown. Note that this table lists results for specific choices of the lattice parameters and that MVP coordinates, both Cartesian and crystal coordinates, may be different for other values of the lattice parameters.
lattice vectors [aa] MVP coordinaties
Lattice Unit cell (a1xa1ya1za2xa2ya2za3xa3ya3z)\begin{pmatrix}a_{1x}&a_{1y}&a_{1z}\\ a_{2x}&a_{2y}&a_{2z}\\ a_{3x}&a_{3y}&a_{3z}\end{pmatrix} Brillouin zone with MVP (kx,ky,kz)(k_{x},k_{y},k_{z})\,[2π/a2\pi/a] (k1,k2,k3)(k_{1},k_{2},k_{3}) [crystal] (W1W2W3W4)\begin{pmatrix}W_{1}\\ W_{2}\\ W_{3}\\ W_{4}\end{pmatrix}
Simple cubic [Uncaptioned image] (1.0.0.0.1.0.0.0.1.)\begin{pmatrix}1.&0.&0.\\ 0.&1.&0.\\ 0.&0.&1.\end{pmatrix} [Uncaptioned image] (0.2500,0.2500,0.2500)(0.2500,0.2500,0.2500) (0.2500,0.2500,0.2500)(0.2500,0.2500,0.2500) (0.00.00.06.0)\begin{pmatrix}0.0\\ 0.0\\ 0.0\\ 6.0\end{pmatrix}
Face centerred cubic [Uncaptioned image] (0.0.50.50.50.0.50.50.50.)\begin{pmatrix}0.&0.5&0.5\\ 0.5&0.&0.5\\ 0.5&0.5&0.\end{pmatrix} [Uncaptioned image] (0.6223,0.2953,0.0000)(0.6223,0.2953,0.0000) (0.1477,0.3112,0.4588)(0.1477,0.3112,0.4588) (0.00.04.43.2)\begin{pmatrix}0.0\\ 0.0\\ 4.4\\ 3.2\end{pmatrix}
Body centerred cubic [Uncaptioned image] (0.50.50.50.50.50.50.50.50.5)\begin{pmatrix}-0.5&0.5&0.5\\ 0.5&-0.5&0.5\\ 0.5&0.5&-0.5\end{pmatrix} [Uncaptioned image] (0.1667,0.1667,0.5000)(0.1667,0.1667,0.5000) (0.2500,0.2500,0.9167)(0.2500,0.2500,0.9167) (0.00.03.00.0)\begin{pmatrix}0.0\\ 0.0\\ 3.0\\ 0.0\end{pmatrix}
Hexagonal [Uncaptioned image] (1.0.0.0.50.8660.0.0.1.6333)\begin{pmatrix}1.&0.&0.\\ -0.5&0.866&0.\\ 0.&0.&1.6333\end{pmatrix} [Uncaptioned image] (0.3807,0.0000,0.1531)(0.3807,0.0000,0.1531) (0.3807,0.1901,0.2500)(0.3807,-0.1901,0.2500) (0.00.00.01.6)\begin{pmatrix}0.0\\ 0.0\\ 0.0\\ 1.6\end{pmatrix}
Rhombohedral [Uncaptioned image] (0.55470.32020.76790.55470.32020.76800.0.64050.7679)\begin{pmatrix}0.5547&0.3202&0.7679\\ -0.5547&0.3202&0.7680\\ 0.&-0.6405&0.7679\end{pmatrix} [Uncaptioned image] (0.0000,0.0000,0.3255)(0.0000,0.0000,0.3255) (0.2500,0.2500,0.2500)(0.2500,0.2500,0.2500) (0.00.00.00.0)\begin{pmatrix}0.0\\ 0.0\\ 0.0\\ 0.0\end{pmatrix}
Tetragonal [Uncaptioned image] (1.0.0.0.1.0.0.01.6)\begin{pmatrix}1.&0.&0.\\ 0.&1.&0.\\ 0.&0&1.6\end{pmatrix} [Uncaptioned image] (0.2500,0.2500,0.1562)(0.2500,0.2500,0.1562) (0.2500,0.2500,0.2500)(0.2500,0.2500,0.2500) (0.00.00.00.0)\begin{pmatrix}0.0\\ 0.0\\ 0.0\\ 0.0\end{pmatrix}
Tetragonal body centered [Uncaptioned image] (0.50.50.80.50.50.80.50.50.8)\begin{pmatrix}-0.5&0.5&0.8\\ 0.5&-0.5&0.8\\ 0.5&0.5&-0.8\end{pmatrix} [Uncaptioned image] (0.2500,0.2500,0.3125)(0.2500,0.2500,0.3125) (0.2500,0.2500,0.0000)(0.2500,0.2500,0.0000) (0.00.00.02.0)\begin{pmatrix}0.0\\ 0.0\\ 0.0\\ 2.0\end{pmatrix}
Orthorhombic [Uncaptioned image] (1.0.0.0.0.850.0.0.1.6)\begin{pmatrix}1.&0.&0.\\ 0.&0.85&0.\\ 0.&0.&1.6\end{pmatrix} [Uncaptioned image] (0.2500,0.2941,0.0000)(0.2500,0.2941,0.0000) (0.2500,0.2500,0.0000)(0.2500,0.2500,0.0000) (0.00.00.00.0)\begin{pmatrix}0.0\\ 0.0\\ 0.0\\ 0.0\end{pmatrix}
Orthorhombic base centered [Uncaptioned image] (0.4250.50.0.4250.50.0.0.1.6)\begin{pmatrix}0.425&-0.5&0.\\ 0.425&0.5&0.\\ 0.&0.&1.6\end{pmatrix} [Uncaptioned image] (0.2941,0.5000,0.0000)(0.2941,0.5000,0.0000) (0.1250,0.3750,0.0000)(-0.1250,0.3750,0.0000) (0.00.02.00.0)\begin{pmatrix}0.0\\ 0.0\\ 2.0\\ 0.0\end{pmatrix}
Orthorhombic body centered [Uncaptioned image] (0.4250.50.80.4250.50.80.4250.50.8)\begin{pmatrix}-0.425&0.5&0.8\\ 0.425&-0.5&0.8\\ 0.425&0.5&-0.8\end{pmatrix} [Uncaptioned image] (0.2941,0.2500,0.3125)(0.2941,0.2500,0.3125) (0.2500,0.2500,0.0000)(0.2500,0.2500,0.0000) (0.00.00.00.0)\begin{pmatrix}0.0\\ 0.0\\ 0.0\\ 0.0\end{pmatrix}
Orthorhombic face centered [Uncaptioned image] (0.0.50.80.4250.00.80.4250.50.0)\begin{pmatrix}0.&0.5&0.8\\ 0.425&0.0&0.8\\ 0.425&0.5&0.0\end{pmatrix} [Uncaptioned image] (0.2941,0.5000,0.3125)(0.2941,0.5000,0.3125) (0.5000,0.3750,0.3750)(0.5000,0.3750,0.3750) (0.00.00.00.0)\begin{pmatrix}0.0\\ 0.0\\ 0.0\\ 0.0\end{pmatrix}
Monoclinic [Uncaptioned image] (1.00.00.00.00.850.00.61540.01.4769)\begin{pmatrix}1.0&0.0&0.0\\ 0.0&0.85&0.0\\ 0.6154&0.0&1.4769\end{pmatrix} [Uncaptioned image] (0.2500,0.2941,0.0000)(0.2500,0.2941,0.0000) (0.2500,0.2500,0.1540)(0.2500,0.2500,0.1540) (0.00.00.00.0)\begin{pmatrix}0.0\\ 0.0\\ 0.0\\ 0.0\end{pmatrix}
Monoclinic base centered [Uncaptioned image] (0.50.4250.00.50.4250.00.38460.01.4769)\begin{pmatrix}0.5&-0.425&0.0\\ 0.5&0.425&0.0\\ -0.3846&0.0&1.4769\end{pmatrix} [Uncaptioned image] (0.5000,0.2941,0.0000)(0.5000,0.2941,0.0000) (0.1250,0.3750,0.1921)(0.1250,0.3750,-0.1921) (0.00.02.00.0)\begin{pmatrix}0.0\\ 0.0\\ 2.0\\ 0.0\end{pmatrix}
Triclinic [Uncaptioned image] (1.0.00.00.46820.70940.01.08420.02181.1764)\begin{pmatrix}1.&0.0&0.0\\ 0.4682&0.7094&0.0\\ 1.0842&0.0218&1.1764\end{pmatrix} [Uncaptioned image] (0.0000,0.3524,0.0000)(0.0000,0.3524,0.0000) (0.0000,0.2500,0.0074)(0.0000,0.2500,0.0074) (0.00.02.02.0)\begin{pmatrix}0.0\\ 0.0\\ 2.0\\ 2.0\end{pmatrix}

IV Discussion

Here I would like to make several remarks, which may be relevant when using the code and/or understanding its structure.

It is first important to note that the systems of equations 𝐟𝐮𝐧𝐜1=(W1(𝐤),W2(𝐤),W3(𝐤))=(0,0,0)\mathbf{func}_{1}=(W_{1}(\mathbf{k}),W_{2}(\mathbf{k}),W_{3}(\mathbf{k}))=(0,0,0) or 𝐟𝐮𝐧𝐜2=(W1(𝐤),W2(𝐤))=(0,0)\mathbf{func}_{2}=(W_{1}(\mathbf{k}),W_{2}(\mathbf{k}))=(0,0) are non-linear in cos(αki)cos(\alpha k_{i}) with α\alpha being an integer multiple of 2π2\pi. As there is no general approach of solving such systems of equations (to my knowledge at least) the choice was to use scipy.optimize.fsolve function that finds roots near a certain starting point. It turns out that a relatively large number of those starting points are needed to cover most, if not all, zeros of W1(𝐤)W_{1}(\mathbf{k}), which then allows for the roots of 𝐟𝐮𝐧𝐜1\mathbf{func}_{1} or 𝐟𝐮𝐧𝐜2\mathbf{func}_{2} to be found. Converged values of MVPs in Table LABEL:tab:results are obtained using nkpts between 1e+6 (simple cubic) and 3e+7 (hexagonal lattice). While this might look excessive, it is necessary for the scipy.optimize.fsolve to find correct solutions. The typical time needed for the mvp.py to solve the equations (on a personal computer) is measured in minutes.

Second, by default mvp.py code uses all orthogonal parts (reflections, rotations) belonging to the entire space group rather then the point group operations only. This is done so to account the fact that the entire set of orthogonal transformations may be larger than the point group alone, and that the a group of all pure translations is invariant under the operations of all orthogonal transformations including those belongin to screw axes and glide planes. Hence, when classifying 𝐑\mathbf{R} vectors into stars all orthogonal transformations need to be used. While this is only relevant when dealing with real crystals (not Bravais lattices), the mvp.py code is written in this way to provide access to all symmetry operations in Cartesian coordinates, which may be useful for other purposes.

Next, the MVPs are not invariant under the supercell transformations in spite of supercells being just different representations of the same crystal/lattice. That is easy to prove just by considering the three cubic lattices. Both fcc and bcc can be represented as simple cubic using their conventional unit cells. However, the (1/4,1/4,1/4)(1/4,1/4,1/4) 𝐤\mathbf{k}-point in the crystal coordinates, which is the MPV for simple cubic lattice is not an MVP for neither fcc nor bcc. This is because the first star of 𝐑\mathbf{R} for both fcc and bcc (set of 12 and 8 lattice vectors, respectively) is not accounted for in the simple cubic lattice and consequently W10W_{1}\neq 0 for both of them at 𝐤=(1/4,1/4,1/4)\mathbf{k}=(1/4,1/4,1/4). The second star of 𝐑\mathbf{R} for fcc and bcc is the same as the first star for simple cubic, which then implies W2=0W_{2}=0 at 𝐤=(1/4,1/4,1/4)\mathbf{k}=(1/4,1/4,1/4) and so on.

Lastly, it is important to keep in mind that the MVP coordinates do in general depend on the choice of the lattice parameters. This is true for Cartesian as well as the crystal coordinates as already discussed in Ref. [2] for tetragonal and rhombohedral lattices. It is precisely this dependence that motivated writing the mvp.py code rather then tabulating all cases for all 14 Bravais lattices.

V Conclusions

In conclusion, the mvp.py code is presented for computing the mean-value (Baldereschi’s) point in the Brillouin zone for any crystal structure. The underlying theory is also presented and discussed as are various aspects of the specific implementation in the mvp.py code. The code itself relies on the pylada python package [6] a high-throughput computational physics framework, but is easily adaptable to other similar packages.

Acknowledgements.
I would like to acknowledge discussions with Prof. A. Baldereschi. They were instrumental for many things I have done, this work included. The work is supported by the US National Science Foundation, Grant No. DMR-1945010.

References

  • Baldereschi [1973] A. Baldereschi, Mean-Value Point in the Brillouin Zone, Physical Review B 7, 5212 (1973).
  • Bashenov et al. [1977] V. K. Bashenov, M. Bardashova, and A. M. Mutal, Baldereschi points for some noncubic lattices, physica status solidi (b) 80, K89 (1977).
  • Togo et al. [2018] A. Togo, K. Shinohara, and I. Tanaka, Spglib: a software library for crystal symmetry search, arXiv:1808.01590 [cond-mat.mtrl-sci]  (2018).
  • [4] mvp.pygithub.com/vstevano/toolbox/blob/main/mvp.py.
  • [5] toolbox package, github.com/vstevano/toolbox.
  • [6] pylada package, github.com/pylada.
  • Larsen et al. [2017] A. H. Larsen, J. J. Mortensen, J. Blomqvist, I. E. Castelli, R. Christensen, M. Dułak, J. Friis, M. N. Groves, B. Hammer, C. Hargus, E. D. Hermes, P. C. Jennings, P. B. Jensen, J. Kermode, J. R. Kitchin, E. L. Kolsbjerg, J. Kubal, K. Kaasbjerg, S. Lysgaard, J. B. Maronsson, T. Maxson, T. Olsen, L. Pastewka, A. Peterson, C. Rostgaard, J. Schiøtz, O. Schütt, M. Strange, K. S. Thygesen, T. Vegge, L. Vilhelmsen, M. Walter, Z. Zeng, and K. W. Jacobsen, The atomic simulation environment—a python library for working with atoms, Journal of Physics: Condensed Matter 29, 273002 (2017).
  • Oses et al. [2023] C. Oses, M. Esters, D. Hicks, S. Divilov, H. Eckert, R. Friedrich, M. J. Mehl, A. Smolyanyuk, X. Campilongo, A. van de Walle, J. Schroers, A. G. Kusne, I. Takeuchi, E. Zurek, M. Buongiorno Nardelli, M. Fornari, Y. Lederer, O. Levy, C. Toher, and S. Curtarolo, aflow++: a C++ framework for autonomous materials design, Comp. Mat. Sci. 217, 111889 (2023).
  • Ong et al. [2013] S. P. Ong, W. D. Richards, A. Jain, G. Hautier, M. Kocher, S. Cholia, D. Gunter, V. L. Chevrier, K. A. Persson, and G. Ceder, Python materials genomics (pymatgen): A robust, open-source python library for materials analysis, Computational Materials Science 68, 314 (2013).