ATK has built-in support for all 14 three-dimensional Bravais lattices,
plus an additional possibility to specify the unit cell directly. To
allow ATK to take advantage of the symmetries of the lattice, and define the
symmetry points in the Brillouin zone for instance for band structure
calculations, the lattice must be constructed using the correct Bravais lattice
class, cf. the above list. If the
lattice is defined using the UnitCell class,
it is internally categorized as triclinic.
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.
List
conventionalVectors(): Returns a list containing the
vectors of the conventional unit cell.
Dict symmetryPoints(): Returns a dict with the symmetry points of the lattice.
Except for UnitCell, the Bravais lattices additionally have
methods for querying the lattice parameters:
Float a(): Returns the
lattice constant a.
Float b(): Returns the
lattice constant b.
Float c(): Returns the
lattice constant c.
Float alpha(): Returns
the angle alpha.
Float beta(): Returns
the angle beta.
Float gamma(): Returns
the angle gamma.
|
|
Note |
|---|---|
|
Only those free parameters which are accepted as input (see the table below) are available as query functions. |
The Bravais lattices are classes, and their constructors take at most 6 arguments,
corresponding to the lattice parameters
,
which in all cases refer to the corresponding conventional cell,
not the primitive one. That is, the parameter
for the face-centered cubic
cell is not the length of the first primitive lattice vector, but the side length of
the corresponding conventional cubic cell.
The cell created by ATK and used in the calculations is, however, the primitive cell.
All seven crystal systems except the 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.
The UnitCell class behaves differently. Instead of
providing the lattice parameters, you instead directly specify
the three lattice vectors, each one provided as an array with three arguments,
as shown in the example below.
For this reason, this class also does not have query methods for the
lattice parameters.
Specify a face-centered cubic lattice with lattice constants a = 5.1 Å:
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
)
Specify a lattice by providing the unit cell vectors:
lattice = UnitCell(
[19.3, 1.0, 0.0]*Angstrom,
[-2.0, 15.0, 1.0]*Angstrom,
[ 0.2, 0.4, 4.9]*Angstrom
)
Print a in Bohr, and the c/a ratio, of a
hexagonal lattice:
lattice = Hexagonal(...) print "a = %g Bohr" % (lattice.a().inUnitsOf(Bohr)) print "c/a = %g" % (lattice.a()/lattice.c())
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),' ',
print
Print the primitive vectors of a Bravais lattice and the x-coordinate of the first and third primitive vector:
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
giving rise to the output
[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