\(\renewcommand\AA{\text{Å}}\)

# Utility functions

## `periodictable.util`

Helper functions

periodictable.util.cell_volume(a=None, b=None, c=None, alpha=None, beta=None, gamma=None)

  Compute cell volume from lattice parameters.

  Parameters:
    a, b, c float | Å

      Lattice spacings. a is required. b and c default to a.

    alpha, beta, gamma float | °

      Lattice angles. alpha defaults to 90°. beta and gamma default to alpha.

  Returns:
    V float | Å3

      Cell volume

  Raises:

    TypeError : missing or invalid parameters

  The following formula works for all lattice types:

  \[V = a b c \sqrt{1 - \cos^2 \alpha - \cos^2 \beta - \cos^2 \gamma + 2 \cos \alpha \cos \beta \cos \gamma}\]

periodictable.util.require_keywords(function)

  Decorator which forces all keyword arguments to the function to be explicitly named.

  For example:

      >>> @require_keywords
      ... def fn(a, b, c=3): pass
      >>> fn(1, 2, 3)
      Traceback (most recent call last):
      ...
      TypeError: name=value required for c
      >>> fn(1, 2, c=6)
      >>> fn(b=1, a=2, c=6)

  Variable arguments are not currently supported:

      >>> @require_keywords
      ... def fn(a, b, c=6, *args, **kw): pass
      Traceback (most recent call last):
      ...
      NotImplementedError: only named arguments for now

  Note

  The call signature is not preserved.

  We can’t preserve the function signature for the call since the only way we can count the number of non-keyword arguments is to use the *args, **kw call style. Python 3+ provides the ‘*’ call signature element which will force all keywords after ‘*’ to be named.