pyextal.jaxMultipole.symmetry¶
Site symmetry, local frames, allowed parameters and reflection families.
Local frames¶
Multipole populations are only comparable between programs – and only come out
as single named P_lm rather than mixtures – when each atom’s frame is chosen
the way Kurki-Suonio’s index-picking rules choose it:
cubic site groups (four 3-fold axes): z and x along two of the cube axes (the 4-fold axes, or the 2-fold ones in 23 / m-3);
otherwise z along the highest-order rotation axis (proper or improper), or along the mirror normal when a mirror is all there is, and x along a 2-fold axis or mirror normal perpendicular to z when one exists;
failing that, the crystal’s Cartesian axes.
Ties are broken towards the Cartesian axes, x before y before z, so the choice
is deterministic. A frame can always be given explicitly instead, as direct
lattice directions z=[u, v, w], x=[u, v, w].
For the oxygen of SrTiO3 at (0, 1/2, 1/2) this puts z along [100] – the
Ti-O bond and the 4-fold axis – and x along [010].
Reflection families¶
U(W^T h) = U(h) exp(-2 pi i h.w) for every operation (W, w), which is
what maps a dataset’s own reflection label onto the canonical key of its family.
The key is chosen as jaxJoint.link.canonical chooses it – the largest member
of the orbit, -h included for centrosymmetric groups – so keys from a joint
refinement can be used as they are.
Functions¶
|
Rotation axis and order of a Cartesian operation's proper part. |
|
Rows of the local frame, as Cartesian unit vectors. |
|
Site operations expressed in the local frame, |
|
A short description of a site group: order, axes and inversion. |
|
Allowed populations of every order up to |
|
Allowed |
|
|
|
The canonical key of g's family: the largest member, as in jaxJoint. |
|
|
|
Maps a value refined under the label |
Module Contents¶
- pyextal.jaxMultipole.symmetry.axis_and_order(R, tol=1e-06)¶
Rotation axis and order of a Cartesian operation’s proper part.
- Returns:
(axis, n, proper).axisisNonefor the identity and the inversion;nis the order of the proper rotation+-R.- Return type:
tuple
- pyextal.jaxMultipole.symmetry.local_frame(stab_cart, A=None, z=None, x=None)¶
Rows of the local frame, as Cartesian unit vectors.
- Parameters:
stab_cart (np.ndarray) –
(m, 3, 3)Cartesian site-symmetry operations.A (np.ndarray, optional) – Lattice matrix, needed only for user axes.
z (array-like, optional) – Direct-lattice directions
[u, v, w]overriding the automatic choice.xis orthogonalised toz.x (array-like, optional) – Direct-lattice directions
[u, v, w]overriding the automatic choice.xis orthogonalised toz.
- Returns:
(3, 3) with rows
x, y, z; a proper rotation, so thatu_local = F @ u_cart.- Return type:
np.ndarray
- pyextal.jaxMultipole.symmetry.local_rotations(stab_cart, frame)¶
Site operations expressed in the local frame,
F R F^T.
- pyextal.jaxMultipole.symmetry.point_group_name(stab_cart)¶
A short description of a site group: order, axes and inversion.
- pyextal.jaxMultipole.symmetry.allowed_multipoles(stab_local, lmax, lmin=0)¶
Allowed populations of every order up to
lmax.- Returns:
l -> (2l+1, nfree)RREF bases (possibly empty).- Return type:
dict[int, np.ndarray]
- pyextal.jaxMultipole.symmetry.allowed_adp_basis(stab_frac, Gstar)¶
Allowed
U_ijdirections, RREF in(U11, U22, U33, U12, U13, U23).pyextal.adp.allowed_beta_basisworks on the engine’s beta; withbeta_ij = 2 pi^2 a*_i a*_j U_ijdiagonal in the 6-vector, the same subspace inU_ijcoordinates is its rescaling, which RREF then turns into named components (U11andU22 = U33for a 4-fold axis along a).- Returns:
(6, nfree);beta = D @ basis @ coeffswithDfromuij_to_beta_matrix().- Return type:
np.ndarray
- pyextal.jaxMultipole.symmetry.orbit(g, crystal)¶
{member: (W, w, conj)}of g’s family,-gfolded in for centrosymmetric groups.Each member is listed with one operation producing it, preferring the engine’s coset representatives;
conjmarks members reached only through the inversion-related half, i.e. through-g.
- pyextal.jaxMultipole.symmetry.canonical(g, crystal)¶
The canonical key of g’s family: the largest member, as in jaxJoint.
- pyextal.jaxMultipole.symmetry.link_phase(local, key, crystal)¶
(c, conj)withU(local) = c * (U(key)* if conj else U(key)).The same relation jaxJoint.link.link_map encodes as a 4 x 4 matrix:
U(W^T g) = U(g) exp(-2 pi i g.w)for a coset representative, and for a member reached through-gthe Friedel relationU(-g) = U(g)*first.- Raises:
ValueError – If
localis not inkey’s family.
- pyextal.jaxMultipole.symmetry.to_key(value, local, key, crystal)¶
Maps a value refined under the label
localto the canonicalkey.