{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Steinhardt's parameters\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Steinhardt\\'s bond orientational order parameters {cite}`Steinhardt1983` are a set of\n", "parameters based on [spherical\n", "harmonics](https://en.wikipedia.org/wiki/Spherical_harmonics) to explore\n", "the local atomic environment. These parameters have been used\n", "extensively for various uses such as distinction of crystal structures,\n", "identification of solid and liquid atoms and identification of\n", "defects {cite}`Steinhardt1983`.\n", "\n", "These parameters, which are rotationally and translationally invariant\n", "are defined by,\n", "\n", "> $$ q_l (i) = \\Big( \\frac{4\\pi}{2l+1} \\sum_{m=-l}^l | q_{lm}(i) |^2 \\Big )^{\\frac{1}{2}} $$\n", "\n", "where,\n", "\n", "> $$ q_{lm} (i) = \\frac{1}{N(i)} \\sum_{j=1}^{N(i)} Y_{lm}(\\pmb{r}_{ij}) $$\n", "\n", "in which $Y_{lm}$ are the spherical harmonics and $N(i)$ is the number\n", "of neighbours of particle $i$, $\\pmb{r}_{ij}$ is the vector connecting\n", "particles $i$ and $j$, and $l$ and $m$ are both intergers with\n", "$m \\in [-l,+l]$. Various parameters have found specific uses, such as\n", "$q_2$ and $q_6$ for identification of crystallinity, $q_6$ for\n", "identification of solidity, and $q_4$ and $q_6$ for distinction of\n", "crystal structures {cite}`Mickel2013`. Commonly this method uses a cutoff radius to\n", "identify the neighbors of an atom. The cutoff can be chosen based on\n", "[different methods\n", "available](../part2/intro.md).\n", "Once the cutoff is chosen and neighbors are calculated, the calculation\n", "of Steinhardt\\'s parameters is straightforward.\n", "\n", "``` python\n", "sys.calculate_q([4, 6])\n", "q = sys.get_qvals([4, 6])\n", "```\n", "\n", "## Averaged Steinhardt's parameters\n", "\n", "At high temperatures, thermal vibrations affect the atomic positions.\n", "This in turn leads to overlapping distributions of $q_l$ parameters,\n", "which makes the identification of crystal structures difficult. To\n", "address this problem, the averaged version $\\bar{q}_l$ of Steinhardt\\'s\n", "parameters was introduced by Lechner and Dellago {cite}`Lechner2008`. $\\bar{q}_l$ is\n", "given by,\n", "\n", "> $$\\bar{q}_l (i) = \\Big( \\frac{4\\pi}{2l+1} \\sum_{m=-l}^l \\Big| \\frac{1}{\\tilde{N}(i)} \\sum_{k=0}^{\\tilde{N}(i)} q_{lm}(k) \\Big|^2 \\Big )^{\\frac{1}{2}}$$\n", "\n", "where the sum from $k=0$ to $\\tilde{N}(i)$ is over all the neighbors and\n", "the particle itself. The averaged parameters takes into account the\n", "first neighbor shell and also information from the neighboring atoms and\n", "thus reduces the overlap between the distributions. Commonly $\\bar{q}_4$\n", "and $\\bar{q}_6$ are used in identification of crystal structures.\n", "Averaged versions can be calculated by setting the keyword\n", "`averaged=True` as follows.\n", "\n", "``` python\n", "sys.calculate_q([4, 6], averaged=True)\n", "q = sys.get_qvals([4, 6], averaged=True)\n", "```\n", "\n", "## Voronoi weighted Steinhardt's parameters\n", "\n", "In order to improve the resolution of crystal structures Mickel et\n", "al {cite}`Mickel2013` proposed weighting the contribution of each neighbor to the\n", "Steinhardt parameters by the ratio of the area of the Voronoi facet\n", "shared between the neighbor and host atom. The weighted parameters are\n", "given by,\n", "\n", "> $$q_{lm} (i) = \\frac{1}{N(i)} \\sum_{j=1}^{N(i)} \\frac{A_{ij}}{A} Y_{lm}(\\pmb{r}_{ij})$$\n", "\n", "where $A_{ij}$ is the area of the Voronoi facet between atoms $i$ and\n", "$j$ and $A$ is the sum of the face areas of atom $i$. In pyscal, the\n", "area weights are already assigned during the neighbor calculation phase\n", "when the Voronoi method is used to calculate neighbors in the\n", "[System.find_neighbors](https://docs.pyscal.org/en/latest/pyscal.html#pyscal.core.System.find_neighbors). The\n", "Voronoi weighted Steinhardt\\'s parameters can be calculated as follows,\n", "\n", "``` python\n", "sys.find_neighbors(method='voronoi')\n", "sys.calculate_q([4, 6])\n", "q = sys.get_qvals([4, 6])\n", "```\n", "\n", "The weighted Steinhardt\\'s parameters can also be averaged as described\n", "above. Once again, the keyword `averaged=True` can be used for this\n", "purpose.\n", "\n", "``` python\n", "sys.find_neighbors(method='voronoi')\n", "sys.calculate_q([4, 6], averaged=True)\n", "q = sys.get_qvals([4, 6], averaged=True)\n", "```\n", "\n", "It was also proposed that higher powers of the weight {cite}`Haeberle2019`\n", "$\\frac{A_{ij}^{\\alpha}}{A(\\alpha)}$ where $\\alpha = 2, 3$ can also be\n", "used, where $A(\\alpha) = \\sum_{j=1}^{N(i)} A_{ij}^{\\alpha}$ The value of\n", "this can be set using the keyword `voroexp` during the neighbor\n", "calculation phase.\n", "\n", "``` python\n", "sys.find_neighbors(method='voronoi', voroexp=2)\n", "```\n", "\n", "If the value of `voroexp` is set to 0, the neighbors would be found\n", "using Voronoi method, but the calculated Steinhardt\\'s parameters will\n", "not be weighted.\n", "\n", "\n", "## References\n", "\n", "```{bibliography} ../references.bib\n", ":filter: docname in docnames\n", ":style: unsrt\n", "```" ] } ], "metadata": { "kernelspec": { "display_name": "py3", "language": "python", "name": "py3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.1" } }, "nbformat": 4, "nbformat_minor": 4 }