forte2.symmetry.pg_sym_detect#

Module Contents#

class forte2.symmetry.pg_sym_detect.PGSymmetryDetector#

Class to detect Abelian point group symmetry of a molecule.

Parameters:
inertia_tensorndarray of shape (3, 3)

Moment of inertia tensor.

com_atomic_positionsndarray of shape (natoms, 3)

Atomic positions in the center-of-mass frame.

chargesndarray of shape (natoms,)

Atomic numbers.

tolfloat, optional, default=1e-4

Tolerance for detecting symmetry.

Notes

See NASymmetry/MolSym We first find the principal axes of rotation, and then determine the largest Abelian point group.

To find the principal axes, we first compute the principal moments of inertia and their corresponding axes. Depending on the number of degenerate moments of inertia, the molecule is classified as an asymmetric top (non-degenerate), symmetric top (doubly degenerate), or spherical top (triply degenerate).

The asymmetric top case is the simplest: these correspond to one of the subgroups of D2h, and the principal axes are the eigenvectors of the inertia tensor.

The symmetric top case has a unique axis (e.g. the lone pair axis in NH3), and the other two axes are degenerate in the plane orthogonal to the unique axis. These are the C/D/S cases. D groups have C2 axes orthogonal to the unique axis, so we first check for those. These could be through an atom or through the midpoint between two symmetry equivalent atoms. If we find at least one C2 axis, we use that to define the x-axis in the orthogonal plane, and the y-axis is then determined by the right-hand rule. If not, we are in the C/S case, and we need to look for sigma_v planes. We know that these must be through atoms, so we pick one and use that to define the x-axis.

The spherical top case is the most complicated. To distinguish between T/O/I groups, we find all unique C2 axes. T groups have 3 unique C2 axes, O groups have 9, and I groups have 15. For T groups, the principal axes are just the C2 axes. For O groups, there will be 3 unique C4 axes, which will be the principal axes. I groups are currently treated as C1.

inertia_tensor: numpy.ndarray#
com_atomic_positions: numpy.ndarray#
charges: numpy.ndarray#
tol: float = 0.0001#
run()#
find_c2_axes_through_atom()#
find_c2_axes_through_midpoint()#