{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", " **Chapter 2: [Diffraction](CH2_00-Diffraction.ipynb)** \n", "\n", "
\n", "\n", "# Basic Crystallography\n", "[Download](https://raw.githubusercontent.com/gduscher/MSE672-Introduction-to-TEM//main/Diffraction/CH2_03-Basic_Crystallography.ipynb)\n", " \n", "[![OpenInColab](https://colab.research.google.com/assets/colab-badge.svg)](\n", " https://colab.research.google.com/github/gduscher/MSE672-Introduction-to-TEM/blob/main//Diffraction/CH2_03-Basic_Crystallography.ipynb)\n", " \n", "part of\n", "\n", " **[MSE672: Introduction to Transmission Electron Microscopy](../_MSE672_Intro_TEM.ipynb)**\n", "\n", "**Spring 2024**\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Gerd Duscher Khalid Hattar
Microscopy Facilities Tennessee Ion Beam Materials Laboratory
Materials Science & Engineering Nuclear Engineering
Institute of Advanced Materials & Manufacturing
The University of Tennessee, Knoxville
\n", "\n", "Background and methods to analysis and quantification of data acquired with transmission electron microscopes.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Load relevant python packages\n", "### Check Installed Packages" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "done\n" ] } ], "source": [ "import sys\n", "import importlib.metadata\n", "def test_package(package_name):\n", " \"\"\"Test if package exists and returns version or -1\"\"\"\n", " try:\n", " version = importlib.metadata.version(package_name)\n", " except importlib.metadata.PackageNotFoundError:\n", " version = '-1'\n", " return version\n", "\n", "if test_package('pyTEMlib') < '0.2024.1.0':\n", " print('installing pyTEMlib')\n", " !{sys.executable} -m pip install --upgrade pyTEMlib -q\n", "if 'google.colab' in sys.modules:\n", " !{sys.executable} -m pip install numpy==1.24.4\n", "print('done')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Load the plotting and figure packages\n", "Import the python packages that we will use:\n", "\n", "Beside the basic numerical (numpy) and plotting (pylab of matplotlib) libraries,\n", "* three dimensional plotting\n", "and some libraries from the book\n", "* kinematic scattering library." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "pyTEM version: 0.2023.8.0\n" ] } ], "source": [ "%matplotlib widget\n", "import matplotlib.pylab as plt\n", "import numpy as np\n", "import sys\n", "if 'google.colab' in sys.modules:\n", " from google.colab import output\n", " output.enable_custom_widget_manager()\n", " \n", "# 3D plotting package \n", "from mpl_toolkits.mplot3d import Axes3D # 3D plotting\n", "\n", "import ase\n", "\n", "# Import libraries from the pyTEMlib\n", "import pyTEMlib\n", "import pyTEMlib.kinematic_scattering as ks # kinematic scattering Library\n", " # with atomic form factors from Kirkland's book\n", "# it is a good idea to show the version numbers at this point for archiving reasons.\n", "print('pyTEM version: ',pyTEMlib.__version__)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "\n", "## Define Crystal\n", "\n", "A crystal is well defined by its unit cell and the atom positions within, the so called base.\n", "The base consists of which element sits where within the unit cell\n", "\n", "\n", "The unit cell fills the volume completely when translated in all three directions. Placing the unit cell in a global carthesian coordination system, we need the length of the sides and their angles for a complete description. This is depicted in the graph below.\n", "![unitcell_angles](images/unit_cell_angles.png)\n", "\n", "Figure taken from the wikipedia page on lattice constants.\n", "\n", "Mathematically it is more advantageous to describe the unit cell as matrix, the\n", "### Structure Matrix\n", "\n", "This matrix consists of rows of vectors that span the unit cell:\n", "$\\begin{bmatrix}\n", " a_1 & a_2 & a_3 \\\\\n", " b_1 & b_2 & b_3 \\\\\n", " c_1 & c_2 & c_3 \\\\\n", "\\end{bmatrix} =\\left[\\vec{a},\\vec{b},\\vec{c}\\right]$.\n", "\n", "This structure matrix is also used to describe the super cells in materials simulations for example density functional theory.\n", "\n", "The representation of unit cells as structure matrices allows also for easy conversions as we will see in the following.\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "structure matrix \n", " [[ 2.46 0. 0. ]\n", " [-1.23 2.13 0. ]\n", " [ 0. 0. 6.71]]\n", "elements: ['C', 'C', 'C', 'C']\n", "base \n", " [[0. 0. 0. ]\n", " [0. 0. 0.5 ]\n", " [0.333 0.667 0. ]\n", " [0.667 0.333 0.5 ]]\n" ] } ], "source": [ "# Create graphite unit cell (or structure matrix)\n", "a = b = 2.46 # Angstrom\n", "c = 6.71 # Angstrom\n", "gamma = 120\n", "alpha = beta = 90\n", "\n", "## Create the structure matrix for a hexagonal system explicitly:\n", "structure_matrix = np.array([[a,0.,0.], ## also called the structure matrix\n", " [np.cos(np.radians(gamma))*a,np.sin(np.radians(gamma))*a,0. ],\n", " [0.,0.,c]\n", " ])\n", "print('structure matrix \\n', np.round(structure_matrix,3))\n", "\n", "elements = ['C']*4\n", "base = [[0, 0, 0], [0, 0, 1/2], [1/3, 2/3, 0], [2/3, 1/3, 1/2]]\n", "print('elements:', elements)\n", "print('base \\n',np.round(base,3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Store Information in ASE (atomic simulation environment) format" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Atoms(symbols='C4', pbc=False, cell=[[2.46, 0.0, 0.0], [-1.2299999999999995, 2.130422493309719, 0.0], [0.0, 0.0, 6.71]])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "atoms = ase.Atoms(elements, cell=structure_matrix, scaled_positions=base)\n", "atoms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can retrieve the information stored" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "structure matrix [nm]\n", " [[ 2.46 0. 0. ]\n", " [-1.23 2.13 0. ]\n", " [ 0. 0. 6.71]]\n", "elements \n", " C4\n", "base \n", " [[0. 0. 0. ]\n", " [0. 0. 0.5 ]\n", " [0.333 0.667 0. ]\n", " [0.667 0.333 0.5 ]]\n" ] } ], "source": [ "print('structure matrix [nm]\\n',np.round(atoms.cell.array,3))\n", "print('elements \\n',atoms.get_chemical_formula())\n", "print('base \\n',np.round(atoms.get_scaled_positions(), 3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A convenient function is provided by the kinematic_scttering library (loaded with name ks)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Cell([[2.46772414, 0.0, 0.0], [-1.2338620699999996, 2.1371117947721068, 0.0], [0.0, 0.0, 6.711]]),\n", " array([[0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n", " [0.00000000e+00, 0.00000000e+00, 3.35550000e+00],\n", " [1.23386207e+00, 7.12370598e-01, 0.00000000e+00],\n", " [3.04714108e-16, 1.42474120e+00, 3.35550000e+00]]))" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "atoms = ks.structure_by_name('Graphite')\n", "atoms.cell, atoms.positions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Volume of Unit Cell\n", "We will need the volume of the unit cell for unit conversions later.\n", "\n", "Volume of the parallelepiped (https://en.wikipedia.org/wiki/Triple_product) : \n", "$\\vec{a} \\cdot \\vec{b} \\times \\vec{c} = \\det \\begin{bmatrix}\n", " a_1 & a_2 & a_3 \\\\\n", " b_1 & b_2 & b_3 \\\\\n", " c_1 & c_2 & c_3 \\\\\n", "\\end{bmatrix} ={\\rm det}\\left(\\vec{a},\\vec{b},\\vec{c}\\right)$\n", "\n", "We see that the structure matrix comes in handy for that calculation." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "volume of unit cell: 35.1660 Ang^3\n" ] } ], "source": [ "volume = v = np.linalg.det(structure_matrix)\n", "print(f\"volume of unit cell: {volume:.4f} Ang^3\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The same procedure is provided by ase" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "volume of unit cell: 35.3925 Ang^3\n" ] } ], "source": [ "print(f\"volume of unit cell: {atoms.cell.volume:.4f} Ang^3\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Vector Algebra in Unit Cell \n", "We will use the linear algebra package of numpy (np.linalg) for our vector calculations.\n", "\n", "The length of a vector is called its norm.\n", "\n", "And the angle between two vectors is calculated by the dot product: $\\vec{a} \\cdot \\vec{b} = \\left\\| \\vec{a} \\right\\| \\left\\| \\vec{b} \\right\\| \\cos (\\theta) $\n", "\n", "> Note that python starts couting at 0 and so the second vector has index 1" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "length of second unit cell vector is 2.460 Ang\n", "angle between a and b is 120.0 degree\n" ] } ], "source": [ "length_b = np.linalg.norm(structure_matrix[1])\n", "print(f'length of second unit cell vector is {length_b:.3f} Ang' ) \n", "\n", "gamma = np.arccos(np.dot(structure_matrix[0]/length_b, structure_matrix[1]/length_b))\n", "print(f'angle between a and b is {np.degrees(gamma):.1f} degree')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Plot the unit cell\n", "\n", "We use the visualization library of ase to plot structures." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0832d60318fa40e0b1152ed6f0f3937e", "version_major": 2, "version_minor": 0 }, "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABfcElEQVR4nO3dZ1gUB/s18LOwNBUQQREFW6xYcUXEEmuwxUSNsSVRY+wNRETAXlFUBGMjiSVGE/3HHqOJGMXeQKygEisgBCsg0tn3w/PK8xgBGdhhYOb8rosP7s7NnslsnOPM7KxKq9VqQURERESKoSd1ACIiIiIqWSyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMCyARERERArDAkhERESkMGqpA5RlOTk5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ebVaDUtLS9Gy6lJR1jsvbdq0QVRUlK7jlRpy2Na6Ula39eTJk3HgwAEcP34ctra2BS4rp+0tZL3zUha3t6GhIerWrYtWrVrB19cXzZs3R2BgYJ7LymlbC1nvvJTFbR0WFoaEhARoNBqo1Wqo1WqcOHECq1evhlqtRnZ29jszctrmQrAA5sPQ0BAajQbBwcFvPR4cHIy2bdvmOePs7PzO8keOHEGrVq1gYGAgWlZdKsp65yU8PBw2Nja6jldqyGFb60pZ29ZarRaTJk3Cnj17cOzYMdSuXfu9M3LY3kVZ77yUte2dF61Wi/T09Dyfk8O2zk9B652Xsritu3btiuvXr+PKlSu5P61atcIXX3yBK1euQF9f/50ZOW/zAkny0ZMyYseOHVoDAwPtxo0btREREVo3Nzdt+fLltQ8ePNBqtVqtl5eX9quvvspd/t69e9py5cppp06dqo2IiNBu3LhRa2BgoN21a5dUq1AkQtd71apV2r1792rv3LmjvXHjhtbLy0sLQLt7926pVkGw5ORkbXh4uDY8PFwLQOvv768NDw/XPnz4UKvVyndbC11vOWzr8ePHa83NzbUhISHauLi43J/Xr1/nLiPH7V2U9ZbD9vb29taePHlSe//+fe21a9e0Pj4+Wj09Pe2RI0e0Wq08t7VWK3y95bCt8/PvTwHLdZsLxQL4HmvXrtXWrFlTa2hoqG3ZsuVbt0wYPny4tmPHjm8tHxISonVwcNAaGhpqa9WqpV2/fn0JJ9YNIeu9bNky7QcffKA1NjbWWlhYaNu3b6/9/fffJUhddG9ugfDvn+HDh2u1Wvlua6HrLYdtndf6AtBu3rw5dxk5bu+irLcctvfIkSNz/y6rXLmytmvXrrklSKuV57bWaoWvtxy2dX7+XQDlus2FUmm1//9KRyIiIiJSBF4DSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECsMCSERERKQwLIBERERECvP/AOWFTJmAs3bXAAAAAElFTkSuQmCC", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from ase.visualize.plot import plot_atoms\n", "\n", "plot_atoms(atoms, radii=0.3, rotation=('0x,1y,0z'))\n" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# This does not work in Google Colab\n", "\n", "from ase.visualize import view\n", "view(atoms*(4,4,1))" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", "\n", " ASE atomic visualization\n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", " \n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from ase.visualize import view\n", "view(atoms*(3,3,1), viewer = 'x3d')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Reciprocal Lattice \n", "The unit cell in reciprocal space" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "reciprocal lattice [1/Ang.]:\n", "[[0.4052 0.234 0. ]\n", " [0. 0.4679 0. ]\n", " [0. 0. 0.149 ]]\n" ] } ], "source": [ "reciprocal_lattice = np.linalg.inv(atoms.cell.array).T # transposed of inverted unit_cell\n", "\n", "print('reciprocal lattice [1/Ang.]:')\n", "print(np.round(reciprocal_lattice,4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The same function is provided in ase package of Cell." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "reciprocal lattice [1/Ang.]:\n", "[[ 0.4052 0.234 0. ]\n", " [-0. 0.4679 0. ]\n", " [ 0. 0. 0.149 ]]\n" ] } ], "source": [ "print('reciprocal lattice [1/Ang.]:')\n", "print(np.round(atoms.cell.reciprocal(),4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Reciprocal Lattice Vectors\n", "From your crystallography book and lecture you are probably used to the following expression for the reciprocal lattice vectors ($\\vec{a}^*, \\vec{b}^*, \\vec{c}^*$)\n", "\n", "$ \\begin{align}\n", " \\vec{a}^* &= \\frac{\\vec{b} \\times \\vec{c}}{\\vec{a} \\cdot \\left(\\vec{b} \\times \\vec{c}\\right)} \\\\\n", " \\vec{b}^* &= \\frac{\\vec{c} \\times \\vec{a}}{\\vec{b} \\cdot \\left(\\vec{c} \\times \\vec{a}\\right)} \\\\\n", " \\vec{c}^* &= \\frac{\\vec{a} \\times \\vec{b}}{\\vec{c} \\cdot \\left(\\vec{a} \\times \\vec{b}\\right)}\n", "\\end{align}$\\\n", "\n", "Where we see that the denominators of the above vector equations are the volume of the unit cell.\n", "\n", "In physics book, you will see an additional factor of 2$\\pi$, which is generally omitted in materials science and microscopy." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0.405 0.234 -0. ]\n", "[0. 0.468 0. ]\n", "[ 0. -0. 0.149]\n", "Compare to:\n", "[[0.405 0.234 0. ]\n", " [0. 0.468 0. ]\n", " [0. 0. 0.149]]\n" ] } ], "source": [ "## Now let's test whether this is really equivalent to the matrix expression above.\n", "a,b,c = atoms.cell\n", "\n", "a_recip = np.cross(b, c)/np.dot(a, np.cross(b, c))\n", "print (np.round(a_recip, 3))\n", "b_recip = np.cross(c, a)/np.dot(a, np.cross(b, c))\n", "print (np.round(b_recip, 3))\n", "c_recip = np.cross(a, b)/np.dot(a, np.cross(b, c))\n", "print (np.round(c_recip, 3))\n", "\n", "print('Compare to:')\n", "print(np.round(reciprocal_lattice, 3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion\n", "\n", "With these definitions we have everything to define a crystal and to analyse diffraction and imaging data of crystalline specimens.\n", "\n", "Crystallography deals with the application of symmetry and group theory of symmetry to crystal structures.\n", "If you want to play around with symmetry and space groups, you can install the [spglib](http://atztogo.github.io/spglib/python-spglib.html#python-spglib). The spglib is especially helpfull for determination of reduced unit cells (the smallest possible ones, instead of the ones with the full symmetry).\n", "\n", "A number of common crystal structures are defined in the kinematic_scattering libary of the pyTEMlib package under the function ''structure_by_name''. Try them out in this notebook." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on function structure_by_name in module pyTEMlib.crystal_tools:\n", "\n", "structure_by_name(crystal_name)\n", " Provides crystal structure in ase.Atoms format.\n", " Additional information is stored in the info attribute as a dictionary\n", "\n", "\n", " Parameter\n", " ---------\n", " crystal_name: str\n", " Please note that the chemical expressions are not case-sensitive.\n", "\n", " Returns\n", " -------\n", " atoms: ase.Atoms\n", " structure\n", "\n", " Example\n", " -------\n", " >> # for a list of pre-defined crystal structures\n", " >> import pyTEMlib.crystal_tools\n", " >> print(pyTEMlib.crystal_tools.crystal_data_base.keys())\n", " >>\n", " >> atoms = pyTEMlib.crystal_tools.structure_by_name('Silicon')\n", " >> print(atoms)\n", " >> print(atoms.info)\n", "\n" ] } ], "source": [ "# As ususal the help function will show you the usage of a function:\n", "help(ks.structure_by_name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are all the predifined crystal structures.\n", "\n", "> Check out the [building tutorial of ase](https://wiki.fysik.dtu.dk/ase/ase/build/build.html) for more fun structures like nanotubes " ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_keys(['aluminum', 'al', 'aluminium', 'gold', 'au', 'silver', 'ag', 'copper', 'cu', 'diamond', 'germanium', 'ge', 'silicon', 'si', 'gaas', 'fcc fe', 'iron', 'bcc fe', 'alpha iron', 'srtio3', 'strontium titanate', 'graphite', 'cscl', 'cesium chlorid', 'mgo', 'titanium nitride', 'zno wurzite', 'zno', 'wzno', 'gan', 'gan wurzite', 'wgan', 'gallium nitride', 'tio2', 'mos2', 'ws2', 'wse2', 'mose2', 'zno hexagonal', 'pdse2'])\n" ] } ], "source": [ "print(ks.crystal_data_base.keys())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now use one name of above structures and redo this notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Navigation\n", "\n", "- **Back: [Basic Crystallography](CH2_03-Basic_Crystallography.ipynb)** \n", "- **Next: [Structure Factors](CH2_04-Structure_Factors.ipynb)** \n", "- **Chapter 2: [Diffraction](CH2_00-Diffraction.ipynb)** \n", "- **List of Content: [Front](../_MSE672_Intro_TEM.ipynb)** " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Appendix: Read POSCAR\n", "\n", "Load and draw a crystal structure from a POSCAR file\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The function " ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "from ase.io import read, write\n", "import pyTEMlib.file_tools as ft\n", "import os\n", "\n", "def read_poscar(): # open file dialog to select poscar file\n", " file_name = ft.open_file_dialog_qt('POSCAR (POSCAR*.txt);;All files (*)')\n", " #use ase package to read file\n", " \n", " base = os.path.basename(file_name)\n", " base_name = os.path.splitext(base)[0]\n", " crystal = read(file_name, format='vasp', parallel=False)\n", " \n", " return crystal" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "expected str, bytes or os.PathLike object, not NoneType", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[22], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m atoms \u001b[38;5;241m=\u001b[39m \u001b[43mread_poscar\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 2\u001b[0m atoms\n", "Cell \u001b[1;32mIn[21], line 9\u001b[0m, in \u001b[0;36mread_poscar\u001b[1;34m()\u001b[0m\n\u001b[0;32m 6\u001b[0m file_name \u001b[38;5;241m=\u001b[39m ft\u001b[38;5;241m.\u001b[39mopen_file_dialog_qt(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mPOSCAR (POSCAR*.txt);;All files (*)\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 7\u001b[0m \u001b[38;5;66;03m#use ase package to read file\u001b[39;00m\n\u001b[1;32m----> 9\u001b[0m base \u001b[38;5;241m=\u001b[39m \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbasename\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile_name\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 10\u001b[0m base_name \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39msplitext(base)[\u001b[38;5;241m0\u001b[39m]\n\u001b[0;32m 11\u001b[0m crystal \u001b[38;5;241m=\u001b[39m read(file_name, \u001b[38;5;28mformat\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mvasp\u001b[39m\u001b[38;5;124m'\u001b[39m, parallel\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n", "File \u001b[1;32m:270\u001b[0m, in \u001b[0;36mbasename\u001b[1;34m(p)\u001b[0m\n", "File \u001b[1;32m:241\u001b[0m, in \u001b[0;36msplit\u001b[1;34m(p)\u001b[0m\n", "\u001b[1;31mTypeError\u001b[0m: expected str, bytes or os.PathLike object, not NoneType" ] } ], "source": [ "atoms = read_poscar()\n", "atoms" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "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.10.12" }, "toc": { "base_numbering": "3", "nav_menu": { "height": "318px", "width": "307px" }, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "288px" }, "toc_section_display": true, "toc_window_display": false }, "vscode": { "interpreter": { "hash": "838e0debddb5b6f29d3d8c39ba50ae8c51920a564d3bac000e89375a158a81de" } } }, "nbformat": 4, "nbformat_minor": 4 }