3.2. Packing Factor#
Each crystal structure has a property called packing factor. The packing factor, or 3D denisty, is the ratio of atom volume in a unit cell to the volume of the unit cell.
Crystal structures with high packing factors are tightly packed. Crystal structures with low packing factors are loosely packed.
The equation for packing factor is below:
Given the volume of one atom, we can set the volume of all of the atoms in a unit cell as the product of the volume of 1 atom times the number of atoms per unit cell.
For cubic unit cells, the volume of the unit cell is the width (also length and height) of the unit cell cubed. The width of a cubic unit cell is donoted as \(a_0\)
We can cacluate the volume of 1 atom using the radius of one atom. Assuming that an atom is a sphere, the volume of the atom in terms of the radius is the volume of a sphere in terms of the the radius.
Plugging the volume of the unit cell and the volume of an atom into our equation for packing factor:
Each crystal structure has a different number of atoms per unit cell and a different relationship between \(r\) and \(a_0\).
For example, for a simple cubic crystal structure:
For the simple cubic crystal structure, we can plug these values for \(n_{atoms}\) and \(a_0\) into our equation for packing factor:
This can be simplified to:
One more simplification step:
We can compute this packing factor using programming. Note the value of pi
is imported from Python’s math
module.
from math import pi
PF = pi/6
print(f"The packing factor of simple cubic is PF = {round(PF,2)}")
The packing factor of simple cubic is PF = 0.52
We can simplify the algebra and compute the packing factor of the face centered crystal structure (FCC) given the following properties for FCC:
from sympy import symbols, sqrt, pi
a0, r, V_atoms, V_1atom, V_unitcell, n_atoms = symbols('a0, r, V_atoms, V_1atom, V_unitcell, n_atoms')
PF_expression = V_atoms / V_unitcell
print(PF_expression)
V_atoms/V_unitcell
Next, we can start subsituting. SymPy’s .subs()
method allows us to substitute in an expression or variable for a variable in an exhisting expression. In this case, we will substitute in the volume of atoms for the product of the number of atoms times the volume of 1 atom.
PF_expression2 = PF_expression.subs(V_atoms, n_atoms * V_1atom)
print(PF_expression2)
V_1atom*n_atoms/V_unitcell
Next we can substitute in the formulas for the volume of a unit cell and the volume of one atom. Here we chain multiple .subs()
methods together.
PF_expression3 = PF_expression2.subs(V_unitcell, a0**3).subs(V_1atom, (4/3)*pi*r**3)
print(PF_expression3)
1.33333333333333*pi*n_atoms*r**3/a0**3
For FCC, there are 4 atoms per unit cell and \(a_0\) is equal to \(4r/\sqrt{2}\)
from sympy import sqrt, pi
PF_expression4 = PF_expression3.subs(a0, 4*r/sqrt(2)).subs(n_atoms,4)
print(PF_expression4)
0.166666666666667*sqrt(2)*pi
We can evaluate this expression as a floating point number using SymPy’s .evalf()
method.
PF_FCC = PF_expression4.evalf()
print(f"The packing factor of FCC is: {round(PF_FCC,2)}")
The packing factor of FCC is: 0.74
For cubic unit cells, like simple cubic, face-centered cubic, and body-centered cubic. The calculation of packing factor is the same except for the parameters \(n_{atoms}\) and \(a_04 in terms of \)r$.
Therefore we can use our PF_expression3
and just substitute different values in for \(a_0\) and \(r\) than we did for FCC.
For a the body-centered cubic crystal structure (BCC) \(a_0 = 4r/\sqrt{3}\) and \(n_{atoms} = 2\).
PF_expression5 = PF_expression3.subs(a0, 4*r/sqrt(3)).subs(n_atoms,2)
print(PF_expression5)
0.125*sqrt(3)*pi
PF_BCC = PF_expression5.evalf()
print(f"The packing factor of BCC is: {round(PF_BCC,2)}")
The packing factor of BCC is: 0.68