Single crystalline particle

class wulffpack.SingleCrystal(surface_energies, primitive_structure=None, natoms=1000, symprec=1e-05, tol=1e-05, symmetry_operations=None)[source]

A SingleCrystal object is a Wulff construction of a single crystalline particle, i.e., a standard Wulff construction.

  • surface_energies (dict) – A dictionary with surface energies, where keys are Miller indices and values surface energies (per area) in a unit of choice, such as J/m^2.

  • primitive_structure (Optional[Atoms]) – primitive cell to implicitly define the point group as well as the atomic structure used if an atomic structure is requested. By default, an Au FCC structure is used.

  • natoms (int) – Together with primitive_structure, this parameter defines the volume of the particle. If an atomic structure is requested, the number of atoms will as closely as possible match this value.

  • symprec (float) – Numerical tolerance for symmetry analysis, forwarded to spglib.

  • tol (float) – Numerical tolerance parameter.

  • symmetry_operations (Optional[List[ndarray]]) – This parameter allows one to pass an explicit list of allowed symmetry operations. By default (None) the allowed symmetry operations are obtained from primitive_structure.


The following example illustrates some possible uses of a SingleCrystal object:

>>> from wulffpack import SingleCrystal
>>> from import bulk
>>> from import write
>>> surface_energies = {(1, 1, 0): 1.0, (1, 0, 0): 1.08}
>>> prim = bulk('W', a=3.16, crystalstructure='bcc')
>>> particle = SingleCrystal(surface_energies, prim)
>>> particle.view()
>>> write('', particle.atoms) # Writes atomic structure to file
property area: float

Returns total area of the surface of the particle (not including twin boundaries).

property atoms: Atoms

Returns an ASE Atoms object

property average_surface_energy: float

Average surface energy for the Wulff construction, i.e., a weighted average over all the facets, where the weights are the area fraction of each facet.

property edge_length: float

Returns total edge length of the particle.

property facet_fractions: Dict[tuple, float]

Returns a dict specifying fraction of each form (not including twin boundaries).

property forms: List[Form]

List of inequivalent forms for the particle

get_continuous_color_scheme(base_colors=None, normalize=False)

Returns a dictionary with RGB colors for each form. The colors smoothly interpolate between three base colors, corresponding to (1, 1, 1), (1, 1, 0) and (1, 0, 0). Note that this is sensible primarily for cubic systems.

  • base_colors (Optional[dict]) – User chosen colors for one or several of (1, 1, 1), (1, 1, 0) and (1, 0, 0). To enforce, say, green (1, 1, 1), use base_colors={(1, 1, 1): 'g'}

  • normalize (bool) – If True, the norm of the RGB vectors will be 1. Note that this may affect the base_colors too.

Return type:



Returns an ASE Atoms object where the center has been shifted from with respect to the standardized cells. This can, for example, allow creation of atomistic representations in which the center of the nanoparticle does not coincide with an atom. Thereby the space of possible atomistic representations increases and may make the returned number of atoms closer to the requested number.


center_shift (Optional[Tuple[float, float, float]]) – Shift of center in Cartesian coordinates.

Return type:


make_plot(ax, alpha=0.85, linewidth=0.3, colors=None)

Plot a particle in an axis object. This function can be used to make customized plots of particles.

  • ax (matplotlib Axes3DSubplot) – An axis object with 3d projection

  • alpha (float) – Opacity of the faces

  • linewidth (float) – Thickness of lines between faces

  • colors (Optional[dict]) – Allows custom colors for facets of all or a subset of forms, example {(1, 1, 1): '#FF0000'}


In the following example, three different particles are plotted in the same figure:

>>> from wulffpack import SingleCrystal, Decahedron, Icosahedron
>>> import matplotlib.pyplot as plt
>>> from mpl_toolkits.mplot3d import Axes3D
>>> surface_energies = {(1, 1, 1): 1.0,
...                     (1, 0, 0): 1.1,
...                     (1, 1, 0): 1.15,
...                     (3, 2, 1): 1.15}
>>> twin_energy = 0.05
>>> fig = plt.figure(figsize=(3*4.0, 4.0))
>>> ax = fig.add_subplot(131, projection='3d')
>>> particle = SingleCrystal(surface_energies)
>>> particle.make_plot(ax)
>>> ax = fig.add_subplot(132, projection='3d')
>>> particle = Decahedron(surface_energies,
...                       twin_energy=0.05)
>>> particle.make_plot(ax)
>>> ax = fig.add_subplot(133, projection='3d')
>>> particle = Icosahedron(surface_energies,
...                        twin_energy=0.05)
>>> particle.make_plot(ax)
>>> plt.subplots_adjust(top=1, bottom=0, left=0,
...                     right=1, wspace=0, hspace=0)
>>> plt.savefig('particles.png')
property natoms: List[int]

The approximate number of atoms in the particle (implicitly defining the volume).

property number_of_corners: float

Returns the number of corners (vertices) on the particle.


Rotate the particle.


rotation (ndarray) – Rotation matrix

property standardized_structure: Atoms

The standardized atomic structure that defines the geometry and thus the meaning of the Miller indices. Also forms the building blocks when particle.atoms is called.

property surface_energy: float

The total surface energy of the particle (including twin boundaries).


Translate the particle.


translation (list of 3 floats) – Translation vector

view(alpha=0.85, linewidth=0.3, colors=None, legend=True, save_as=None)

Use matplotlib to view a rendition of the particle.

  • alpha (float) – Opacity of the faces

  • linewidth (float) – Thickness of lines between faces

  • colors (Optional[dict]) – Allows custom colors for facets of all or a subset of forms, example {(1, 1, 1): '#FF0000'}

  • legend (bool) – Whether or not to show a legend with facet-color definitions

  • save_as (Optional[str]) – Filename to save figure as. If None, show the particle with the GUI instead.

property volume: float

Returns the volume of the particle


Write particle to file. The file format is derived from the filename. Currently supported fileformats are:

  • Wavefront .obj


filename (str) – Filename of file to write to