{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Structure\n",
    "\n",
    "In order to carry out any simulations using the `udkm1Dsim` package, an according one-dimensional `Structure` needs to be created in advance.\n",
    "\n",
    "This `Structure` object can consists of one or many sub-structures and/or `Layers` of type `UnitCell` or `AmorphousLayer`.\n",
    "\n",
    "`UnitCell`s and `AmorphousLayer`s consist of the fundamental building blocks, namely `Atom`s and `AtomMixed`.\n",
    "\n",
    "In this example the basic concepts of creating the above mentioned objects are introduced. Furthermore one should easily see how to set and access all the physical properties of these physical objects."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup\n",
    "\n",
    "Do all necessary imports and settings."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import udkm1Dsim as ud\n",
    "u = ud.u #  import the pint unit registry from udkm1Dsim\n",
    "import scipy.constants as constants\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "u.setup_matplotlib() #  use matplotlib with pint units"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Atoms\n",
    "\n",
    "The `atoms` module contains two classes: `Atom` and `AtomMixed`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Atom\n",
    "\n",
    "The `Atom` object represents a real physical atom as it can be found in the periodic table.\n",
    "Accordingly, it is initialized with the required `symbol` of the element.\n",
    "Then all necessary data are loaded from parameter files linked to this element.\n",
    "\n",
    "An optional `ID` can be given as _keyword parameter_ if atoms of the same element but with different properties are used.\n",
    "Another keyword argument is the `ionicity` of the atom, which has to be present in the parameter files.\n",
    "\n",
    "The magnetization of every atom can be set by the three _keyword parameters_\n",
    "* `mag_amplitude`\n",
    "* `mag_phi`\n",
    "* `mag_gamma`\n",
    "\n",
    "If no individual paths to the atomic- and/or magnetic scattering factors are given, by `atomic_form_factor_path` and `magnetic_form_factor_path`, respectively, the defaults parameters are used from the \n",
    "_Chantler tables_:\n",
    "\n",
    "C.T. Chantler, K. Olsen, R.A. Dragoset, J. Chang, A.R. Kishore, S.A. Kotochigova, & D.S. Zucker,  \n",
    "*Detailed Tabulation of Atomic Form Factors, Photoelectric Absorption and Scattering Cross Section, and Mass Attenuation Coefficients for Z = 1-92 from E = 1-10 eV to E = 0.4-1.0 MeV*  \n",
    "[NIST Standard Reference Database 66.](https://dx.doi.org/10.18434/T4HS32)\n",
    "\n",
    "as well as [Project Dyna](https://neel.cnrs.frspip.php/?rubrique1008&lang=en), respectively"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "O = ud.Atom('O')\n",
    "Om1 = ud.Atom('O', id='Om1', ionicity=-1)\n",
    "Om2 = ud.Atom('O', id='Om2', ionicity=-2)\n",
    "Fe = ud.Atom('Fe', mag_amplitude=1, mag_phi=0*u.deg, mag_gamma=90*u.deg)\n",
    "Cr = ud.Atom('Cr')\n",
    "Ti = ud.Atom('Ti')\n",
    "Sr = ud.Atom('Sr')\n",
    "Ru = ud.Atom('Ru')\n",
    "Pb = ud.Atom('Pb')\n",
    "Zr = ud.Atom('Zr')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "One can easily print all properties of a single atom:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Atom with the following properties\n",
      "=================  =================================\n",
      "               id  Sr\n",
      "           symbol  Sr\n",
      "             name  Strontium\n",
      "  atomic number Z  38\n",
      "    mass number A  87.62\n",
      "             mass  1.455×10⁻²⁵ kg\n",
      "         ionicity  0\n",
      "Cromer Mann coeff  [38.      0.     17.5663  9.8184]\n",
      "               ..  [ 5.422   2.6694  1.5564 14.0988]\n",
      "               ..  [  0.1664 132.376    2.5064]\n",
      "  magn. amplitude  0\n",
      "        magn. phi  0.0 deg\n",
      "      magn. gamma  0.0 deg\n",
      "=================  =================================\n"
     ]
    }
   ],
   "source": [
    "print(Sr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Or just a single property:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7.948502350094219×10⁻²⁶ kg\n"
     ]
    }
   ],
   "source": [
    "print(Ti.mass)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Mixed Atom\n",
    "\n",
    "The `AtomMixed` class allows for solid solutions that can easily achieved by the following lines of code.\n",
    "The input for the initialization of the `AtomMixed` object are the `symbol`, `id`, and `name`, whereas only the first is required."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AtomMixed with the following properties\n",
      "===============  ====================\n",
      "             id  ZT\n",
      "         symbol  ZT\n",
      "           name  Zircon-Titan 0.2 0.8\n",
      "atomic number Z  25.6\n",
      "  mass number A  56.538399999999996\n",
      "           mass  9.388×10⁻²⁶ kg\n",
      "       ionicity  0.0\n",
      "magn. amplitude  0\n",
      "      magn. phi  0.0 deg\n",
      "    magn. gamma  0.0 deg\n",
      "===============  ====================\n",
      "2 Constituents:\n",
      "---------  ------\n",
      "Zirconium  20.0 %\n",
      " Titanium  80.0 %\n",
      "---------  ------\n"
     ]
    }
   ],
   "source": [
    "ZT = ud.AtomMixed('ZT', id='ZT', name='Zircon-Titan 0.2 0.8')\n",
    "ZT.add_atom(Zr, 0.2)\n",
    "ZT.add_atom(Ti, 0.8)\n",
    "print(ZT)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Layers\n",
    "\n",
    "The atoms created above can be used to build `Layer`s.\n",
    "There are two types of layers available: `AmorphousLayer` and crystalline `UnitCell`.\n",
    "Both share many common physical properties which are relevant for the later simulations.\n",
    "Please refer to a complete list or properties and methods in the __API documentation__."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Amorphous Layers\n",
    "\n",
    "The `AmorphousLayer` must be initialized with an `id`, `name`, `thickness`, and `density`.\n",
    "All other properties are optional and must be set to carry out the according simulations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Amorphous layer with the following properties\n",
      "\n",
      "========================  ===========================\n",
      "               parameter  value\n",
      "========================  ===========================\n",
      "                      id  amorph_Fe\n",
      "                    name  amorph_Fe\n",
      "               thickness  20.0 nm\n",
      "                    area  0.01 nm²\n",
      "                  volume  0.2 nm³\n",
      "                    mass  1.5748×10⁻²⁴ kg\n",
      "      mass per unit area  1.5748×10⁻²⁴ kg\n",
      "                 density  7.874×10³ kg/m³\n",
      "               roughness  0.0 nm\n",
      "     Debye Waller Factor  0 m²\n",
      "          sound velocity  0.0 m/s\n",
      "         spring constant  [0.0] kg/s²\n",
      "          phonon damping  0.0 kg/s\n",
      "         opt. pen. depth  0.0 nm\n",
      "   opt. refractive index  0\n",
      "  opt. ref. index/strain  0\n",
      "        thermal conduct.  lambda T: 0.000000 W/(m K)\n",
      "linear thermal expansion  lambda T: 0.000000\n",
      "           heat capacity  lambda T: 0.000000 J/(kg K)\n",
      "      subsystem coupling  lambda T: 0.000000 W/m³\n",
      "             no atom set\n",
      "========================  ===========================\n"
     ]
    }
   ],
   "source": [
    "amorph_Fe = ud.AmorphousLayer('amorph_Fe', 'amorph_Fe', 20*u.nm, 7.874*u.g/u.cm**3)\n",
    "# print the layer properties\n",
    "print(amorph_Fe)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The physical properties can be also given during initialization using a `dict`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Amorphous layer with the following properties\n",
      "\n",
      "========================  ===========================\n",
      "               parameter  value\n",
      "========================  ===========================\n",
      "                      id  amorph_Cr\n",
      "                    name  amorph_Cr\n",
      "               thickness  40.0 nm\n",
      "                    area  0.01 nm²\n",
      "                  volume  0.4 nm³\n",
      "                    mass  2.856×10⁻²⁴ kg\n",
      "      mass per unit area  2.856×10⁻²⁴ kg\n",
      "                 density  7.14×10³ kg/m³\n",
      "               roughness  0.0 nm\n",
      "     Debye Waller Factor  0 m²\n",
      "          sound velocity  5×10³ m/s\n",
      "         spring constant  [0.0] kg/s²\n",
      "          phonon damping  0.0 kg/s\n",
      "         opt. pen. depth  9.999999999999998 nm\n",
      "   opt. refractive index  0\n",
      "  opt. ref. index/strain  0\n",
      "        thermal conduct.  lambda T: 0.000000 W/(m K)\n",
      "linear thermal expansion  lambda T: 0.000000\n",
      "           heat capacity  lambda T: 0.000000 J/(kg K)\n",
      "      subsystem coupling  lambda T: 0.000000 W/m³\n",
      "                    atom  Chromium\n",
      "           magnetization\n",
      "               amplitude  0\n",
      "                 phi [°]  0.0 deg\n",
      "               gamma [°]  0.0 deg\n",
      "========================  ===========================\n"
     ]
    }
   ],
   "source": [
    "params = {\n",
    "    'opt_pen_depth': 10*u.nm,\n",
    "    'sound_vel': 5*(u.nm/u.ps),\n",
    "}\n",
    "\n",
    "amorph_Cr = ud.AmorphousLayer('amorph_Cr', 'amorph_Cr', 40*u.nm, 7.14*u.g/u.cm**3, atom=Cr, **params)\n",
    "# print the layer properties\n",
    "print(amorph_Cr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Unit Cells\n",
    "\n",
    "The `UnitCell` requires an `id`, `name`, and `c_axis` upon initialization.\n",
    "Multiple atoms can be added to relative positions along the _c_-Axis in the 1D `UnitCell`.\n",
    "Note that all temperature-dependent properties can be given either as scalar (constant) value or as string that represents a temperature-dependent _lambda_-function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Unit Cell with the following properties\n",
      "\n",
      "========================  ==================================================\n",
      "               parameter  value\n",
      "========================  ==================================================\n",
      "                      id  SRO\n",
      "                    name  Strontium Ruthenate\n",
      "                  a-axis  0.3905 nm\n",
      "                  b-axis  0.3905 nm\n",
      "                  c-axis  0.3949 nm\n",
      "                    area  0.1525 nm²\n",
      "                  volume  0.06022 nm³\n",
      "                    mass  3.93×10⁻²⁵ kg\n",
      "      mass per unit area  2.577×10⁻²⁶ kg\n",
      "                    area  0.1525 nm²\n",
      "                  volume  0.06022 nm³\n",
      "                    mass  3.930300027032341×10⁻²⁵ kg\n",
      "      mass per unit area  2.5774107046400294×10⁻²⁶ kg\n",
      "                 density  6.527×10³ kg/m³\n",
      "               roughness  0.0 nm\n",
      "     Debye Waller Factor  0 m²\n",
      "          sound velocity  6.312×10³ m/s\n",
      "         spring constant  [6.0] kg/s²\n",
      "          phonon damping  0.0 kg/s\n",
      "         opt. pen. depth  0.0 nm\n",
      "   opt. refractive index  (2.44+4.32j)\n",
      "  opt. ref. index/strain  0\n",
      "        thermal conduct.  lambda T: 5.720000 W/(m K)\n",
      "linear thermal expansion  lambda T: 0.000010\n",
      "           heat capacity  lambda T: 455.2 + 0.112*T - 2.1935e6/T**2 J/(kg K)\n",
      "      subsystem coupling  lambda T: 0.000000 W/m³\n",
      "========================  ==================================================\n",
      "\n",
      "5 Constituents:\n",
      "=========  ==========  ======================================  =======  ===========  =========  ===========\n",
      "atom         position  position function                       magn.      amplitude    phi [°]    gamma [°]\n",
      "=========  ==========  ======================================  =======  ===========  =========  ===========\n",
      "Oxygen            0    lambda strain: 0.000000e+00*(strain+1)                     0          0            0\n",
      "Strontium         0    lambda strain: 0.000000e+00*(strain+1)                     0          0            0\n",
      "Oxygen            0.5  lambda strain: 5.000000e-01*(strain+1)                     0          0            0\n",
      "Oxygen            0.5  lambda strain: 5.000000e-01*(strain+1)                     0          0            0\n",
      "Ruthenium         0.5  lambda strain: 5.000000e-01*(strain+1)                     0          0            0\n",
      "=========  ==========  ======================================  =======  ===========  =========  ===========\n"
     ]
    }
   ],
   "source": [
    "# c-axis lattice constants of the two layers\n",
    "c_STO_sub = 3.905*u.angstrom\n",
    "c_SRO = 3.94897*u.angstrom\n",
    "# sound velocities [nm/ps] of the two layers\n",
    "sv_SRO = 6.312*u.nm/u.ps\n",
    "sv_STO = 7.800*u.nm/u.ps\n",
    "\n",
    "# SRO layer\n",
    "prop_SRO = {}\n",
    "prop_SRO['a_axis'] = c_STO_sub # aAxis\n",
    "prop_SRO['b_axis'] = c_STO_sub # bAxis\n",
    "prop_SRO['deb_Wal_Fac'] = 0 # Debye-Waller factor\n",
    "prop_SRO['sound_vel'] = sv_SRO # sound velocity\n",
    "prop_SRO['opt_ref_index'] = 2.44+4.32j\n",
    "prop_SRO['therm_cond'] = 5.72*u.W/(u.m *u.K) # heat conductivity\n",
    "prop_SRO['lin_therm_exp'] = 1.03e-5 # linear thermal expansion\n",
    "prop_SRO['heat_capacity'] = 'lambda T: 455.2 + 0.112*T - 2.1935e6/T**2' # heat capacity [J/kg K]\n",
    "\n",
    "SRO = ud.UnitCell('SRO', 'Strontium Ruthenate', c_SRO, **prop_SRO)\n",
    "SRO.add_atom(O, 0)\n",
    "SRO.add_atom(Sr, 0)\n",
    "SRO.add_atom(O, 0.5)\n",
    "SRO.add_atom(O, 0.5)\n",
    "SRO.add_atom(Ru, 0.5)\n",
    "\n",
    "print(SRO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Non-Linear Strain Dependence\n",
    "In general the position of each atom in a unit cell depends linearly from an external strain.\n",
    "In some cases this linear behavior has to be altered.\n",
    "This can be easily achieved by providing a string representation of a strain-dependent _lambda_-function for the atom position when the atom is added to the unit cell."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Unit Cell with the following properties\n",
      "\n",
      "========================  ===================================================\n",
      "               parameter  value\n",
      "========================  ===================================================\n",
      "                      id  STOsub\n",
      "                    name  Strontium Titanate Substrate\n",
      "                  a-axis  0.3905 nm\n",
      "                  b-axis  0.3905 nm\n",
      "                  c-axis  0.3905 nm\n",
      "                    area  0.1525 nm²\n",
      "                  volume  0.05955 nm³\n",
      "                    mass  3.047×10⁻²⁵ kg\n",
      "      mass per unit area  1.998×10⁻²⁶ kg\n",
      "                    area  0.1525 nm²\n",
      "                  volume  0.05955 nm³\n",
      "                    mass  3.046843427429143×10⁻²⁵ kg\n",
      "      mass per unit area  1.9980578610298977×10⁻²⁶ kg\n",
      "                 density  5.117×10³ kg/m³\n",
      "               roughness  0.0 nm\n",
      "     Debye Waller Factor  0 m²\n",
      "          sound velocity  7.8×10³ m/s\n",
      "         spring constant  [7.0] kg/s²\n",
      "          phonon damping  0.0 kg/s\n",
      "         opt. pen. depth  0.0 nm\n",
      "   opt. refractive index  (2.1+0j)\n",
      "  opt. ref. index/strain  0\n",
      "        thermal conduct.  lambda T: 12.000000 W/(m K)\n",
      "linear thermal expansion  lambda T: 0.000010\n",
      "           heat capacity  lambda T: 733.73 + 0.0248*T - 6.531e6/T**2 J/(kg K)\n",
      "      subsystem coupling  lambda T: 0.000000 W/m³\n",
      "========================  ===================================================\n",
      "\n",
      "5 Constituents:\n",
      "=========  ==========  ======================================  =======  ===========  =========  ===========\n",
      "atom         position  position function                       magn.      amplitude    phi [°]    gamma [°]\n",
      "=========  ==========  ======================================  =======  ===========  =========  ===========\n",
      "Strontium         0    lambda strain: 0.000000e+00*(strain+1)                     0          0            0\n",
      "Oxygen            0.1  lambda strain: 0.1*(strain**2+1)                           0          0            0\n",
      "Oxygen            0.5  lambda strain: 5.000000e-01*(strain+1)                     0          0            0\n",
      "Oxygen            0.5  lambda strain: 5.000000e-01*(strain+1)                     0          0            0\n",
      "Titanium          0.5  lambda strain: 5.000000e-01*(strain+1)                     0          0            0\n",
      "=========  ==========  ======================================  =======  ===========  =========  ===========\n"
     ]
    }
   ],
   "source": [
    "# STO substrate\n",
    "prop_STO_sub = {}\n",
    "prop_STO_sub['a_axis'] = c_STO_sub # aAxis\n",
    "prop_STO_sub['b_axis'] = c_STO_sub # bAxis\n",
    "prop_STO_sub['deb_Wal_Fac'] = 0 # Debye-Waller factor\n",
    "prop_STO_sub['sound_vel'] = sv_STO # sound velocity\n",
    "prop_STO_sub['opt_ref_index'] = 2.1+0j\n",
    "prop_STO_sub['therm_cond'] = 12*u.W/(u.m *u.K) # heat conductivity\n",
    "prop_STO_sub['lin_therm_exp'] = 1e-5 # linear thermal expansion\n",
    "prop_STO_sub['heat_capacity'] = 'lambda T: 733.73 + 0.0248*T - 6.531e6/T**2' # heat capacity [J/kg K]\n",
    "    \n",
    "STO_sub = ud.UnitCell('STOsub', 'Strontium Titanate Substrate', c_STO_sub, **prop_STO_sub)\n",
    "STO_sub.add_atom(O, 'lambda strain: 0.1*(strain**2+1)')\n",
    "STO_sub.add_atom(Sr, 0)\n",
    "STO_sub.add_atom(O, 0.5)\n",
    "STO_sub.add_atom(O, 0.5)\n",
    "STO_sub.add_atom(Ti, 0.5)\n",
    "\n",
    "print(STO_sub)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A simple visualization is also available:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "SRO.visualize()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Structure\n",
    "\n",
    "The `AmorphousLayer` and `UnitCell` can now be added to an actual structure:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Structure properties:\n",
      "\n",
      "Name   : Single Layer\n",
      "Thickness : 429.99 nanometer\n",
      "Roughness : 0.00 nanometer\n",
      "----\n",
      "100 times Strontium Ruthenate: 39.49 nanometer\n",
      "1000 times Strontium Titanate Substrate: 390.50 nanometer\n",
      "----\n",
      "no substrate\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1440x72 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "S = ud.Structure('Single Layer')\n",
    "S.add_sub_structure(SRO, 100) # add 100 layers of SRO to sample\n",
    "S.add_sub_structure(STO_sub, 1000) # add 1000 layers of STO substrate\n",
    "\n",
    "print(S)\n",
    "\n",
    "S.visualize()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are various methods available to determine specific properties of a `Structure`, please also refer to the __API documentation__ for more details:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "[d_start, d_end, d_mid] = S.get_distances_of_layers() \n",
    "K = S.get_number_of_sub_structures()\n",
    "L = S.get_number_of_unique_layers()\n",
    "M = S.get_number_of_layers()\n",
    "P = S.get_all_positions_per_unique_layer()\n",
    "I = S.get_distances_of_interfaces()\n",
    "c_axis = S.get_layer_property_vector('c_axis')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `Structure` class also allows to nest multiple substructures in order to build more complex samples easily:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Structure properties:\n",
      "\n",
      "Name   : Super Lattice\n",
      "Thickness : 332.58 nanometer\n",
      "Roughness : 0.00 nanometer\n",
      "----\n",
      "sub-structure 10 times:\n",
      "\tStructure properties:\n",
      "\n",
      "\tName   : Double Layer\n",
      "\tThickness : 13.73 nanometer\n",
      "\tRoughness : 0.00 nanometer\n",
      "\t----\n",
      "\t15 times Strontium Ruthenate: 5.92 nanometer\n",
      "\t20 times Strontium Titanate Substrate: 7.81 nanometer\n",
      "\t----\n",
      "\tno substrate\n",
      "500 times Strontium Titanate Substrate: 195.25 nanometer\n",
      "----\n",
      "no substrate\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1440x72 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "S2 = ud.Structure('Super Lattice')\n",
    "# define a single double layer\n",
    "DL = ud.Structure('Double Layer')\n",
    "DL.add_sub_structure(SRO, 15)  # add 15 layers of SRO\n",
    "DL.add_sub_structure(STO_sub, 20)  # add 20 layers of STO substrate\n",
    "\n",
    "# add the double layer to the super lattice\n",
    "S2.add_sub_structure(DL, 10)  # add 10 double layers to super lattice\n",
    "S2.add_sub_structure(STO_sub,500)  # add 500 layers of STO substrate\n",
    "\n",
    "print(S2)\n",
    "\n",
    "S2.visualize()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There a few more interfaces than before (includes also the top and bottom interface):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "21\n"
     ]
    }
   ],
   "source": [
    "I2 = S2.get_distances_of_interfaces();\n",
    "print(len(I2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Static Substrate"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Mainly for X-ray scattering simulations it might be helpful to add a `static` substrate to the structure, which is not included in the `dynamic` simulations of `heat`, `phonons`, and `magnetization`.\n",
    "Hence the simulation time can be kept short while the scattering result include thick substrate contributions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Structure properties:\n",
      "\n",
      "Name   : Super Lattice\n",
      "Thickness : 332.58 nanometer\n",
      "Roughness : 0.00 nanometer\n",
      "----\n",
      "sub-structure 10 times:\n",
      "\tStructure properties:\n",
      "\n",
      "\tName   : Double Layer\n",
      "\tThickness : 13.73 nanometer\n",
      "\tRoughness : 0.00 nanometer\n",
      "\t----\n",
      "\t15 times Strontium Ruthenate: 5.92 nanometer\n",
      "\t20 times Strontium Titanate Substrate: 7.81 nanometer\n",
      "\t----\n",
      "\tno substrate\n",
      "500 times Strontium Titanate Substrate: 195.25 nanometer\n",
      "----\n",
      "Substrate:\n",
      "----\n",
      "1000000 times Strontium Titanate Substrate: 390500.00 nanometer\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1440x72 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "substrate = ud.Structure('Static Substrate')\n",
    "substrate.add_sub_structure(STO_sub, 1000000)\n",
    "\n",
    "S2.add_substrate(substrate)\n",
    "\n",
    "print(S2)\n",
    "\n",
    "S2.visualize()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
