Name

Bravais lattices — The 14 Bravais lattices used to describe crystal structures.

Synopsis

Namespace: NanoLanguage
Object SimpleCubic(a)
Object BodyCenteredCubic(a)
Object FaceCenteredCubic(a)
Object Rhombohedral(
a,
alpha
)
Object Hexagonal(
a,
c
)
Object SimpleTetragonal(
a,
c
)
Object BodyCenteredTetragonal(
a,
c
)
Object SimpleOrthorhombic(
a,
b,
c
)
Object BodyCenteredOrthorhombic(
a,
b,
c
)
Object FaceCenteredOrthorhombic(
a,
b,
c
)
Object BaseCenteredOrthorhombic(
a,
b,
c
)
Object SimpleMonoclinic(
a,
b,
c,
beta
)
Object BaseCenteredMonoclinic(
a,
b,
c,
beta
)
Object Triclinic(
a,
b,
c,
alpha,
beta,
gamma
)
Object UnitCell(
vector_a,
vector_b,
vector_c
)

Description

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).

Object Methods

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] 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 a, b, c, \alpha, \beta, \gamma, which in all cases refer to the corresponding conventional cell, not the primitive one. That is, the parameter a 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, a = b =
      c,\mathrm{\alpha} = \mathrm{\beta} = \mathrm{\gamma}. In those cases, the constructors only accept the free parameters as arguments (a, in the cubic case). For a complete list of the free parameters of each lattice, see the table below.

Table 27: The seven crystal systems; the dots indicate the free lattice parameters.

Bravais lattice a b c alpha beta gamma
Cubic          
Hexagonal        
Rhombohedral        
Tetragonal        
Orthorhombic      
Monoclinic    
Triclinic

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.

Usage Examples

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 

Notes

Use BulkConfiguration to insert atoms in the lattice.