NanoLanguage has built-in support for all 14 three-dimensional Bravais lattices. In fact, in order to perform proper calculations for bulk systems, it is necessary to use these classes, instead of defining your own lattice vectors. This will (at least in the future) allow ATK to take advantage of the symmetries of the lattice, and the user does not have to worry about the exact definition of the lattice vectors, symmetry points in the Brillouin zone, and so on.
None of the parameters have any default value, and they must all be specified with units (see the examples below).
All Bravais lattice classes share the following member functions:
Array primitiveVectors():
Returns a NumPy array containing the vectors of the primitive unit cell. The
dimensions of this array will be
(nvectors,ndimensions).
List
conventionalVectors(): Returns a list containing the
vectors of the conventional unit cell.
Float getA(): Returns the
lattice constant a.
Float getB(): Returns the
lattice constant b.
Float getC(): Returns the
lattice constant c.
Float getAlpha(): Returns
the angle alpha.
Float getBeta(): Returns
the angle beta.
Float getGamma(): Returns
the angle gamma.
Thus, Bravais lattices are classes, and to each one belongs a constructor, as listed below. The constructors take at most 6 arguments, corresponding to the lattice parameters:
For the non-primitive lattices, such as face-centered cubic, the lattice constants correspond to the conventional cell, not the primitive one. The cell created by ATK and used in the calculations is, however, the primitive one.
Finally, all Bravais lattices except triclinic have a higher degree of
symmetry. This means, that the lattice parameters are constrained to certain values
or relationships. For example, in a simple cubic lattice,
. In those cases, the
constructors only accept the free parameters as arguments (
, in the
cubic case). For a complete list of the free parameters of each lattice, see the
table below.
Specify a face-centered cubic lattice with lattice constants a = 5.1 Å:
from ATK.KohnSham import * lattice = FaceCenteredCubic(5.1*Ang)
Specify a base-centered monoclinic lattice with lattice constants a = 4.07 Å, b = 8.02 Å, c = 2.04 Å, and angle beta = 56°:
lattice = BaseCenteredMonoclinic( a = 4.07*Angstrom, b = 8.02*Angstrom, c = 2.04*Angstrom, beta = 56*degrees )
Print a in Bohr, and the c/a ratio, of a
hexagonal lattice:
lattice = Hexagonal(...) print "a = %g Bohr" % (lattice.getA().inUnitsOf(Bohr)) print "c/a = %g" % (lattice.getA()/lattice.getC())
Function that prints the lattice vectors, in Angstrom, of a given lattice:
def printLatticeVectors(lattice): for vector in lattice.primitiveVectors(): for i in range(3): print vector[i].inUnitsOf(Ang),TAB, print
Print the primitive vectors of a Bravais lattice and the x-coordinate of the first and third primitive vector:
from ATK.KohnSham import * lattice = FaceCenteredCubic(2.5*Angstrom) vectors = lattice.primitiveVectors() for vector in vectors: print vector print vectors[0][0] #x-coordinate of the first vector print vectors[2][0] #x-coordinate of the third vector
[0.0 Ang 1.25 Ang 1.25 Ang]
[1.25 Ang 0.0 Ang 1.25 Ang]
[1.25 Ang 1.25 Ang 0.0 Ang]
0.0 Ang
1.25 Ang