c2x and Symmetry

Since version 2 of check2xsf it has been possible to link it with the excellent spglib symmetry finding code, and thus gain access to the functionality of this library. This is the same symmetry finder which is used by Castep.

Spglib is a useful package for finding crystallographic symmetry, including the primitive cell, individual symmetry operations, and the international space group symbol.

C2x provides access to the following operations from spglib:

  refine        call spg_refine_cell()
  primitive     call spg_find_primitive()
  standardise   call spg_standardize_cell(no_idealize=1)
  int           call spg_get_dataset() and report international symbol
  schoen        call spg_get_schoenflies()
  symmetry      call spg_get_dataset() and keep symmetry ops
  list          call spg_get_dataset() and list symmetry ops
  point         call spg_get_dataset() followed by spg_get_pointgroup()

These are requested by preceding them with two hyphens on the c2x command line. Multiple operations may be specified. The order in which they will be applied is the order in which they are listed above, not the order on the command line.

There is also one useful compound option, --snap. The operations which snap to symmetry are:

primitive: convert to a snapped version of the standard primitive cell

standardise: convert to a snapped version of the standard cell

snap: convert to a snapped version of the standard primitive cell, and then expand back to a snapped version of the original cell

The intention is that --snap snaps atoms and axes to be consistent with the symmetry found by SPGlib (not any symmetry operations given in the input), but without transforming the cell to a standardised representation.

Examples

$ c2x --int --list  SiC_4H.cell
Tol=0.0001  International symmetry is P6_3mc
Tol=0.0001  12 symmetry operations found.
Identity
6_3 axis along ( 0.000, 0.000, 1.000) through (0.333333,0.333333,0.000000)
 3  axis along ( 0.000, 0.000, 1.000) through (0,0,0)
2_1 axis along ( 0.000, 0.000, 1.000) through (0.333333,0.333333,0.000000)
 3  axis along ( 0.000, 0.000, 1.000) through (0,0,0)
6_3 axis along ( 0.000, 0.000, 1.000) through (0.333333,0.333333,0.000000)
glide plane ( 2.000,-1.000, 0.000) offset (0.333334,0.833333,0) glide (0,0,0.5)
mirror plane ( 1.000, 0.000, 0.000) offset (0,0,0)
glide plane ( 1.000, 1.000, 0.000) offset (0.333333,0.333333,0) glide (0,0,0.5)
mirror plane ( 0.000,-1.000, 0.000) offset (0,0,0)
glide plane ( 1.000,-2.000, 0.000) offset (0.833333,0.333334,0) glide (0,0,0.5)
mirror plane ( 1.000,-1.000, 0.000) offset (0,0,0)

(Versions prior to 2.40b report mirror and glide planes as -2 axes.)

Note that a single six-fold axis will appear five times, representing the five different rotations, two of which will be listed as three-fold, and one as two-fold.

It is also possible to give a range of precisions to use when searching for symmetry operations.

$ c2x --int --list -e=1e-6-1e-4 SiC_4H.cell
Tol=1e-06 International symmetry is Cmc2_1
Tol=1e-06 4 symmetry operations found.
Tol=8e-06 International symmetry is P6_3mc
Tol=8e-06 12 symmetry operations found.

This output shows that at a tolerance of 8e-6 the six-fold axis is detected, whereas the other elements continue to exist at tighter tolerances. Prior to version 2.31 tolerances are tested at factor of two intervals between the lowest and highest given as a range. From 2.31 bisection is used to attempt to find a more exact transition point.

Finally a demonstration of --snap being used to convert a low-precision input cell to a higher precision.

$ cat SiC_4H.cell
%block LATTICE_CART
ang
  3.0827000   0.0000000   0.0000000
  1.5413500   2.6696965   0.0000000
  0.0000000   0.0000000  10.0680000
%endblock LATTICE_CART

%block POSITIONS_FRAC
 Si  0.000000000  0.000000000  0.000000000
 Si  0.333333330  0.333333330  0.250000000
 Si  0.666666670  0.666666670  0.500000000
 Si  0.333333330  0.333333330  0.750000000
  C  0.333333330  0.333333330  0.062500000
  C  0.666666670  0.666666670  0.312500000
  C  0.333333330  0.333333330  0.562500000
  C  0.000000000  0.000000000  0.812500000
%endblock POSITIONS_FRAC
$ c2x -15 --snap --cell SiC_4H.cell | cat
%block LATTICE_CART
ang
  3.082699989394402  -0.000000006123144   0.000000000000000
  1.541350000000000   2.669696500000000   0.000000000000000
 -0.000000000000001   0.000000000000001  10.068000000000000
%endblock LATTICE_CART

%block POSITIONS_FRAC
 Si  0.000000000000000  0.000000000000000  0.000000000000000
 Si  0.333333333333333  0.333333333333333  0.250000000000000
 Si  0.666666666666667  0.666666666666667  0.500000000000000
 Si  0.333333333333333  0.333333333333333  0.750000000000000
  C  0.333333333333333  0.333333333333333  0.062500000000000
  C  0.666666666666667  0.666666666666667  0.312500000000000
  C  0.333333333333333  0.333333333333333  0.562500000000000
  C  0.000000000000000  0.000000000000000  0.812500000000000