I am trying to calculate the surface energies of Ni fcc (111) and (311) surfaces, therefore I need to calculate the surface areas. I use periodic slabs to model these surfaces. For a flat fcc (111) surface as shown below
the surface area is simply given by the norm of the cross product of the two lattice vectors of the unit cell. In Python code:
from ase.build import fcc111
import numpy as np
slab = fcc111('Ni', (4, 4, 4), vacuum=5.)
A_surf = np.linalg.norm(np.cross(slab.cell[0], slab.cell[1]))
However, for the stepped fcc (311) surface, the slab looks like below (top and side views):
How should I calculate the surface area for a stepped surface (assuming I already know the Cartesian coordinates of all atoms and the lattice vectors of the unit cell)?