pyextal.jaxMultipole.maps

Static deformation density maps in direct space.

Delta rho = rho_multipole - rho_IAM: the valence shells at the refined population and kappa minus the neutral spherical atoms, plus every deformation term, summed over all atoms (orbit images and neighbouring cells) within cutoff of the plane. No thermal smearing – a static map – and no Fourier series, so it carries no truncation ripple; with ~30 reflections a Fourier residual map would be mostly ripple.

Each image of an asymmetric atom at W x + w carries its density rotated by the Cartesian R = A W A^-1: rho_j(r) = rho_0(R^T (r - r_j)), evaluated in the asymmetric atom’s local frame F as F R^T (r - r_j).

Functions

shell_density(shell, r_A[, renormalize])

One electron's worth of a shell's spherical density, e/Angstrom^3.

plane_grid(crystal, origin, u, v[, extent, n])

Cartesian points of a plane through origin spanned by u and v.

deformation_density(model, p, points[, cutoff, terms])

rho_model - rho_IAM at Cartesian points, e/Angstrom^3.

plane_atoms(crystal, origin, u, v[, extent, tol])

Atoms lying in a plane (within tol Angstrom), as in-plane coordinates.

plot_map(U, V, rho[, ax, step, vmax, title, atoms])

Contour plot: solid positive, dashed negative, dotted zero.

Module Contents

pyextal.jaxMultipole.maps.shell_density(shell, r_A, renormalize=True)

One electron’s worth of a shell’s spherical density, e/Angstrom^3.

pyextal.jaxMultipole.maps.plane_grid(crystal, origin, u, v, extent=(-2.0, 2.0, -2.0, 2.0), n=121)

Cartesian points of a plane through origin spanned by u and v.

Parameters:
  • origin (array-like) – Fractional coordinates of the centre.

  • u (array-like) – Direct-lattice directions; v is orthogonalised to u.

  • v (array-like) – Direct-lattice directions; v is orthogonalised to u.

  • extent (tuple) – (umin, umax, vmin, vmax) in Angstrom.

  • n (int) – Points per side.

Returns:

(points (n, n, 3) Cartesian, U, V) with U, V the in-plane coordinates in Angstrom.

Return type:

tuple

pyextal.jaxMultipole.maps.deformation_density(model, p, points, cutoff=6.5, terms='all')

rho_model - rho_IAM at Cartesian points, e/Angstrom^3.

Parameters:
  • model (MultipoleModel) – The model (‘cm’ sites contribute nothing).

  • p (array-like) – Physical parameters (e.g. FitResult.p).

  • points (np.ndarray) – (..., 3) Cartesian positions, Angstrom.

  • cutoff (float) – Atom images farther than this from a point are left out at that point. The diffuse shells (Ti 4s, Sr 5s) still carry ~1e-3 e/A^3 at 4 A, which shows as steps where an image crosses the cutoff; at 6.5 A their tails are ~1e-5.

  • terms (str) – 'all' – the full static deformation density; 'spherical' – only the valence shells’ change (population and kappa); 'multipole' – only the P_lm terms, the aspherical part. Cores are frozen, so they cancel in every case.

Returns:

Shape points.shape[:-1].

Return type:

np.ndarray

pyextal.jaxMultipole.maps.plane_atoms(crystal, origin, u, v, extent=(-2.0, 2.0, -2.0, 2.0), tol=0.05)

Atoms lying in a plane (within tol Angstrom), as in-plane coordinates.

Returns:

(site label, element, U, V) for every image inside extent (with a small margin).

Return type:

list[tuple]

pyextal.jaxMultipole.maps.plot_map(U, V, rho, ax=None, step=0.05, vmax=0.4, title=None, atoms=None)

Contour plot: solid positive, dashed negative, dotted zero.

Contours stop at +-vmax (0.4 e/A^3, the range of Friis et al.’s Fig. 5); near the nuclei a deformation map is steep and would otherwise be solid ink. vmax=None contours the full range.