diff --git a/docs/applications/cylinder_configurations.ipynb b/docs/applications/cylinder_configurations.ipynb index 936fae2e..bea5692b 100644 --- a/docs/applications/cylinder_configurations.ipynb +++ b/docs/applications/cylinder_configurations.ipynb @@ -1,48 +1,40 @@ { "cells": [ { - "cell_type": "code", - "execution_count": 9, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "plt.rcParams['figure.figsize'] = (3, 3)\n", - "\n", - "from matscipy.dislocation import get_elastic_constants, plot_vitek\n", - "\n", - "from ase.optimize.precon import PreconLBFGS\n", + "# Building cylindrical configurations with dislocations\n", "\n", - "# interactive visualisation inside the notebook\n", - "from nglview import show_ase\n", - "def interactive_view(system, scale=0.5):\n", - " view = show_ase(system)\n", - " view._remove_representation()\n", - " view.add_unitcell()\n", - " view.add_spacefill()\n", - " view.update_spacefill(radiusType='covalent',\n", - " radiusScale=scale)\n", + "![](dislocation_cylinder.png)\n", "\n", - " view.camera = 'orthographic'\n", - " view.parameters = {\"clipDist\": 0}\n", + "The `matscipy.dislocation` provides a set of tools to create atomistic configurations containing dislocations. In this example we focus on cylindrical configurations. In order to create a dislocation we start with a cylinder of bulk material oriented along the vector of the future dislocation line $\\vec l$. By convention assumed in `matscipy.dislocation` Z direction of the cell always corresponds to the dislocation line $\\vec l$. Then a displacement field is applied to the cylinder and outer radial shell is fixed in order to stabilise the configuration. So we end up with periodic boundary conditions along the dislocation line (Z) and fixed boundaries along X and Y directions. As shown on the figure above, screw dislocations are characterised by a displacement with corresponding burgers vector $\\vec b$ parallel to the dislocation line $\\vec l$, while edge dislocations have the burgers vector $\\vec b$ perpendicular to $\\vec l$. `matscipy` uses an anisotropic solution within [Stroh formalism](https://doi.org/10.1080/14786435808565804) to generate displacement field as implemented in [atomman](https://www.ctcms.nist.gov/potentials/atomman/) package.\n", "\n", - " view.center()\n", - " view._remote_call(\"setSize\", target=\"Widget\", args=[\"300px\", \"300px\"])\n", - " return view\n" + "For the interactive visualisation of the structures we will use [nglview](https://nglviewer.org/nglview/latest/) which allows viewing atomistic structures interactively within an IPython/Jupyter notebooks. We will also color atoms according to the crystallographic structure identified by [Common Neighbour Analysis algoritm](https://www.ovito.org/docs/current/reference/pipelines/modifiers/common_neighbor_analysis.html) and its [extention for diamond structure](https://www.ovito.org/docs/current/reference/pipelines/modifiers/identify_diamond.html) implemented in [OVITO](https://www.ovito.org/docs/current/introduction.html) package. [OVITO](https://www.ovito.org/docs/current/introduction.html), [atomman](https://www.ctcms.nist.gov/potentials/atomman/) and [nglview](https://nglviewer.org/nglview/latest/) are not part of the default dependencies of `matscipy` and require separate installation. Keep that in mind while running these examples as well test in [`test_dislocation.py`](https://github.com/libAtoms/matscipy/blob/master/tests/test_dislocation.py) since the majority of the tests there require this modules and thus will be skipped if the modules are not found in your system. Please note that for this example we use very small systems (small radius). For production calculations one should do a convergence tests with the system size in order to ensure that fixed boundaries do not affect the studied properties." ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 1, "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "928a58090bfa46b29cf864362bcbfdc9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "# Building cylindrical configurations with dislocations\n", - "\n", - "![](dislocation_cylinder.png)\n", - "\n", - "The `matscipy.dislocation` provides a set of tools to create atomistic configurations containing dislocations. In this example we focus on cylindrical configurations. In order to create a dislocation we start with a cylinder of bulk material oriented along the vector of the future dislocation line $\\vec l$. By convention assumed in `matscipy.dislocation` Z direction of the cell always corresponds to the dislocation line $\\vec l$. Then a displacement field is applied to the cylinder and outer radial shell is fixed in order to stabilise the configuration. So we end up with periodic boundary conditions along the dislocation line (Z) and fixed boundaries along X and Y directions. \n", - "\n", - "Ase shown on the figure above, screw dislocations are characterised by a displacement with corresponding burgers vector $\\vec b$ parallel to the dislocation line $\\vec l$, while edge dislocations have the burgers vector $\\vec b$ perpendicular to $\\vec l$. Here we use an anisotrpoic solution within [Stroh formalism](https://doi.org/10.1080/14786435808565804) to generate displacement field as implemented in [atomman](https://www.ctcms.nist.gov/potentials/atomman/) package. Please note that for this example we use very small systems (small radius). For production calculations one should do a convergence tests with the system size in order to ensure that fixed boundaries do not affect the studied properties.\n" + "import numpy as np\n", + "import nglview # this import is necessary for rendering of the 3D view\n", + "from visualisation import show_dislocation" ] }, { @@ -51,12 +43,12 @@ "source": [ "## Body Centered Cubic \n", "\n", - "Here we will use tungsten as an example BCC material. We need lattice parameter $a_0$ and elastic constants $C_{11}$, $C_{12}$ and $C_{44}$ to create dislocation configuration. For the case of _ab initio_ calculation one can provide corresponding values directly. For much faster calculations based on interatomic potentials `matscipy.dislocation` provides a convenient method `get_elastic_constants` to calculate desired properties. We will use and Embedded Atom Potential from [Marinica _et. al._ 2013 paper](http://dx.doi.org/10.1088/0953-8984/25/39/395502) (version EAM4) for the case of tungsten." + "For the case of BCC structure we take tungsten as an example. In order to create a dislocation configuration one has to provide lattice parameter and elastic constants. It is possible to provide these values from literature. However, if you plan to relax the configuration with an interatomic potential, `matscipy.dislocation` provides a convenient method `get_elastic_constants` to calculate desired properties. We will use and Embedded Atom Potential from [Marinica _et. al._ 2013 paper](http://dx.doi.org/10.1088/0953-8984/25/39/395502) (version EAM4) for the case of tungsten." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": { "tags": [ "hide-output" @@ -69,82 +61,87 @@ "text": [ " Step Time Energy fmax\n", "*Force-consistent energies used in optimization.\n", - "FIRE: 0 23:55:43 -8.896394* 0.7808\n", - "FIRE: 1 23:55:43 -8.899920* 0.1160\n", - "FIRE: 2 23:55:43 -8.897214* 0.7321\n", - "FIRE: 3 23:55:43 -8.898398* 0.5505\n", - "FIRE: 4 23:55:43 -8.899676* 0.2427\n", - "FIRE: 5 23:55:43 -8.899933* 0.1055\n", - "FIRE: 6 23:55:43 -8.899940* 0.0997\n", - "FIRE: 7 23:55:43 -8.899952* 0.0883\n", - "FIRE: 8 23:55:43 -8.899967* 0.0719\n", - "FIRE: 9 23:55:43 -8.899981* 0.0515\n", - "FIRE: 10 23:55:43 -8.899991* 0.0281\n", - "FIRE: 11 23:55:43 -8.899996* 0.0030\n", - "FIRE: 12 23:55:43 -8.899993* 0.0223\n", - "FIRE: 13 23:55:43 -8.899993* 0.0220\n", - "FIRE: 14 23:55:43 -8.899993* 0.0214\n", - "FIRE: 15 23:55:44 -8.899993* 0.0204\n", - "FIRE: 16 23:55:44 -8.899994* 0.0192\n", - "FIRE: 17 23:55:44 -8.899994* 0.0177\n", - "FIRE: 18 23:55:44 -8.899994* 0.0160\n", - "FIRE: 19 23:55:44 -8.899995* 0.0140\n", - "FIRE: 20 23:55:44 -8.899995* 0.0116\n", - "FIRE: 21 23:55:44 -8.899995* 0.0087\n", - "FIRE: 22 23:55:44 -8.899996* 0.0053\n", - "FIRE: 23 23:55:44 -8.899996* 0.0015\n", - "FIRE: 24 23:55:44 -8.899996* 0.0029\n", - "FIRE: 25 23:55:44 -8.899996* 0.0028\n", - "FIRE: 26 23:55:44 -8.899996* 0.0028\n", - "FIRE: 27 23:55:44 -8.899996* 0.0027\n", - "FIRE: 28 23:55:44 -8.899996* 0.0026\n", - "FIRE: 29 23:55:44 -8.899996* 0.0025\n", - "FIRE: 30 23:55:44 -8.899996* 0.0023\n", - "FIRE: 31 23:55:44 -8.899996* 0.0022\n", - "FIRE: 32 23:55:44 -8.899996* 0.0020\n", - "FIRE: 33 23:55:44 -8.899996* 0.0017\n", - "FIRE: 34 23:55:44 -8.899996* 0.0014\n", - "FIRE: 35 23:55:44 -8.899996* 0.0010\n", - "FIRE: 36 23:55:44 -8.899996* 0.0006\n", - "FIRE: 37 23:55:44 -8.899996* 0.0001\n", + "FIRE: 0 15:29:59 -17.792788* 1.5616\n", + "FIRE: 1 15:29:59 -17.796007* 1.2330\n", + "FIRE: 2 15:29:59 -17.798904* 0.6354\n", + "FIRE: 3 15:29:59 -17.799853* 0.2223\n", + "FIRE: 4 15:29:59 -17.799882* 0.1976\n", + "FIRE: 5 15:29:59 -17.799928* 0.1509\n", + "FIRE: 6 15:29:59 -17.799970* 0.0870\n", + "FIRE: 7 15:29:59 -17.799991* 0.0130\n", + "FIRE: 8 15:29:59 -17.799981* 0.0629\n", + "FIRE: 9 15:29:59 -17.799981* 0.0611\n", + "FIRE: 10 15:29:59 -17.799982* 0.0576\n", + "FIRE: 11 15:29:59 -17.799984* 0.0525\n", + "FIRE: 12 15:29:59 -17.799986* 0.0458\n", + "FIRE: 13 15:29:59 -17.799988* 0.0379\n", + "FIRE: 14 15:29:59 -17.799989* 0.0289\n", + "FIRE: 15 15:29:59 -17.799991* 0.0191\n", + "FIRE: 16 15:29:59 -17.799991* 0.0076\n", + "FIRE: 17 15:29:59 -17.799992* 0.0052\n", + "FIRE: 18 15:29:59 -17.799992* 0.0052\n", + "FIRE: 19 15:29:59 -17.799992* 0.0051\n", + "FIRE: 20 15:29:59 -17.799992* 0.0049\n", + "FIRE: 21 15:29:59 -17.799992* 0.0047\n", + "FIRE: 22 15:29:59 -17.799992* 0.0044\n", + "FIRE: 23 15:29:59 -17.799992* 0.0041\n", + "FIRE: 24 15:29:59 -17.799992* 0.0038\n", + "FIRE: 25 15:29:59 -17.799992* 0.0034\n", + "FIRE: 26 15:29:59 -17.799992* 0.0028\n", + "FIRE: 27 15:29:59 -17.799992* 0.0022\n", + "FIRE: 28 15:29:59 -17.799992* 0.0015\n", + "FIRE: 29 15:29:59 -17.799992* 0.0006\n", + "FIRE: 30 15:30:00 -17.799992* 0.0003\n", + "FIRE: 31 15:30:00 -17.799992* 0.0003\n", + "FIRE: 32 15:30:00 -17.799992* 0.0003\n", + "FIRE: 33 15:30:00 -17.799992* 0.0003\n", + "FIRE: 34 15:30:00 -17.799992* 0.0003\n", + "FIRE: 35 15:30:00 -17.799992* 0.0003\n", + "FIRE: 36 15:30:00 -17.799992* 0.0003\n", + "FIRE: 37 15:30:00 -17.799992* 0.0003\n", + "FIRE: 38 15:30:00 -17.799992* 0.0002\n", + "FIRE: 39 15:30:00 -17.799992* 0.0002\n", + "FIRE: 40 15:30:00 -17.799992* 0.0002\n", + "FIRE: 41 15:30:00 -17.799992* 0.0001\n", + "FIRE: 42 15:30:00 -17.799992* 0.0001\n", "Fitting C_11\n", "Strain array([-0.02, -0.01, 0. , 0.01, 0.02])\n", - "Stress array([-1.18132438e+01, -5.57640625e+00, 5.16699364e-04, 4.98363138e+00,\n", - " 9.85155622e+00]) GPa\n", - "Cij (gradient) / GPa : 538.8963758636845\n", - "Error in Cij / GPa : 16.5825717045366\n", - "Correlation coefficient : 0.9985827043591162\n", - "Setting C11 (1) to 3.363527 +/- 0.103500\n", + "Stress array([-1.18143011e+01, -5.57729763e+00, -2.88261126e-04, 4.98286691e+00,\n", + " 9.85079614e+00]) GPa\n", + "Cij (gradient) / GPa : 538.9035896451805\n", + "Error in Cij / GPa : 16.584381718776033\n", + "Correlation coefficient : 0.9985824334709763\n", + "Setting C11 (1) to 3.363572 +/- 0.103512\n", "\n", "\n", "Fitting C_21\n", "Strain array([-0.02, -0.01, 0. , 0.01, 0.02])\n", - "Stress array([-5.18065223e+00, -2.29474891e+00, 5.16699364e-04, 1.85231305e+00,\n", - " 3.74210436e+00]) GPa\n", - "Cij (gradient) / GPa : 219.92575154543857\n", - "Error in Cij / GPa : 12.448181242736544\n", - "Correlation coefficient : 0.9952287298127411\n", - "Setting C21 (7) to 1.372669 +/- 0.077695\n", + "Stress array([-5.18171556e+00, -2.29563243e+00, -2.88261126e-04, 1.85153957e+00,\n", + " 3.74132626e+00]) GPa\n", + "Cij (gradient) / GPa : 219.93255649330877\n", + "Error in Cij / GPa : 12.450223131451542\n", + "Correlation coefficient : 0.9952274688373499\n", + "Setting C21 (7) to 1.372711 +/- 0.077708\n", "\n", "\n", "Fitting C_31\n", "Strain array([-0.02, -0.01, 0. , 0.01, 0.02])\n", - "Stress array([-5.18065223e+00, -2.29474891e+00, 5.16699364e-04, 1.85231305e+00,\n", - " 3.74210436e+00]) GPa\n", - "Cij (gradient) / GPa : 219.92575154543883\n", - "Error in Cij / GPa : 12.44818124273641\n", - "Correlation coefficient : 0.9952287298127412\n", - "Updating C31 (7) with value 1.372669 +/- 0.077695\n", + "Stress array([-5.18171556e+00, -2.29563243e+00, -2.88261126e-04, 1.85153957e+00,\n", + " 3.74132626e+00]) GPa\n", + "Cij (gradient) / GPa : 219.93255649330868\n", + "Error in Cij / GPa : 12.450223131451247\n", + "Correlation coefficient : 0.9952274688373501\n", + "Updating C31 (7) with value 1.372711 +/- 0.077708\n", "\n", "\n", "Fitting C_44\n", "Strain array([-0.02, -0.01, 0. , 0.01, 0.02])\n", - "Stress array([-4.37402918e+00, -1.88648042e+00, -4.92161680e-16, 1.43561482e+00,\n", - " 2.90478275e+00]) GPa\n", - "Cij (gradient) / GPa : 178.79719102977347\n", - "Error in Cij / GPa : 12.700273290907242\n", - "Correlation coefficient : 0.9925165888430469\n", - "Setting C44 (4) to 1.115964 +/- 0.079269\n", + "Stress array([-4.37426370e+00, -1.88654647e+00, 9.30635418e-15, 1.43563268e+00,\n", + " 2.90478138e+00]) GPa\n", + "Cij (gradient) / GPa : 178.80269302570218\n", + "Error in Cij / GPa : 12.702352202927047\n", + "Correlation coefficient : 0.9925146216927534\n", + "Setting C44 (4) to 1.115999 +/- 0.079282\n", "\n", "\n", "[[b C11 b C12 b C12 b b b ]\n", @@ -169,6 +166,7 @@ } ], "source": [ + "from matscipy.dislocation import get_elastic_constants\n", "# the calculator to provide forces and energies from the potential\n", "from matscipy.calculators.eam import EAM\n", "eam_calc = EAM(\"../../tests/w_eam4.fs\")\n", @@ -179,7 +177,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -212,7 +210,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -224,7 +222,7 @@ " [-1 1 0]\n", " [ 1 1 1]]\n", "Burgers vector:\n", - "[1.57169589 1.57169589 1.57169589]\n" + "[1.57169453 1.57169453 1.57169453]\n" ] } ], @@ -244,79 +242,62 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We are going to use `BCCScrew111Dislocation.build_cylinder()` method to build the cells. All the necessary parameters are passed automatically and we only need to chose the radius of the cell in (X,Y) plane. The function returns reference bulk cell and a cell containing dislocation. The displacement field is applied iteratively untill a converged value is achieved, the printed output prints the difference between the steps. The radius provided is a parameter is a radius of unconstrained region around the core. The outer shell of fixed atoms is added on top of this. The default value is 10 Angstom which is about two times larger than a cutoff for the used interatomic potential." + "We are going to use `BCCScrew111Dislocation.build_cylinder()` method to build the cells. All the necessary parameters are passed automatically and we only need to chose the radius of the cell in (X,Y) plane. The function returns reference bulk cell and a cell containing dislocation. The displacement field is applied iteratively until a converged value is achieved, the printed output shows the difference between the steps. The radius provided is a parameter is a radius of unconstrained region around the core. The outer shell of fixed atoms is added on top of this. The default value is 10 Angstrom which is about two times larger than the cutoff for the used interatomic potential. The information about which atoms are fixed is stored in `fix_mask` array and can be accessed via `W_screw_dislo.get_array('fix_mask')`." ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "disloc SCF 0 |d1-d2|_inf = 0.0014003702928255812\n", - "disloc SCF 1 |d1-d2|_inf = 6.701013134463585e-06\n", - "disloc SCF 2 |d1-d2|_inf = 3.20650794805033e-08\n", + "disloc SCF 0 |d1-d2|_inf = 0.001400723332078968\n", + "disloc SCF 1 |d1-d2|_inf = 6.704394990092455e-06\n", + "disloc SCF 2 |d1-d2|_inf = 3.2089362583809233e-08\n", "\n", "Cell vectors:\n", - "[[61.59764738 0. 0. ]\n", - " [ 0. 62.23598202 0. ]\n", - " [ 0. 0. 2.72225714]]\n", + "[[61.59759392 0. 0. ]\n", + " [ 0. 62.235928 0. ]\n", + " [ 0. 0. 2.72225477]]\n", "\n", - "Burgers vector lenth:\n", - "2.7222571354952314\n" + "Burgers vector lenth: 2.72 Angstrom\n" ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "057baee8a8ef4f0f85467388a358526d", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "NGLWidget()" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ "W_screw_bulk, W_screw_dislo = W_screw.build_cylinder(radius=20)\n", "\n", - "interactive_view(W_screw_dislo)\n", - "\n", "print(\"\\nCell vectors:\")\n", "print(W_screw_dislo.cell.array)\n", "\n", - "print(\"\\nBurgers vector lenth:\")\n", - "print(np.linalg.norm(W_screw.burgers))\n", - "\n", - "interactive_view(W_screw_dislo)" + "print(f\"\\nBurgers vector lenth: {np.linalg.norm(W_screw.burgers):.2f} Angstrom\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ + "Now we can look at the created structure with the interactive view. Hovering your mouse over an atom will show chemical symbol of the atom and the structure identified by CNA algorithm. Dislocation is shown with an arrow corresponding to the dislocation line vector $\\vec l$. Hovering over the dislocation will display the dislocation name. Moreover, you can use your mouse to control the view:\n", "\n", - "Here we have a cell with $|\\vec b| = \\frac{\\sqrt{3}}{2}a_0$ length along the dislocation line. With a periodic conditions along Z it corresponds to infinitely long straight dislocation line. Note that the periodic boundary conditions along the dislocation line are not applied in the visualisation. It makes it easier to see the displecement, but you might notice the atoms outside the simulation box. \n", - "\n", - "To increase the size of the cell along the line we can rely on the magic of [ASE](https://wiki.fysik.dtu.dk/ase/) and simply multiply the cell." + "- Translation: right click + drag\n", + "- Rotation: left click + drag\n", + "- Z-axis rotation: Ctrl + right click + drag\n", + "- Zoom: scroll wheel\n", + "- Center view: left click on the desired atom" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "208fa7ae550641b9a77071ce4cd9293d", + "model_id": "df6d21351f824d99bd4ec008cc1417bc", "version_major": 2, "version_minor": 0 }, @@ -329,136 +310,59 @@ } ], "source": [ - "interactive_view(W_screw_dislo * [1, 1, 10])" + "show_dislocation(W_screw_dislo, d_name=\"1/2<111> screw\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Since fo screw dislocations the displacement is parallel to the dislocation line, it is not easy to see the displacement without 3D tools. Thus so-called differential displacement (Vitek) maps are used to visualise the dislocation core. `matscipy.dislocation` offers a tool called {py:meth}`matscipy.dislocation.plot_vitek` to build these maps. The colors of the atoms represent three non equivalen planes of W atoms along <111> direction and the arrows represent the difference in displacement of atoms along Z direction. The visualisation below shows so-called compact and symmetric core, which is the most stable for BCC materials. " + "It can be seen that most of the cell is identified as BCC structure with some grey atoms identified as _Other_. These atoms represent the defect atoms, where the algorithm could not assign a crystallographic structure. In this case we have defect atoms at the dislocation core and on the artificial free surfaces on the edges of the cell. The atoms at the _surface_ are part of fixed region of the cell. \n", + "\n", + "Here we have a cell with the length of one Burgers vector $|\\vec b| = \\frac{\\sqrt{3}}{2}a_0$ along the dislocation line. With the periodic boundary conditions along Z, it corresponds to infinitely long straight dislocation line. Note that the periodic boundary conditions along the dislocation line are not applied in the visualisation. It makes it easier to see the displacement, but you might notice the atoms outside the simulation box. \n", + "\n", + "To increase the size of the cell along the line we can rely on the magic of [ASE](https://wiki.fysik.dtu.dk/ase/) and simply multiply the cell." ] }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAANkAAADYCAYAAABm4kbTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAzEUlEQVR4nO2dd3xUZfb/PyeTNjPpBAKEklAMSu8i8JWyLihNFssWsK6sZQUVK7qsLupiARdXcHEBsWFZRBBYRNAEf6wIkgABpEkJECI1IYW0mfn8/pgbSEJmMuXeTALP+/V6XjNzy3k+mcy55bnPOUdIQqFQGEdQoAUoFJc7yskUCoNRTqZQGIxyMoXCYJSTKRQGo5xMoTCYOncyEQkXkc0isl1EdonIC5XWPSwie7Xlr9a1NoXCCIID0GcpgCEkC0UkBMAGEVkNwAxgDIAuJEtFpEkAtCkUulPnTkbn0+9C7WOI1gjgAQAzSJZq252szVZ8fDyTkpIMUuoam82G4OBAHJ8U7iAJEQlI3+np6adJNq5xJck6bwBMALbB6WyvaMu2AXgBwCYA6wH0rs1Oz549Wdd88803zM/Pr/N+vWX9+vW62Tp06BAzMjJ0s2cUixYt4uHDhwPSN4AtdPE7DcjAB0k7yW4AWgDoIyKd4DyrxgK4FsATAD6TGg5LIjJRRLaIyJZTp0657KOkpAQ2m01X3YWFhXA4HIiMjNTNZnFxsW62KsjJyUF8fLxu9lq2bInTp0/rZq+CkpISXe1NmDAB27dv19UmABQUFPi1f0BHF0nmAUgDMBzAMQBLtQPDZgAOAJf8Uki+Q7IXyV6NG9d8dgaA8PBwlJWV6akVq1evxpAhQ3SzCTh16nkwIInvv/8e11xzjW42TSYTunXrhszMTN1sAkBQkL4/v6CgICQnJ+PgwYO62g0JCfFr/0CMLjYWkRjtvRnArwDsAbAMwBBt+VUAQgH4dfi0WCz+7F6FY8eOwWQy6f7DEBFd7+/Onj2Lzp0762avgsaNG8Nut+tqMzQ0VFd7ANC5c2fs3LlTV5vh4eF+7S+s41n4ItIFwHtw3pcFAfiM5N9EJBTAQgDdAJQBeJzkt+5s9erVi1u2bDFYsRMG8KZa4R1lZWWGOLA7RCSdZK+a1gVidDETQPcalpcBGF/XejxFOVjDoa4drDbUjA+FwmCUkykUBqOcTKEwGOVkCoXBKCdTKAxGOZlCYTDKyRQKg1FOplAYjHIyhcJgrlgnKyoqwltvzUFKSm/ExbVA+/Y98Y9/zPZ7xrXenD59Gi9Pn47ObZLQIj4OA3t0xXvvvafr5Gc9yMrKwqNPPYbmKS0Q17IR+g8fgGXLlsHhcARaWhV27tyJO+74E5o0aYP4+Na46aZbsX79emM7dRUD0xCar/FkJ0+eZJs2nRlhHc3goLUMMR1hcNC3jLDewlatOjA7O9snu3qze/dutohvxHsSw/n91WBWF3B5O3BQEyv/r3dPFhYWBloiSTItLY0RjSMZ8lgssa0JcTiB+DCW1q7R/M0ffkObzRZoiSTJ99//kBZLE4aG/I0hpt0MMR1gsOktWq1JfPLJv/hlG27iyQLuKP40X51s0KCRDAt7iiEmB0ODWaWFhT7Pvn2G+GRXT+x2OzskteL8ZCF7o0qz9wInNA/nn+66I9AymZeXx8jGUcS6RgQTq7bzzWm5PoavvP5KoGVyz549tFgaM8S065L/eYjpFK3Wq7h8+XKf7btzsivucvHnn3/Gph82wWF7vsZJvw77VOzYsVv3cAlvWbt2LcyFZ3FPo0ujJIIEeL1JCT797DPk5uYGQN1F3v/gfdgHBwNDawgHMQvOvx6C1/85U/cwGW954425sNsmQuTSODuReJQUP48XX5xtSN9XXKKK9evXwxQ8HHZbzTFCIiGAjEZqaio6derkle3S0lJs2LABbdu2reLAcXFxXkdTp65bi7FhhXA1+b9JCNAjOgybNm3C8OHDPbabk5ODVatWoXXr1qgp6DUhIQHNmjXz2N6XqStw/lY34VK9QnHekY/Dhw+jbdu2HtsFgDNnziAzMxNt2rSpsjwxMdHrGLyvvkqF3f4uglx8n0EyFunpE+BwOHSPGbzinMx5ZjfVspFJ2847SkpKkJubi7Nnz1ZxMqvV6rWTkaxNJUwCr3Xm5+cjLy8PkZGRMJku7SEqKsoreySdQtxhEp++z4KCggvfZ2W8OQhUUPv/3biLuivOya677jrY7X8BWQZnnGhVSDtEVqJ//3u8th0dHY1bbrlFD5no/3/X4+8f/BtTUfNo51kbsDm3BL161Rgn6JKUlBSkpKToIREAMKz/r/H9igwU3+pig8xyhJYHw5esYklJST7tVxODBvXHJx+vANitxvXkSnTqdK3uZzHgChzCv+aaa9ClS0dI0Mwa10vQP9G2bSJ69uxZx8qqMmLECJwwWbCkhlsuEph2MhRjRo2q8ZKvLrn37nshq0qBTTU8UignzM+UYdL9Dwc8hd6UKQ8iOGQOyMOXrCPzEW55AVOnPmxM565GRBpC83V08ejRo2zWrC0t5jsZbNrCEFMBg01baTb/kY0bt+bBgwd9sqs36enpTIiJ4mMtQri7E1jQA/x/HcCbm5rZ4+oU5ubmBloiSXLlypW0NLbSND2GyEog8psRKxvRMiCGQ0YOZVlZWaAlkiRnz55DiyWRwaZ/MsR0giGmXJqCPmJEREf+8Y9/psPh8Nk21BD+pZw5c4bPPz+dTRPaMiTEzCZNkvnss3/lyZMnfbZpBFlZWXx88iQmNoqlJTSE1yS15BszZ9abZ2QV7Ny5k+Pvm8CI+EiGWsN4dZ9ruHDhQpaXlwdaWhU2bNjAm266lWZzDMPCItinz1B+8cUXfjkY6d7J6jyRjp7UZSIdhcId7hLpXHH3ZApFXaOcTKEwGJ+dTESsIlLboxyF4orHYycTkSAR+b2IrBKRk3Bm/c3Raom9JiLtjZOpUDRcvDmTpQJoC+AZAE1JtiTZBMBAAD8AmCEitSYndVcEUFv/uIhQRPSrmKBQBBBvnhD+imR59YUkzwL4HMDnWlG/2qixCCDJH0SkJYAbABzxQpdCUa/x+ExWk4NVUFFAwt02leyQZE1FAAHgDQBPVvqsUDR4aj2TiUhPACMBvAnADuAaAB0rtU4ALHDWFvMIbcAkHUA7AHNIbhKR0QCySW53l3deRCYCmAgArVq18rRLhSJgeHImmwdgJZyXcHsATIez8srPADoD6E7SYwcDaiwC2AXAswCmebCvR/XJGhqpqanYt29foGXUCRkZGfUufYKReOJk38NZ+TIDQDaAf5N8mORcAKX0oLazK3ixCOAYAMkAtovIYTidL0NEmvpquwK9C9cZgc1mw+rVq9G+/ZUxQJubm4sxY8YYUmVUb3755Re/bdTqZCQnAbiH5PUAhgG4VkQ2isiN8OHeyUURwK0km5BMIpkEZ9XNHiT9+gu3b9+uaxVLvcuvVvDuu+/i7rvv1qU809mzZ3H06FEdVF2KXtHi1157LRITE1FUVKSLveroGYU9depUnD9/3i8bHg18kDyvvZ4l+RiA3wL4PYAEERnkZZ/NAKSKSCaAHwGsJbnSSxu1QhJbt25Fjx49dLO5Z88e3WxVcPbsWZw4cQJXX321LvZiYmLwv//9TxdblcnNzdXtEs9qtWLWrFmYM2eOLvYqk5WVpWs525dffhlpaWl+2fBpxgfJLJITAPQH8LSIfOfFvpkku5PsQrITyb/VsE0SSb9K2a5ZswbDhg3zx8QlpKSkID09XVebc+fOxUMPPaSbvaCgIFx33XW63t85HA5kZGToesCKiopC69atdb+cz83N1fWyu2nTpigqKvLrrOvNjI9LrmVIbiM5HMBfXW0TCPbt24etW7f6FKbuDrPZjObNm+tmb+PGjWjatCliY70aN6qVVq1a4dixY7rZy8rKQkREhG72KpgwYQI+/PBD6BUJUlhYiHbt2uliqzJjxozB8uXLfd7fqxkfIvKwiFQZN9dqPQeJyHsA7vRZiY4UFhbi/vvvN8S2Xo5rs9kwatQoDB06VBd71Rk8eLButpKTk9G3b1/d7FVgMpkwevRoLFu2TBd7ERERhhwMQkNDkZiY6HPiW2+cbDicz8k+FpHjIvKTiBwEsB/Oe7Q3SC7ySYXO9OjRQ/ezg97s3bsXH374IZKTkw2xX08uKmplwIAB2LJlS70f0r/++uu9ToZUgU9Bm9p0qHgAxdowfEBoyEGbJBuMIxhNSUkJwsNrTtHXUHAXtOlTdhNt+lSOX6qucJSDXaShO1htqKBNhcJglJMpFAbj9eWiiIQBGAcgqfL+NT3vUigUvt2TLQdwDs5Z9KX6ylEoLj98cbIW2gNohULhAb7ck30vIp11V6JQXKb4ciYbAOAuETkE5+WiwBnw3EVXZQrFZYIvTnaj7iouI9LT0zH/gwU4fuo42rRog4l33afbDHu9IIlvv/0WH364BGfPFqBLl/aYOPEetGzZMtDSqmCz2fDll1/iv0uXoLS4GN379cedd9+NRo0aBVpaFWqNi3OVv7shtOjIyHqTE764uJg3jruJltaRDPpbDPF+LIOfiaU5wcK77r+r3tRNPnXqFLt2vY4RER1pCnqdpqD3aQ5/iOHhsZw+fUag5V1g//79vKpVC/ZvEsk5rcFFyeCERDNjLGYu/uijQMu7wPfff8/opjH6F5wA0BXAn7XW1RcberS4EOHto0fq/b35xG133U7zLbFEaXNWqZuc34yW62P4xHNPBFoiHQ4Hu3Xrz/CwKZfUyw4xZdNqTeHChYsCLZOFhYVMbpbAt2uol53ZEWwaaeH69esDLZNZWVmMaBxJ/LeRvk4GYDKAnQD+prUdAB721o4erYcFbGwN5759+wz4Cj0nKyuL4XFmoqAZLylOzkTiaFOaYy3Mz88PqM60tDRGRFxdY0H60GAy2PQdExOv8rvCib/8+9//5qhm1kscrKItSAJHDL4+oBpJ8pEnH2XoY7HO/7HOhdnvBdCX5DSS0wBcC+A+H+z4jQD4bYwdS5cuDUT3F1i2bBkw1gxEuPg6W5gQ3NeCtWvXemTPbrdjw4YNePrpp3HgwAHk5ubW2jzho4+WoKT4TpfzJgUDcO6c3eM0A6WlpVizZg2eeuopnDx5slaN+fn5Htld8t5C3GVxHST5u0bAtxv+Z1j6Ak9ZvGQxyu6qPdWoLwMfAmfISwV2bVlAiGc5Cs6d83n/zZs3XwhhSElJ8amcaWFhIcoau88rwXjxKB7JZrNh3rx5ePfdd5GRkYEjR47UWqUyNDQU8+fPr9V2Xl4hyMYu/1siguDgeI90nj9/HjNnzsTixYtx5MgR5OTUPl+8ZcuWeOmll2rdrjA/H43d/HbNQYA5xITz58/DarXWaq86586dw65duxAbG4uYmBifYwSLC4uBxpbaN3R1inPVADwGYDuA5wG8oL1/1Fs7erSeFvDGZhH84IMPdL8U8IYlS5Yw8vq4mi8VmUjYm9PaPoo//PCDV3azs7N57tw53XS++OLfabX8scZLRed92TmGh8fyl19+8cru/v37da2mec/vf8dXWgW5vFzc0wlsEh0Z8AKD3QZ2J5bG1Xq56NOPG0APAA8DmASgmy829GhXh4PxURE8f/687l+gN5SWljpHmP4XX7OTfRbHtl3bBfxeJycnh+HhMQwxHarZyYJf4o033hJQjSS5adMmtoqyMK/7pQ7m6AXe1SyUTz8+JdAy+eGHH9LaL4Yoa66PkwHYoL0WAMjXXitavqd29GwhQUH87NNPjfj+vObLL7+kuYmV+DTW+aUzkShuTrwTQ0t8BDdu3BhoiSTJmTNn02JJZnDQ2gsDICGmXIYET2dcXGK9qZf98J8msncjC3+85qKDHe8KPtg8hJ3aJdeLetnl5eUcPHIIzSMNGMKvL619+/a6fmn+8u2337LrgG40N7Ewqkccw+PM7D98ANPT0wMtrQqffPIpk5M702ptyejo7gwPj+GIEbfx0KFDgZZ2AYfDwTffeIOtE+LZLjaC3RpHMcYSzj/ddQfPnDkTaHkXKC0t5ZPPPaVvzWgReYXkU7Utqwvqa/qBw4cP49SpU2jevDkSExMDLadGSGLfvn0oKChAUlIS4uPrZ6Uqu92O3bt3o7S0FO3bt0dUVFSgJdWIu/QDvjhZBske1ZZl0sO5iyISDuA7AGFwjm4uIflXEXkNwCgAZQAOALibteQPqa9OVl85ceIEzGaz2x8qqXKP+IIuhdlF5AER2QEgRUQyK7VDALzJUFlRn6wrnIUrhovItQDWAuikOes+OIsNKnTkoYcewqBBg+DuwLpgwQLD0pFfqXjzUGgxnGeaL7XXitaTZK0VNivQLmUvqU9G8muSFYnrf4Cz6IRCJ1JTU/H555/j0UcfdXumOn36NEaOHInCwkKX2yi8xNXNmpENgAnANgCFAF6pYf0KAONrs9OzZ08/blmvHMrLy9mlSxf27duXdrvd7bYbNmwgAPbr169ejOA1FKDntCoRea+iKov2OVZEFnrp2NXrk3WqZO9ZADYAH7nof6KIbBGRLadOnfJW/hXJ/PnzkZmZidmzZ9c6o6VXr14ICwvDxo0bMWjQIJw86XNlLEUFrrzPVYOzzFGty7yw91cAj2vv7wSwEYDFk33Vmax2zp49y0aNGnHChAke7zNw4EDCWRaLV111FY8cOWKgwssD6DxBOEhELuTAFpE4eDEH0kV9sj0iMhzAUwBGUyvVdLmyefPmOhtceOGFF1BSUoK///3vHu8zYMAAhIQ4Jw8uWLCgTh5D+FsDrD7ji5PNBLBRRKaLyN/grMT5qhf7u6pP9haASABrRWSbiPzLB20NgqNHj2LWrFmG97N7927MmTMHU6dO9cpRBg4ciBUrVqB9+/aYNm2a4UP6Z86cwZQpUwztI6C4OsW5a3AWZ/8znPMXr/HFhh4tUJeLOTk53Llzp8/7OxwOjhw5kseOHdNR1aV9DBs2jElJSSwuLvZ6X5JcsWIFAXDp0qVGSCRJHj9+nB07duTkyZP9spOTk6OPIB+BzgMfAucE4TiS/wRQKCJ99HN7/znnR+iLJ7z99ttISkryeX8RwfTp0/Hcc8/pJ6oa//3vf7FmzRrMnDnT61zzFWeuESNGYNiwYZgyZYphl7dZWVnIy8vDwIED/bKzatUqQyp3VmC32ytOMF7jy+XiXAD9APxO+1wAwLi/zgf27NmDvXv3GmJ7y5Yt6NChg09xTJXp1q0bwsPD8cMPP+ik7CJlZWV49NFHMWjQIIwdO9ZnOyKCWbNm4ciRI3jjjTd0VHiRBQsWYNmyZRgxYoRfdgYMGIAlS5YYUoLJZrPhL3/5i++Xza5Oca4agAxWG1EEsN1bO3o0d5eL77//vm/nfTc4HA4+/vjjuoWsnDx5kr/+9a9rfXblLa+//jqDgoK4bds2XexNmjSJVquV2dnZutirYMuWLbz33nt1s5eRkWHI//3nn3/ml19+6XYb6JzjYxOcD5MrnK0x/BjC96e5c7KsrCympqa6//a85JNPPuHmzZt1tTlr1ixdfxgnTpxgVFQU77//ft1sVjwGuPPOO3Wz6XA4OHz4cN3vpaZNm6Z7LhVP/j96O9kf4JxadQzASwD2ArjVWzt6tNoGPubNm6dbfFRBQQGfe+45XWxVprS0lIMHD2ZBQYEu9u677z7GxMTw5MmTutirYO7cuQTATZs26WLv448/5owZ+qegO3HihK52v/vuO49+Q7o5GZzZIVoC6ADgIThHGK/2xoaerTYny8rK4po1a2r9gjyhX79+TEtL08VWdVatWsWpU6d6HfZfnYyMDIoI//GPf+ik7CLl5eXs3LmzR1OzaqOoqIiDBg1iSUmJTuqq8tZbb/HAgQN+27Hb7fz444892lbvM1m6t/sY1epqCP/UqVOcPHmy7vdOFWRnZ7Nly5Z88MEHfbbhcDg4cOBAdujQQdd8G5X55ptvCMDvnCrPP/88ly1bppOqSyktLeXTTz+tiy1P77/1drI5AHp7u58Rra6c7Pz584bm53A4HJw2bRo7derk9b4lJSW02Wz89NNPCYCrV682QOFFxo4dy+bNm/t8eZuVlcXRo0cbnu9kz549hh0Ua0JvJ/sJzgm8B+CMI9sBINNbO3q0y23u4qxZs7ye+f7NN99w+vTpbNWqFUeMGGGMsEocOHCAoaGhPt+fTpgwgTt27NBZVeDR28la19S8taNHu9ycjKTXR9/nn3/+wmTef/3rXzx+/LhByi7yzDPPMCwszKecIHWhLxC4czKvH0aTzKqpeWtHUTPeJlfdsGHDhffvv/8+zGaz3pIu4ZlnnkFcXByeeOIJr/f1NZFoQ8ab9AMbtNcCEcmv/mqcRIUrbDYbNm7cCAC44YYb8PXXXyMmJsbwfiMjIzFjxgwsWbIE69evN7y/ho7HTkZygPYaSTKq+qtxEhWu2Lp1K4qKijB27FisWLHC76le3jB+/Hj06dMHkydPht3uPkX5lY43cWCPuVtP0vjYDUUVNmzYgAkTJmDhwoW15svXm6CgIMyePRv9+vXDggULMHHixDrtvyHhzQ1ApNZ6AXgAQKLW7ocz9EVRx3Tq1AmLFi2qcwer4Nprr8X48eORlpYWkP4bCr7kXfwawDiSBdrnSAD/ITncAH1uUXkXA09JSQnCwsKu+FyN7vIu+nIIbAVnAtIKygAk+WAn4JSVleHrr79GTk4OEhISMGzYMISFhQVa1iUUFRVh9erVyM3NRXJyMgYPHgyTyRRoWQBQJVbtzJkz+Oqrr1BcXIyOHTvi2muvrZfOd+TIEaSmpsJut6Nv377o2LGjsR26Gtt31QA8i4ulk/4KZ2q3Z7y1o0fz5znZwoWLGBPTjFFRAxhhvZdRUdczKiqBb7/9js829cbhcPDlvz3PuAgLhzWL5D0tLOwRH8nkpk24cuXKQMu7QGlpKf/48H0MjzEzYmw8LXc3orV9FNt2bccff/wx0PIukJubyxEjbmN4WCwjI3/LyIg7aLE0Z8+e1/s9kRwGlU6arLXuvtjQo/nqZAsXLqLFksRg09Zq5Vx30Gppx3/+c65PdvXm2SceZ69GFh7qgirlg1JTwIQIs+FTqDzB4XBw5G2jaB4VS5xqyso12fBJLCMaRzIzMzPQMllSUsJOnfrSHP4AQ0wFlWqylTE0eCYbx7fyK+xGdyerL80XJystLWV0dFMGm7a5KIS3m1ZrIxYVFXltW0+OHz/OGHMYT3ZDjYXwVrUHO7dNMmwO4Pbt25mWllZrob2NGzfS2iaSKKlWkL6i/SOav/7NMEM0esP777/PyIjBLutlh4c9xMcee8pn++6cLDDDUgHkq6++AnkVgqRrjetFOsBk6oUVK1bg9ttvr2N1F1n80UcYFycuy7oOjwYm/XwKW7duRY8ezvofBw4cQGlpqS795+fn44YbbkBERARuvPFGjBw5EsOHD0dsbGyV7d5e9C8UTzQBYS7uve6xYP20NJw9exZxcXG6aPOFN99chOLzf0ZQUM067baHMX/+9Zg5c4bufV9xTnb8+HHY7Slutykv64Ds7Gyf7O/btw9nzpwBABw8eBBDhw5F06ZNvdd5JAsp4jp5TZAAKdZgZGdnX3CycePGYfv27T7pdkVubi4WL16MxYsXIzg4GJMnT8a0adMuVIY5fDwLjuFungRFBiE0IRwnT570yck2bdoEh8MBAPj5559x++23IzQ01Gs7OTnHAXH3f78KBfknYbfbdR9U8uZhtCffkIO1lDsKNAkJCQg2HUS5m21CQg8gIaG3T/avuuqqC+/79evnkw0ASEhsgYMMRdWB3IuQwMFiOxISEi4sW7RokW5JQvPz8zF69GiYTCYMHToUI0eOxMiRI9GiRdU6IC0SEiEHt8Hlg6DzDpSdLPW5/lnfvn0vvPfn+2zSJAEncg4C4mok8TCs1jhjRm1dXUdWbwBKABwEcMhNO+KpPT2aL/dkxcXFjIiIZ4hpj4t7soO0mGN1SwfgK0eOHGGsOYy5NdRNZm/w2xQwpVWiYfdk6enpXL58OQsLC91ut379elpToi6W8K3e5sVw0MjBhmj0hvnz5zMi4kaX92RhoY/zoYce9dk+dKoZvVWnbcIBbIbzMcAuAC9oy+PgrFG2X3uNrc2Wr6OLs2fPodWawhDT/moOdohWaye+/PJrPtnVm0cevJ//19jCE9UGP9KvARMjzVz6+eeBlkiHw8HBI4Yw/HexREGzi87laE6sbkRLY2u9GMY/f/4827XtwvCwpxliKq30P7cz2DSfMTHN/Mr5r5eTheu0jQCI0N6HwJn96lo4U30/rS1/GjWUVKre/HlO5ixQHseoyBEMD3uMUZGjaTbH8qWXXjU8atdTbDYbn3xkEqPNYbwt0crHWoRwcNNINomO5OIPPwy0vAsUFRVx3IRxDIsNp/muOIY8GsvInrFMSG6qe8Ywfzhx4gQH9B9Gs7kpLeb7aQ6fxIiI9mzfvht37drll213Tub1tCo9ERELgA1wzoV8H8Agkjki0gxAGkm3IxT+TqsqKirCsmXLcPz4cTRt2hQ333wzIiMjfbZnFGfOnMGyZcuQm5uLpKQkjBo1ql7OTDl69ChWrFhxYcbHDTfcUG9mplTmp59+wrp162Cz2dC3b19cd911fs9M0a1mtIh0ADAGzonBBHAcwJckd3spyAQgHUA7AHNIPiUieSRjKm2TSzLWlQ1AzV1U1B/0qhn9FIBP4Lzc2wxnRRYB8LGIPO2NILopAuiBDlUEUNGg8PhMJiL7AHQkWV5teSiAXSTb+yRA5K8AigDchzq+XFQo9EKXMxkAB4DmNSxvpq3zVEyNRQDhzEp8p7bZnQCWe6FNoai3eDPj4xEA34jIfgBHtWWt4Lyv+rMXdpoBeE+7LwsC8BnJlSKyEcBnInIvgCMAbvXCpkJRb/HYyUh+JSJXAegD58CHwJkP/0eSHid5IJkJoHsNy88AGOqpHYWioeDV3EWSDgD6F9RS+E1hYSEiIiLqrD+S9TIgsz7iSxFART1kxowZWLt2reH9kMTs2bMN7+dyQjmZB5Cs92nPnnjiCcyYMQM2m82wPhwOByZNmoS0tDR1FvMC5WQekJ2djUWLFgVahluio6Px+9//HvPmzTOsj8zMTCxYsMDv+s5GU1BQgMWLFwdaxgUuayez2Wy6FBRv0aIF8vLyLsSJ6c358+ehx/S2u+66C8uXLzdM548//ohXXnlFl2BWI68MHnnkEZSXuwtm8hw9dF7WTvb999/rNnfuT3/6E9555x1dbFVn06ZNulx+mUwm/OUvf8ELL7ygg6qqnDt3Dp9++ikeeOABJCYm+m1v9+7d2LRpkw7KqnLu3Dl06NABt96qzxOgtLQ0HDp0yC8bujiZiNythx09yc3NRWRkJEJCXMTve0lERARat26NXbt26WKvgkOHDiEpKUk3ewMHDsTZs2d11zl9+nRMnTpVt0SqnTp1QlFRkS5n8MrMmzcPEydOhMVi0cXe0KFDcfjwYb9s6HUm0//Q6SdLly5F9+6XPI7zi9/+9rf45JNPdPthkERqaiqSk5N1sVfByy+/jKlTp+qmc+/evTh27BiGDBmii70KevfujR9//FE3e3v37kVCQgKio6N1swkA7dq1w/79+33e35sJwpku2g4ACbUaqGNGjBihu82goCB06NABTz/t1Xxol5SWlmLcuHG62KpMq1at0L17d6xYsUKXe5OpU6fi5Zdf1kFZVSIjI6ukT/CXjz76COPHj9fNXgUtW7b0Ka9IBd6c+xMADAOQW225APjeZwUG4UvyGk8YO3Ysvv32W10exoaHh1fJwKsn99xzD4YPH47Dhw9j0qRJPtv56quvkJKSgjZt2uio7iKtW7fWxc5XX31laPyaPzq9uVxcCWdEc/UCgIcBpPmsoIFhsVgwd+7cCxmU6itRUVGIjY1FamqqzzbKy8vx2muv4ZlnntFRmTEkJyfX20cL3tQnu5fkBhfrfq+fpPpPWFhYvYz4rUxMTAy+/vprWK1Wn+/N5s6dizvuuKNeRotXJyXFfZq/QHLF5V28krBarViwYAFsNptPo6wdO3bUfbDjSkQ52WWOP7lAfvWrX+mo5Mrlsn4YrVDUB5STKRQGo5xMoTAY5WQKhcEoJ1MoDOaynSAcSM6cOYN9+/YhLy8v0FLc8ssvv2D//v0oKioKtBSXkMTRo0fx888/61Z7ra5p0BOECwsLA9GtSzZv3oxBIwcjsW0L9LypD5q2boaRt4/Cnj17Ai2tCqtXr0bXrgOQlHQNeva8EfHxibjjjonIyckJtLQLkMR7ixahS7s26H1NCn7duztaNI7Hk48+Uq/+73a7Ha/OfNX9Rq6S5FdvADJdtB0ASj21o2cLDhKuWrXK05oAhrJu3Tpa4q3EOzFEkVbdJK8Z5dVoRjaJ4tatWwMtkSQ5f/5CWiyJDA5awhBTuVbZJIehIY+zSZMkHjt2LNASSZLPPvkEO8ZauC4FdPRyVrPZ3xn8Q7Mw9uncMeClrUjSbrdzzG/H0DIoRreqLicAdAPQulpLAnDcUzt6tpRwMCEmmqWlpYZ8iZ5SXl7ORi3jiXWNWGONrkWxvLpPx4BqJMnTp08zPDzGZW220JBnOXbsHwItk1u3bmXzSAtP1VAv29ELvL1pOP/67LOBlsn//Oc/tPaIJoqbu3WyBj1BOCII6BTuwBdffBGI7i+wevVqlLV0AENdzKgfb8aRk0eQkZFRt8Kq8e6778FkGgNxUdaVjilYvXoVTp8+XcfKqjLvzX/gwdhSxNcwE0wEeK5RCf799pyAJzd67V+vo+ipICDcfTSGN8lN73WzzuMJwiLSEs4ySU3hTO/9DsnZItINwL/gLBJoA/Agyc212fu/oALszMz0Ke/EwYMHceLECQDOZDl9+vRBq1atvLazY8cOnB/o5h9uEsiAcOzcufNCfefaKCoqwty5c2tct2fPHthsNjz44INVyr3WxubNO1BSPBAmF4dWkViEh6dg//79HpefPXbsGD7++OMa16WnpyMuLg6PPPJIlTK/tbEjIx2/s7j+PjtZgJKSYuTm5npdJpckfvjhYurQI0eO4JZbbvFpwvfuHbuBgbVHYPs1d1FEmpL8xcvdbACmkMwQkUgA6SKyFs4igC+QXC0iN2mfB9VmLE+CEW+1eisdANCmTZsLcVLl5eU+pyqwWCwIPhIEd8dVySPMZrNXNh999NEa1+3duxd2ux2dO3f2SmdkpAVAnttt7PY8r3QmJia61JmRkYFGjRqhbdu2Xqh0/u15bgY8Sx1Acbndp1g8EalSe7pXr14+R1SEW8JRkOcAmrnf39/Rxf96uwPJHJIZ2vsCALtxsd5ZlLZZNJy1z9zbAvBJfghuvvlmb2Vcgj+5QEaNGgX5vAQodhFScsKO8g1FuOGGGzy2KSIIDg6usXXs2BFdunTxOmj09tvHwGL9wGXoi4ObYTaXoUuXLrro7NOnj9cOBgBjfj8BH5x3feBckgv0791Tl4zJ/vzfx40Zh+APPIg8d3Wz5kmDBzWia9k/Cc7iElEArtbeHwWQDaC1i30mAtgCYEuECRz1qyH63MX6yYjbRjLsrljCVq1A+fnmNN8YwwcfezDQEmm325mS0oNhoS9cUqA8xHSKVmtXvvXW24GWyXPnzjExPo4ftrl04GN/Z7BFpIVr1qwJtEzu37+flvgIYn28PqOLNe7svG/ydd8IOKtt/kb7/CaAcdr72wCsq81GhMXCvLw8Q75AbykoKOB1N/RnRMdo4h/RxPI4Bs2IoTU5kmN+dzPLysoCLZEkmZ2dzbZtuzAq8jqagt5hcNAyhoVOpdmcwClTnqk39bJ37NjBlk3ieVOzCH6QDH7RDnyoRRhjLeF85+3AHwgqWLduHSPiI/WpGS0iGSTd3rV7so22XQico5VrSM7Slp0DEEOS4rwOOkcyyp2d+lYEkCTS0tIw74N5yD55HG1atMFD9zyI3r1716u01jabDStWrMC77/4HeXkF6NLlKvz5z/ehQ4cOgZZWheLiYnz66adY9dnHKC0pQfd+/XHfAw+iRYsWgZZWhdzcXMTFxflfM1pEigG4y4slAKJJuh2e0xzoPQBnST5SafluAA+QTBORoQBeJdnTna365mSKKxd3lTa9GV305DDnyYOL/gAmANghItu0ZVPhLGc7W0SCAZTAee+lUDR4vHlOlqVHh3Qm43F17eT2zKVQNERUqItCYTDKyRQKg1FOplAYjHIyhcJglJMpFAajnEyhMBjlZAqFwVyWTvbLL78EPKDPE7777rtASwg4Bw8eREFBQaBl1Io/eUUuSyeLiorC2rVrAy2jVlq3bo3169cbYvvs2bO62XI4HIYUeyeJF198UZeQFSMpLS3FzJkzfd7/snQyi8WCsLAw3VOyORwOlJWV6WavdevWOH78uC7VMCtz5swZZGdn62YvKCgIR48e1c1eBRs3bsSzzz6r6+Tp4uJi3WxVsH79ekyZMsXn/S9LJwOAQYMGYe3atbpeNtpsNr/KmtbE6NGjsXz5cpeBlL5w7Ngxr6OmayMpKQnp6em62bPZbMjKyvIpqNMdehWOryA/Px9BQUF+nW0vWycTEZjNZuzevVs3m3o7GOCsIbZ//35dczO2a9dON1sVxMTEeBUxXRsrV67EyJEjdbNXgT+RzjWRmprqd402j0Nd6iOehLo4HA4EBdXvY4nD4cDp06fRpEmTQEupM3bt2oWOHTsGWkatFBUVwepBDhl3oS71+9enA/XdwQCnxivJwQA0CAcD4JGD1Ub9/wUqFA0c5WQKhcEoJ1MoDEY5mUJhMMrJFAqDUU6mUBiMcjKFwmCUkykUBqOcTKEwmCvWyQoLC/Hmm/9E+/Y9ERPdDG3bdsfMmW8gPz8/0NKqcOrUKbz4wvPomNQKzeKi0b9bZ7z77rv1rkj54cOHMfmJyWjarhlimsei36+vw9KlS+FwOAItrQqZmZkYP/4+xMe3RlxcCwwfPg6pqanGduoqSX5DaD179vSpSMCJEyeYnNyJVuvNDA76liGmbAab1tNqvY0tW6YwOzvbJ7t689NPPzExPo5/TAznpqvBY13Ble3BIU2sHNirR72om0ySqamptMZHMOSJWGJHE+JoU2JxLK3dojnmdzfTZrMFWiJJ8r33PqDF0oShIS8xxLSPIabDDA56m1ZrMh9/3L/yuNCj4ER9REROAajIbBwPILB1WAOvIdD9X8kaWpNsXNOKBu1klRGRLXQxC/pK0RDo/pWGmrli78kUirpCOZlCYTCXk5O9E2gBCLyGQPcPKA2XcNnckykU9ZXL6UymUNRLGpyTiUhLEUkVkd0isktEJlda97CI7NWWv1rXGkSkm4j8ICLbRGSLiPQxUEO4iGwWke2ahhe05XEislZE9muvsXXc/2siskdEMkXkCxGJMaJ/dxoqrX9cRCgi8UZp8AhXD9DqawPQDEAP7X0kgH0ArgEwGMA6AGHauiYB0PA1gBu15TcBSDNQgwCI0N6HANgE4FoArwJ4Wlv+NIBX6rj/XwMI1pa/YlT/7jRon1sCWAPnc9T4QP5mG9yZjGQOyQztfQGA3QASATwAYAbJUm3dyQBoIIAobbNoAMcN1ECSFbmjQ7RGAGPgLHwP7fXmuuyf5NckbdryHwC0MKJ/dxq0z28AeLLS54DR4JysMiKSBKA7nEewqwAMFJFNIrJeRHoHQMMjAF4TkaMAXgfwjMF9m7Ti9icBrCW5CUACyRzAeTAAYFgaLBf9V+YeAKuN6t+VBhEZDSCb5HYj+/aYQJ5G/bxUiACQDuA32uedAN6E8xKiD4BD0EZP61DDmwDGae9vA7Cujr6LGACpADoByKu2Lrcu+6+07FkAXxj9P6hBQxc4D3jR2vLDUJeL3iMiIQA+B/ARyaXa4mMAltLJZgAOOOew1aWGOwFUvP8PnM5uOCTzAKQBGA7ghIg00zQ2g/MIX5f9Q0TuBDASwB+o/dLrUMMYAMkAtovIYTgvVzNEpGld6KiJBudk4qxOsADAbpKzKq1aBmCIts1VAEJh0CRRNxqOA7heez8EwH4j+tc0NK4YuRMRM4BfAdgD4Es4nR3a6/K67F9EhgN4CsBokueN6LsWDVtJNiGZRDIJzoNvD5K/GKnFHfpm568b+gOYAGCHdi0OAFMBLASwUER2AigDcKeBR1FXGu4DMFtEggGUAJhoUP+Ac4TzPRExwXmw/IzkShHZCOAzEbkXwBEAt9Zx/z8DCAOwVqvW8gPJ++tSg0F9+Yya8aFQGEyDu1xUKBoayskUCoNRTqZQGIxyMoXCYJSTKRQGo5xMoTAY5WQKhcEoJ1M0WETknyKSUVeTwX1FOZmiQSIiVjgjDP4E5zzJeotyMi8QkSQRKa40lar6+oUiclKb2uWJPW+3dxcVbtYisstqiwQWkedF5HHt/fee9O2BthgRebDaMr1sm7XwJVPFMpJFcE6rSoMz+gEiEioi32nT2uoNysm85wDJbi7WLYI2E91DvN3eBmAKyavhjEJ+SESuAQCSxZourwJFSV5XfZk48fa3EQOgipPVZNtH7oEzwsJesUBEGgGwACgAYNf6KwPwDYDbdepXF5ST6QjJ7wCcNXB7VxHZtSIiz4oz/8k6ACmVlhdqr0naGXIugAwALUVkvJZDY5uIzKs4k4jIHVoOj+0i8oFmagaAttq2r1Wz/ZiI7NTaI5X6rujz39qZ+WttNn11/oBLowmegzMwdhecqR8qWKZtX38IZDBbQ2sAkgDs9Hcbf7avtt8RAFHVlh9GtSBFAD0B7IDzyB8F4GcAj2vrCivZc+BijoyrAawAEKJ9ngvgDgAdAeyt6ANAnKu/A0Bhpb6tcAa57gLQvdI+NgDdtM+fARhfzUYogF9q+Ns3wRmg+xaA+yqtMwE4FejfSuVWr65dFZ4hIhFwBow+QtKTWk8DAXxBLb5LRL50sV0WyR+090PhdJAftZAVM5wBoNEAlpA8DQAkazsTD9D6LtL6Xqrp2aqtP0Rym/Y+HU4Hqkw8gLxqy14E8DeSFJHdcDo+ND127b40ks6zfcBRTlbPEZGH4IxTA5wZsE7h0ohsT/AkpqmoctcA3iNZJU+JiEzy0FZlO+6oXGjNDqczV6YYQHil/rsB+A2AASIyR1u3o9o+YXDG89UL1D1ZPYfkHJLd6BzUyEHNEdm18R2AsdooXSSAUR7s8w2AW0SkCXAhn2Nrbflt2sADRCRO274AzvR4NfV9s4hYtGH3sQD+n6fCSeYCMIlIhaO9AmAUL0Y+d0WlM5mm6xTJck/7MBrlZDoiIh8D2AggRUSOadHJum2PixHZQ7QBhm0iclNtuugcLPkUwDY4z4K1/shJ/gTn4MLXIpIJYC2AZiR3AXgJwHoR2Q5glrb9GQD/0wY3XqvW9yIAm+G8j5pPciu842s4z1xDAFhJflPJ/gkA1krOPhjAf720bygqMtoLxJn+bSXJToHW4gpxJo/pVXHPdDkgIt0BPEZyggfbLgXwDMm9xivzDHUm8w47gGhXD6MDScXDaDgTfNavQs1+op35Uis/jK4JEQkFsKw+ORigzmQKheGoM5lCYTDKyRQKg1FOplAYjHIyhcJglJMpFAajnEyhMBjlZAqFwSgnUygM5v8DhbjwMbdS2ZQAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()\n", - "plot_vitek(W_screw_dislo, W_screw_bulk, alat=alat, xyscale=5, plot_axes=ax)\n", - "ax.set_aspect(\"equal\")\n", - "ax.set_xlabel(f\"{W_screw.axes[0]} direction ($\\AA$)\")\n", - "ax.set_ylabel(f\"{W_screw.axes[1]} direction ($\\AA$)\");" - ] - }, - { - "cell_type": "markdown", + "execution_count": 38, "metadata": {}, - "source": [ - "We can use the ASE minimisation tools to minimise the structure using the chosen interatomic potential:" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": { - "tags": [ - "hide-output" - ] - }, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PreconLBFGS: 0 17:45:43 -1936.097809 2.5284\n", - "PreconLBFGS: 1 17:45:46 -1936.291225 0.3596\n", - "PreconLBFGS: 2 17:45:47 -1936.346345 0.2286\n", - "PreconLBFGS: 3 17:45:48 -1936.361558 0.6206\n", - "PreconLBFGS: 4 17:45:48 -1936.374387 0.1534\n", - "PreconLBFGS: 5 17:45:49 -1936.377025 0.0604\n", - "PreconLBFGS: 6 17:45:50 -1936.378171 0.0846\n", - "PreconLBFGS: 7 17:45:52 -1936.378413 0.0449\n", - "PreconLBFGS: 8 17:45:52 -1936.378520 0.0124\n", - "PreconLBFGS: 9 17:45:53 -1936.378533 0.0059\n" - ] - }, { "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3645f686ef254210bd8007af69ca5ea2", + "version_major": 2, + "version_minor": 0 + }, "text/plain": [ - "True" + "NGLWidget()" ] }, - "execution_count": 69, "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "W_screw_dislo.calc = eam_calc\n", - "opt = PreconLBFGS(W_screw_dislo)\n", - "opt.run(fmax=0.01)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, "output_type": "display_data" } ], "source": [ - "fig, ax = plt.subplots()\n", - "plot_vitek(W_screw_dislo, W_screw_bulk, alat=alat, xyscale=5, plot_axes=ax)\n", - "ax.set_aspect(\"equal\")\n", - "ax.set_xlabel(f\"{W_screw.axes[0]} direction ($\\AA$)\")\n", - "ax.set_ylabel(f\"{W_screw.axes[1]} direction ($\\AA$)\");" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Differential displacement map of the relaxed structure shows almost the same picture as before with symmetric 'easy' dislocation core. This means that for the selected interatomic potential this structure is indeed the most stable and that the initial guess of the displacement was reasonably good. " + "longer_W_screw_dislo = W_screw_dislo * [1, 1, 10]\n", + "show_dislocation(longer_W_screw_dislo, d_name=\"1/2<111> screw\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ + "If you want to save the configuration in a file for further analysis or as an input for a code you can use build in [ASE write method](https://wiki.fysik.dtu.dk/ase/ase/io/io.html#ase.io.write) as `longer_W_screw_dislo.write(filename)`. The method supports a wide range of formats including `xyz` and LAMMPS data files. Do not forget to take into account fixed atoms if you use the saved file as an input for a simulation code like LAMMPS. \n", + "\n", "### 1/2<111>{110} edge dislocation\n", "\n", - "As we said before, for edge dislocations burgers vecort $\\vec b$ is perpendicular to the dislocation $\\vec l$. So here, we have the same glide plane of (110) which fixes the cell Y direction to <110>. X direction now will be along burgers vector <111> and Z dislocation line direction <112>." + "As we said before, for edge dislocations burgers vectpr $\\vec b$ is perpendicular to the dislocation $\\vec l$. So here, we have the same glide plane of (110) which fixes the cell Y direction to <110>. X direction now will be along burgers vector <111> and Z dislocation line direction <112>." ] }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -469,8 +373,8 @@ "[[ 1 1 1]\n", " [ 1 -1 0]\n", " [ 1 1 -2]]\n", - "Brurgers vector:\n", - "[1.57169589 1.57169589 1.57169589]\n" + "Burgers vector:\n", + "[1.57169453 1.57169453 1.57169453]\n" ] } ], @@ -488,44 +392,29 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "disloc SCF 0 |d1-d2|_inf = 0.17503856559581366\n", - "disloc SCF 1 |d1-d2|_inf = 0.030669955637878832\n", - "disloc SCF 2 |d1-d2|_inf = 0.004376523884616179\n", - "disloc SCF 3 |d1-d2|_inf = 0.0008807296154242916\n", - "disloc SCF 4 |d1-d2|_inf = 0.0001545318258490136\n", - "disloc SCF 5 |d1-d2|_inf = 2.611311185346521e-05\n", - "disloc SCF 6 |d1-d2|_inf = 5.7489147281541975e-06\n", - "disloc SCF 7 |d1-d2|_inf = 7.771344639473377e-07\n", + "disloc SCF 0 |d1-d2|_inf = 0.17503717189385382\n", + "disloc SCF 1 |d1-d2|_inf = 0.030669651063355258\n", + "disloc SCF 2 |d1-d2|_inf = 0.004376489640269432\n", + "disloc SCF 3 |d1-d2|_inf = 0.0008807112000284167\n", + "disloc SCF 4 |d1-d2|_inf = 0.00015452837692353505\n", + "disloc SCF 5 |d1-d2|_inf = 2.6112647029508107e-05\n", + "disloc SCF 6 |d1-d2|_inf = 5.7487804006051135e-06\n", + "disloc SCF 7 |d1-d2|_inf = 7.771108773702018e-07\n", "\n", "Cell vectors:\n", - "[[54.44514271 0. 0. ]\n", - " [ 0. 53.34512744 0. ]\n", - " [ 0. 0. 7.69970592]]\n", + "[[54.44509545 0. 0. ]\n", + " [ 0. 53.34508114 0. ]\n", + " [ 0. 0. 7.69969924]]\n", "\n", - " Burgers vector lenth:\n", - "2.7222571354952314\n" + "Burgers vector lenth: 2.72 Angstrom\n" ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "be19a5730c794aae8b7eb68045b83c77", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "NGLWidget()" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ @@ -534,79 +423,25 @@ "print(\"\\nCell vectors:\")\n", "print(W_edge_dislo.cell.array)\n", "\n", - "print(\"\\nBurgers vector lenth:\")\n", - "print(np.linalg.norm(W_edge.burgers))\n", - "\n", - "interactive_view(W_edge_dislo, scale=0.25)" + "print(f\"\\nBurgers vector lenth: {np.linalg.norm(W_edge.burgers):.2f} Angstrom\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "It can be seen that the case of edge dislocation the requires more iterations to achieve converged displacement field." - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": { - "tags": [ - "hide-output" - ] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PreconLBFGS: 0 17:45:56 -3017.104358 5.8264\n", - "PreconLBFGS: 1 17:46:00 -3017.709448 4.8423\n", - "PreconLBFGS: 2 17:46:01 -3018.145844 3.6772\n", - "PreconLBFGS: 3 17:46:02 -3018.509917 2.2949\n", - "PreconLBFGS: 4 17:46:03 -3018.881065 1.4546\n", - "PreconLBFGS: 5 17:46:05 -3019.131877 0.7014\n", - "PreconLBFGS: 6 17:46:06 -3019.257094 0.4935\n", - "PreconLBFGS: 7 17:46:07 -3019.309591 0.8500\n", - "PreconLBFGS: 8 17:46:09 -3019.331649 0.4274\n", - "PreconLBFGS: 9 17:46:11 -3019.339919 0.2540\n", - "PreconLBFGS: 10 17:46:13 -3019.343713 0.2224\n", - "PreconLBFGS: 11 17:46:14 -3019.345547 0.3021\n", - "PreconLBFGS: 12 17:46:16 -3019.347613 0.1698\n", - "PreconLBFGS: 13 17:46:17 -3019.348607 0.0915\n", - "PreconLBFGS: 14 17:46:19 -3019.349042 0.0348\n", - "PreconLBFGS: 15 17:46:20 -3019.349154 0.0489\n", - "PreconLBFGS: 16 17:46:21 -3019.349259 0.0276\n", - "PreconLBFGS: 17 17:46:23 -3019.349286 0.0100\n", - "PreconLBFGS: 18 17:46:24 -3019.349297 0.0057\n" - ] - }, - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 73, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "W_edge_dislo.calc = eam_calc\n", - "opt = PreconLBFGS(W_edge_dislo)\n", - "opt.run(fmax=0.01)" + "It can be seen from the print output of ` W_edge.build_cylinder()` that the case of edge dislocation the requires more iterations to achieve converged displacement field." ] }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "ffa1a678356e486d87749676e6ce4f85", + "model_id": "863a61925a3c4d8ca4de13786507f13c", "version_major": 2, "version_minor": 0 }, @@ -619,14 +454,7 @@ } ], "source": [ - "interactive_view(W_edge_dislo, scale=0.25)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It can be seen that relaxed core structure differs significantly from the initial guess." + "show_dislocation(W_edge_dislo, scale=0.25, d_name=\"1/2<111> edge\")" ] }, { @@ -635,12 +463,12 @@ "source": [ "### 1/2<111>{110} mixed dislocation\n", "\n", - "For mixed dislocation the cell vector are the same as for the screw dislocation. However the displacement vector is applied along <111> direction that is not parallel to the Z direction: [$1\\bar 11$] and [$1\\bar 1 \\bar1$] with an angle of 70.5 degrees between the vectors. This leads to both edge and screw component in the displacement and thus the name _mixed_ dislocation." + "For mixed dislocation the cell vector are the same as for the screw dislocation. The difference is that the displacement vector is applied along <111> direction that is not parallel to the Z direction: [$1\\bar 11$] and [$1\\bar 1 \\bar1$] with an angle of 70.5 degrees between the vectors. This leads to both edge and screw component in the displacement and thus the name _mixed_ dislocation." ] }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -652,7 +480,7 @@ " [ 1 1 0]\n", " [ 1 -1 1]]\n", "Burgers vector:\n", - "[ 1.57169589 -1.57169589 -1.57169589]\n" + "[ 1.57169453 -1.57169453 -1.57169453]\n" ] } ], @@ -670,35 +498,34 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "disloc SCF 0 |d1-d2|_inf = 0.10539253373490873\n", - "disloc SCF 1 |d1-d2|_inf = 0.018105901181897643\n", - "disloc SCF 2 |d1-d2|_inf = 0.0028537827503362645\n", - "disloc SCF 3 |d1-d2|_inf = 0.0004461832291074441\n", - "disloc SCF 4 |d1-d2|_inf = 6.968773949250773e-05\n", - "disloc SCF 5 |d1-d2|_inf = 1.0882737324524605e-05\n", - "disloc SCF 6 |d1-d2|_inf = 1.6994622201171872e-06\n", - "disloc SCF 7 |d1-d2|_inf = 2.6538950442800413e-07\n", + "disloc SCF 0 |d1-d2|_inf = 0.10539187767041772\n", + "disloc SCF 1 |d1-d2|_inf = 0.018105716735450528\n", + "disloc SCF 2 |d1-d2|_inf = 0.002853744720166418\n", + "disloc SCF 3 |d1-d2|_inf = 0.00044617599789692486\n", + "disloc SCF 4 |d1-d2|_inf = 6.968641396387643e-05\n", + "disloc SCF 5 |d1-d2|_inf = 1.0882499856867955e-05\n", + "disloc SCF 6 |d1-d2|_inf = 1.6994203833053945e-06\n", + "disloc SCF 7 |d1-d2|_inf = 2.653822296916353e-07\n", "\n", "Cell vectors:\n", - "[[61.59764738 0. 0. ]\n", - " [ 0. 62.23598202 0. ]\n", - " [ 0. 0. 2.72225714]]\n", + "[[61.59759392 0. 0. ]\n", + " [ 0. 62.235928 0. ]\n", + " [ 0. 0. 2.72225477]]\n", "\n", - "Burgers vector lenth:\n", - "2.7222571354952314\n" + "Burgers vector length: 2.72 Angstrom\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e6e8cd4dd3f94b06a921d8bac0bc7c68", + "model_id": "c8e63ead26fc406590892d6e8897f0d0", "version_major": 2, "version_minor": 0 }, @@ -711,111 +538,85 @@ } ], "source": [ - "W_mixed_bulk, W_mixed_dislo = W_mixed.build_cylinder(radius=17)\n", + "W_mixed_bulk, W_mixed_dislo = W_mixed.build_cylinder(radius=20)\n", "\n", "print(\"\\nCell vectors:\")\n", "print(W_mixed_dislo.cell.array)\n", "\n", - "print(\"\\nBurgers vector lenth:\")\n", - "print(np.linalg.norm(W_mixed.burgers))\n", + "print(f\"\\nBurgers vector length: {np.linalg.norm(W_mixed.burgers):.2f} Angstrom\")\n", "\n", - "interactive_view(W_mixed_dislo, scale=0.5)" - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()\n", - "plot_vitek(W_mixed_dislo, W_mixed_bulk, alat=alat, xyscale=8, plot_axes=ax)\n", - "ax.set_aspect(\"equal\")\n", - "ax.set_xlabel(f\"{W_mixed.axes[0]} direction ($\\AA$)\")\n", - "ax.set_ylabel(f\"{W_mixed.axes[1]} direction ($\\AA$)\");" + "show_dislocation(W_mixed_dislo, scale=0.5, d_name=\"1/2<111> mixed\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "It can be seen that the screw displacement component is not local as compared to the case of screw dislocation. This is because in this visualisation edge component of the displacement is not taken into account. It is the full displacement as screw plus edge component that makes a periodic vector leading to perfect structure and thus no displacement far from the dislocation core." + "### <100>{110} edge 'junction' dislocation\n", + "\n", + "So called junction dislocations with burdgers vector along <100> can be formed in the reactions between more abundant dislocations with burgers vector 1/2<111> such as: \n", + "\n", + "$$\n", + " \\frac{1}{2}[1\\bar{1}1] + \\frac{1}{2}[11\\bar{1}] = [100]\n", + "$$\n", + "\n", + "They share the same glide plane ad 1/2<111> dislocations and can play important role in impurity segregation. " ] }, { "cell_type": "code", - "execution_count": 112, - "metadata": { - "tags": [ - "hide-output" - ] - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "PreconLBFGS: 0 18:11:56 -1378.796211 6.1079\n", - "PreconLBFGS: 1 18:11:58 -1379.177181 5.5696\n", - "PreconLBFGS: 2 18:11:58 -1379.433631 3.8806\n", - "PreconLBFGS: 3 18:11:59 -1379.678480 2.8772\n", - "PreconLBFGS: 4 18:12:00 -1379.877549 1.7194\n", - "PreconLBFGS: 5 18:12:00 -1380.025465 1.0665\n", - "PreconLBFGS: 6 18:12:00 -1380.137886 0.4828\n", - "PreconLBFGS: 7 18:12:01 -1380.207597 0.7496\n", - "PreconLBFGS: 8 18:12:01 -1380.243102 0.6630\n", - "PreconLBFGS: 9 18:12:02 -1380.255614 0.5914\n", - "PreconLBFGS: 10 18:12:03 -1380.262569 0.6070\n", - "PreconLBFGS: 11 18:12:03 -1380.272479 0.2771\n", - "PreconLBFGS: 12 18:12:04 -1380.278208 0.2129\n", - "PreconLBFGS: 13 18:12:05 -1380.283037 0.2463\n", - "PreconLBFGS: 14 18:12:06 -1380.285827 0.1471\n", - "PreconLBFGS: 15 18:12:06 -1380.287208 0.1001\n", - "PreconLBFGS: 16 18:12:07 -1380.287801 0.0572\n", - "PreconLBFGS: 17 18:12:07 -1380.287999 0.0161\n", - "PreconLBFGS: 18 18:12:08 -1380.288042 0.0102\n", - "PreconLBFGS: 19 18:12:09 -1380.288059 0.0061\n" + "Cell orientation:\n", + "[[ 1 0 0]\n", + " [ 0 1 1]\n", + " [ 0 -1 1]]\n", + "Burgers vector:\n", + "[3.14338905 0. 0. ]\n" ] - }, - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 112, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ - "W_mixed_dislo.calc = eam_calc\n", - "opt = PreconLBFGS(W_mixed_dislo)\n", - "opt.run(fmax=0.01)" + "from matscipy.dislocation import BCCEdge100110Dislocation\n", + "\n", + "W_100110_edge = BCCEdge100110Dislocation(alat, C11, C12, C44, symbol=\"W\")\n", + "\n", + "print(\"Cell orientation:\")\n", + "print(W_100110_edge.axes)\n", + "\n", + "print(\"Burgers vector:\")\n", + "print(W_100110_edge.burgers)\n" ] }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 12, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "disloc SCF 0 |d1-d2|_inf = 0.256011923011219\n", + "disloc SCF 1 |d1-d2|_inf = 0.06016875789278883\n", + "disloc SCF 2 |d1-d2|_inf = 0.008688239875985548\n", + "disloc SCF 3 |d1-d2|_inf = 0.002036859690120879\n", + "disloc SCF 4 |d1-d2|_inf = 0.00025500641555943615\n", + "disloc SCF 5 |d1-d2|_inf = 8.302194247189476e-05\n", + "disloc SCF 6 |d1-d2|_inf = 1.6579146270331857e-05\n", + "disloc SCF 7 |d1-d2|_inf = 1.7272275882884713e-06\n", + "disloc SCF 8 |d1-d2|_inf = 6.753932630942927e-07\n" + ] + }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "dd80ae03bbe5421aa359fa4326d6534f", + "model_id": "97a6a8aa8305419b802a254b534dcf62", "version_major": 2, "version_minor": 0 }, @@ -828,60 +629,23 @@ } ], "source": [ - "interactive_view(W_mixed_dislo, scale=0.5)" - ] - }, - { - "cell_type": "code", - "execution_count": 113, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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8jBnzhzccMMNmDZtGk499dSg6yYkJOCKK67APffcgwULFoQ947Nfv37wer244IILQvrCDh06FOPGjUN0dDQ6duwYsg4hBJKSkrBv3z48+uijIX9hhw4dip49e8JqtYalJT09HXq9HtOmTQvZkfXu3RtdunQJ+4nRN998g4ULF4acvtJut2PlypX49NNPw9IBAHv37sXBgwfDsqE4ZGJTXZKmCoCJAD4HsA/AYwC2ArhEqR01yoABA0iSubm5tNvtjImJ4cGDB0Puoo0ZM4Yul4tFRUUhrZStqqpiWVkZExMTedlll4Wsg/SNoUydOpVVVVUhdW2rqqpYU1PDnj17hhWAxu12s3///pwyZcofdkPRUl5ezk6dOoUV7ayqqoqdO3fmzJkzwzovBw8eZI8ePcK6xSXJBx54IOyFbocOHeI999wTlg2SXL58Od1ud1g2qqurG41nQa0xD/gGSzsC6AHgBgA3AuipxIaapf6q2ieffJIAePPNoUWwWrhwIQHwhRdeCKl+fd5++20C4I8//hhS/ezsbLpcLkUDk02xaNEipqens6KiIqT6//3vf2m321XR8v777/Occ84J+T7/iSeeYEZGhiohEF566SXedtttIddfvXo133nnnbB1kORHH33EZcuWhWVDzQHp+qjmPHy28KvSOq1V6juPqqoqdunShXq9ntnZ2YpOUE1NDXv06MGTTjpJlRiTHo+Hp556KgcMGKB41a3X6+Xw4cP5xBNPhK2jjjFjxvCf//yn4nrFxcWMi4vjv/71L1V0eL1eDhkyhJ9++qniunW9y88//1wVLbW1tezfvz83b94cUv2XX35ZtRXVXq+Xzz//vCq21EZt5/ESgFOU1muN0jCex6effkoAHD58uKJft//85z8EwG+++SboOi2xcuVKAuDrr7+uqN7nn3/Ozp07qxpgaOvWrXS5XIqDEt9xxx3s1KkTKysrVdOyZs0adu3aVfHnmzZtGkeMGKHq04lvv/2W5513nmr2jkfUdh6bALjhCxW4Ab4YHyEFAwq3NHQeXq+X5557LgEE/QtVWFhIp9PJcePGBXW8EiZPnsz4+HiWlJQEdXxVVRUzMjI4f/581bXccccdnDx5ctDHb926lQaDgfPmzVNdy1VXXcVZs2YFffzq1atpNBoV9yiD4ZFHHmm1Lv/xgNrOIy1QUWpHjRIoktjGjRup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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()\n", - "plot_vitek(W_mixed_dislo, W_mixed_bulk, alat=alat, xyscale=8, plot_axes=ax)\n", - "ax.set_aspect(\"equal\")\n", - "ax.set_xlabel(f\"{W_mixed.axes[0]} direction ($\\AA$)\")\n", - "ax.set_ylabel(f\"{W_mixed.axes[1]} direction ($\\AA$)\");" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Spreading of the dislocation core along the glide plane can be seen in the displacement map after relaxation." + "W_100110_edge_bulk, W_100110_edge_dislo = W_100110_edge.build_cylinder(radius=17)\n", + "show_dislocation(W_100110_edge_dislo, scale=0.3, \n", + " d_name=\"<100>{110} edge\", d_color=[1, 0, 1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### <100>{110} edge 'junction' dislocation\n", - "\n", - "So called junction dislocations with burdgers vector along <100> can be formed in the reactions between more abundant dislocations with burgers vector <111> such as: \n", - "\n", - "$$\n", - " \\frac{1}{2}[1\\bar{1}1] + \\frac{1}{2}[11\\bar{1}] = [100]\n", - "$$\n", + "### <100>{001} edge dislocation\n", "\n", - "They share the same glide plane ad 1/2<111> dislocations and can play important role in impurity segregation. " + "This is the same junction dislocation but lying in a different glide plane: (001)." ] }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -890,49 +654,49 @@ "text": [ "Cell orientation:\n", "[[ 1 0 0]\n", - " [ 0 1 1]\n", - " [ 0 -1 1]]\n", + " [ 0 0 -1]\n", + " [ 0 1 0]]\n", "Burgers vector:\n", - "[3.14339178 0. 0. ]\n" + "[3.14338905 0. 0. ]\n" ] } ], "source": [ - "from matscipy.dislocation import BCCEdge100110Dislocation\n", + "from matscipy.dislocation import BCCEdge100Dislocation\n", "\n", - "W_edge = BCCEdge100110Dislocation(alat, C11, C12, C44, symbol=\"W\")\n", + "W_100_edge = BCCEdge100Dislocation(alat, C11, C12, C44, symbol=\"W\")\n", "\n", "print(\"Cell orientation:\")\n", - "print(W_edge.axes)\n", + "print(W_100_edge.axes)\n", "\n", "print(\"Burgers vector:\")\n", - "print(W_edge.burgers)\n" + "print(W_100_edge.burgers)\n" ] }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "disloc SCF 0 |d1-d2|_inf = 0.2560104778537572\n", - "disloc SCF 1 |d1-d2|_inf = 0.060168332357741605\n", - "disloc SCF 2 |d1-d2|_inf = 0.008688118653886967\n", - "disloc SCF 3 |d1-d2|_inf = 0.002036828550612449\n", - "disloc SCF 4 |d1-d2|_inf = 0.00025500431885919217\n", - "disloc SCF 5 |d1-d2|_inf = 8.301996157844549e-05\n", - "disloc SCF 6 |d1-d2|_inf = 1.657879984715005e-05\n", - "disloc SCF 7 |d1-d2|_inf = 1.7271584200617696e-06\n", - "disloc SCF 8 |d1-d2|_inf = 6.753730281694459e-07\n" + "disloc SCF 0 |d1-d2|_inf = 0.29723896079013645\n", + "disloc SCF 1 |d1-d2|_inf = 0.03893895819760007\n", + "disloc SCF 2 |d1-d2|_inf = 0.011189961805871729\n", + "disloc SCF 3 |d1-d2|_inf = 0.001492901691747324\n", + "disloc SCF 4 |d1-d2|_inf = 0.00046542738716470744\n", + "disloc SCF 5 |d1-d2|_inf = 8.162136711258039e-05\n", + "disloc SCF 6 |d1-d2|_inf = 1.3593036747305831e-05\n", + "disloc SCF 7 |d1-d2|_inf = 4.370960947186475e-06\n", + "disloc SCF 8 |d1-d2|_inf = 5.007713447316431e-07\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "d7fbb8ab564e4cd5868adc766d70fdd3", + "model_id": "f3c5f9df4a574110902f9da11ff7372f", "version_major": 2, "version_minor": 0 }, @@ -945,13 +709,22 @@ } ], "source": [ - "W_edge_bulk, W_edge_dislo = W_edge.build_cylinder(radius=15)\n", - "interactive_view(W_edge_dislo, scale=0.3)" + "W_100_edge_bulk, W_100_edge_dislo = W_100_edge.build_cylinder(radius=20)\n", + "show_dislocation(W_100_edge_dislo, scale=0.4, d_name=\"<100>{001} edge\", d_color=[1, 0, 1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Face Centered Cubic\n", + "\n", + "As an example of FCC material we will consider Ni and an interatomic potential from [Bonny _et. al._](https://www.tandfonline.com/doi/abs/10.1080/14786430903299824)\n" ] }, { "cell_type": "code", - "execution_count": 116, + "execution_count": 15, "metadata": { "tags": [ "hide-output" @@ -962,51 +735,228 @@ "name": "stdout", "output_type": "stream", "text": [ - "PreconLBFGS: 0 18:20:57 -1730.274578 3.4263\n", - "PreconLBFGS: 1 18:20:59 -1730.777063 2.4833\n", - "PreconLBFGS: 2 18:20:59 -1731.178752 2.1508\n", - "PreconLBFGS: 3 18:21:00 -1731.476037 1.8161\n", - "PreconLBFGS: 4 18:21:00 -1731.690456 1.3642\n", - "PreconLBFGS: 5 18:21:01 -1731.853182 0.7967\n", - "PreconLBFGS: 6 18:21:02 -1731.973529 0.6496\n", - "PreconLBFGS: 7 18:21:02 -1732.026735 0.5298\n", - "PreconLBFGS: 8 18:21:03 -1732.042318 0.2324\n", - "PreconLBFGS: 9 18:21:04 -1732.049330 0.1783\n", - "PreconLBFGS: 10 18:21:05 -1732.051240 0.1082\n", - "PreconLBFGS: 11 18:21:06 -1732.052185 0.0623\n", - "PreconLBFGS: 12 18:21:07 -1732.052429 0.0465\n", - "PreconLBFGS: 13 18:21:09 -1732.052507 0.0273\n", - "PreconLBFGS: 14 18:21:10 -1732.052541 0.0196\n", - "PreconLBFGS: 15 18:21:12 -1732.052557 0.0112\n", - "PreconLBFGS: 16 18:21:13 -1732.052567 0.0087\n" + " Step Time Energy fmax\n", + "*Force-consistent energies used in optimization.\n", + "FIRE: 0 15:30:04 -17.801046* 0.0001\n", + "Fitting C_11\n", + "Strain array([-0.02, -0.01, 0. , 0.01, 0.02])\n", + "Stress array([-5.12800014e+00, -2.50333320e+00, -1.41366167e-04, 2.37961959e+00,\n", + " 4.63379565e+00]) GPa\n", + "Cij (gradient) / GPa : 244.0654437182867\n", + "Error in Cij / GPa : 4.217968506243491\n", + "Correlation coefficient : 0.9995522932872427\n", + "Setting C11 (1) to 1.523337 +/- 0.026326\n", + "\n", + "\n", + "Fitting C_21\n", + "Strain array([-0.02, -0.01, 0. , 0.01, 0.02])\n", + "Stress array([-3.37539886e+00, -1.58459192e+00, -1.41366167e-04, 1.38619385e+00,\n", + " 2.58171226e+00]) GPa\n", + "Cij (gradient) / GPa : 148.85008009740656\n", + "Error in Cij / GPa : 6.776719382842348\n", + "Correlation coefficient : 0.9969053432709588\n", + "Setting C21 (7) to 0.929049 +/- 0.042297\n", + "\n", + "\n", + "Fitting C_31\n", + "Strain array([-0.02, -0.01, 0. , 0.01, 0.02])\n", + "Stress array([-3.37539886e+00, -1.58459192e+00, -1.41366167e-04, 1.38619385e+00,\n", + " 2.58171226e+00]) GPa\n", + "Cij (gradient) / GPa : 148.850080097406\n", + "Error in Cij / GPa : 6.776719382842323\n", + "Correlation coefficient : 0.9969053432709588\n", + "Updating C31 (7) with value 0.929049 +/- 0.042297\n", + "\n", + "\n", + "Fitting C_44\n", + "Strain array([-0.02, -0.01, 0. , 0.01, 0.02])\n", + "Stress array([-2.51031965e+00, -1.25545671e+00, -2.54901650e-17, 1.25652507e+00,\n", + " 2.51470655e+00]) GPa\n", + "Cij (gradient) / GPa : 125.62034171207866\n", + "Error in Cij / GPa : 0.0380968152678079\n", + "Correlation coefficient : 0.9999998620414655\n", + "Setting C44 (4) to 0.784061 +/- 0.000238\n", + "\n", + "\n", + "[[b C11 b C12 b C12 b b b ]\n", + " [b C12 b C11 b C12 b b b ]\n", + " [b C12 b C12 b C11 b b b ]\n", + " [b b b b C44 b b ]\n", + " [b b b b b C44 b ]\n", + " [b b b b b b C44]]\n", + "\n", + " = \n", + "\n", + "[[244.07 148.85 148.85 0. 0. 0. ]\n", + " [148.85 244.07 148.85 0. 0. 0. ]\n", + " [148.85 148.85 244.07 0. 0. 0. ]\n", + " [ 0. 0. 0. 125.62 0. 0. ]\n", + " [ 0. 0. 0. 0. 125.62 0. ]\n", + " [ 0. 0. 0. 0. 0. 125.62]]\n", + "C_11 = 244.07 +/- 4.22 GPa\n", + "C_12 = 148.85 +/- 6.78 GPa\n", + "C_44 = 125.62 +/- 0.04 GPa\n" + ] + } + ], + "source": [ + "eam_calc = EAM(\"../../tests/FeCuNi.eam.alloy\")\n", + "\n", + "# the function accepts any ASE type of calculator\n", + "alat, C11, C12, C44 = get_elastic_constants(calculator=eam_calc, symbol=\"Ni\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.520 (Angstrom), 244.07, 148.85, 125.62 (GPa)\n" + ] + } + ], + "source": [ + "print(f\"{alat:.3f} (Angstrom), {C11:.2f}, {C12:.2f}, {C44:.2f} (GPa)\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1/2<110>{111} screw dislocation (perfect and dissociated)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cell orientation:\n", + "[[ 1 1 -2]\n", + " [ 1 1 1]\n", + " [ 1 -1 0]]\n", + "Burgers vector:\n", + "[ 1.76 -1.76 0. ]\n" + ] + } + ], + "source": [ + "from matscipy.dislocation import FCCScrew110Dislocation\n", + "\n", + "Ni_screw = FCCScrew110Dislocation(alat, C11, C12, C44, symbol=\"Ni\")\n", + "\n", + "print(\"Cell orientation:\")\n", + "print(Ni_screw.axes)\n", + "\n", + "print(\"Burgers vector:\")\n", + "print(Ni_screw.burgers)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "disloc SCF 0 |d1-d2|_inf = 0.021791458261984697\n", + "disloc SCF 1 |d1-d2|_inf = 0.0002936041882874109\n", + "disloc SCF 2 |d1-d2|_inf = 4.8928735380371347e-05\n", + "disloc SCF 3 |d1-d2|_inf = 1.2696678054050815e-06\n", + "disloc SCF 4 |d1-d2|_inf = 1.0764587210498888e-07\n", + "disloc SCF 0 |d1-d2|_inf = 0.020321133865591423\n", + "disloc SCF 1 |d1-d2|_inf = 0.0006134137472214689\n", + "disloc SCF 2 |d1-d2|_inf = 5.9406489367308524e-05\n", + "disloc SCF 3 |d1-d2|_inf = 2.948341477265748e-06\n", + "disloc SCF 4 |d1-d2|_inf = 8.340714410803862e-08\n", + "\n", + "Cell vectors:\n", + "[[60.35542726 0. 0. ]\n", + " [ 0. 60.96818843 0. ]\n", + " [ 0. 0. 2.48901587]]\n", + "\n", + "Burgers vector length: 2.49 Angstrom\n" ] }, { "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c4f9f14bc6c84ecebe6c05988046b9d6", + "version_major": 2, + "version_minor": 0 + }, "text/plain": [ - "True" + "NGLWidget()" ] }, - "execution_count": 116, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "W_edge_dislo.calc = eam_calc\n", - "opt = PreconLBFGS(W_edge_dislo)\n", - "opt.run(fmax=0.01)" + "Ni_screw_bulk, Ni_screw_dislo = Ni_screw.build_cylinder(radius=20)\n", + "\n", + "\n", + "print(\"\\nCell vectors:\")\n", + "print(Ni_screw_dislo.cell.array)\n", + "\n", + "print(f\"\\nBurgers vector length: {np.linalg.norm(Ni_screw.burgers):.2f} Angstrom\")\n", + "\n", + "show_dislocation(Ni_screw_dislo, \n", + " d_name=\"1/2<110> screw dislocation line\", \n", + " d_color=[0, 0, 1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Due to stable Intrinsic Stacking Fault (ISF) the 1/2<110> dislocations are not stable and dissociate in two 1/6<112> Shockley partials separated by stacking fault. For example:\n", + "\n", + "$$\n", + " \\frac{1}{2}[1\\bar10] \\rightarrow \\frac{1}{6}[2\\bar1\\bar1] + \\mathrm{ISF} + \\frac{1}{2}[1\\bar21]\n", + "$$\n", + "\n", + "where ISF is intrinsic stacking fault. It is possible to pass a parameter `partial_distance` to `build_cylinder()` function in order to create dissociated dislocation. `partial distance` defines separation distance (length of the stacking fault) of two partial dislocations. The value corresponds to number of glide distances the distance in Angstrom be obtaines as `patial_distance * dislocation.glide_distance`." ] }, { "cell_type": "code", - "execution_count": 117, + "execution_count": 35, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "disloc SCF 0 |d1-d2|_inf = 0.02179145826198453\n", + "disloc SCF 1 |d1-d2|_inf = 0.0002936041882874109\n", + "disloc SCF 2 |d1-d2|_inf = 4.892873538059339e-05\n", + "disloc SCF 3 |d1-d2|_inf = 1.2696678051752307e-06\n", + "disloc SCF 4 |d1-d2|_inf = 1.0764587193845543e-07\n", + "disloc SCF 0 |d1-d2|_inf = 0.020321133865591506\n", + "disloc SCF 1 |d1-d2|_inf = 0.0006134137472214689\n", + "disloc SCF 2 |d1-d2|_inf = 5.9406489367308524e-05\n", + "disloc SCF 3 |d1-d2|_inf = 2.948341477515548e-06\n", + "disloc SCF 4 |d1-d2|_inf = 8.340714444804442e-08\n", + "\n", + "Expected partial distance: 10.8 Angstrom\n" + ] + }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c28fbc37cabf46b7bffb8a6636ed2b1e", + "model_id": "edb77f22bec7476bb0cce5beb1723915", "version_major": 2, "version_minor": 0 }, @@ -1019,21 +969,25 @@ } ], "source": [ - "interactive_view(W_edge_dislo, scale=0.3)" + "Ni_screw_bulk, Ni_screw_dislo = Ni_screw.build_cylinder(radius=20, partial_distance=5)\n", + "print(f\"\\nExpected partial distance: {5 * Ni_screw.glide_distance:.1f} Angstrom\")\n", + "show_dislocation(Ni_screw_dislo, \n", + " partial_distance=5 * Ni_screw.glide_distance,\n", + " d_name=\"1/6<112> Shockley partial screw\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### <100>{001} edge dislocation\n", + "Together with FCC (green) and defect atoms (grey) the CNA algorithm identified the atoms of the stacking fault as HCP structure (pink), which is a result of the local change of stacking order of the atomic layers within the defect.\n", "\n", - "This is the same junction dislocation but lying in a different glide plane." + "### 1/2<110>{111} edge dislocation (perfect and dissociated)" ] }, { "cell_type": "code", - "execution_count": 118, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -1041,50 +995,58 @@ "output_type": "stream", "text": [ "Cell orientation:\n", - "[[ 1 0 0]\n", - " [ 0 0 -1]\n", - " [ 0 1 0]]\n", + "[[ 1 -1 0]\n", + " [ 1 1 1]\n", + " [-1 -1 2]]\n", "Burgers vector:\n", - "[3.14339178 0. 0. ]\n" + "[ 1.76 -1.76 0. ]\n" ] } ], "source": [ - "from matscipy.dislocation import BCCEdge100Dislocation\n", + "from matscipy.dislocation import FCCEdge110Dislocation\n", "\n", - "W_edge = BCCEdge100Dislocation(alat, C11, C12, C44, symbol=\"W\")\n", + "Ni_edge = FCCEdge110Dislocation(alat, C11, C12, C44, symbol=\"Ni\")\n", "\n", "print(\"Cell orientation:\")\n", - "print(W_edge.axes)\n", + "print(Ni_edge.axes)\n", "\n", "print(\"Burgers vector:\")\n", - "print(W_edge.burgers)\n" + "print(Ni_edge.burgers)\n" ] }, { "cell_type": "code", - "execution_count": 119, + "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "disloc SCF 0 |d1-d2|_inf = 0.2972369526680858\n", - "disloc SCF 1 |d1-d2|_inf = 0.038938521701512574\n", - "disloc SCF 2 |d1-d2|_inf = 0.011189887637262474\n", - "disloc SCF 3 |d1-d2|_inf = 0.0014928978841749763\n", - "disloc SCF 4 |d1-d2|_inf = 0.0004654204442429144\n", - "disloc SCF 5 |d1-d2|_inf = 8.16202896045462e-05\n", - "disloc SCF 6 |d1-d2|_inf = 1.3592535523576643e-05\n", - "disloc SCF 7 |d1-d2|_inf = 4.370933882835715e-06\n", - "disloc SCF 8 |d1-d2|_inf = 5.007789461095036e-07\n" + "disloc SCF 0 |d1-d2|_inf = 0.04310715442453525\n", + "disloc SCF 1 |d1-d2|_inf = 0.0031359890399249857\n", + "disloc SCF 2 |d1-d2|_inf = 0.00018078113282300745\n", + "disloc SCF 3 |d1-d2|_inf = 1.4501349156037513e-05\n", + "disloc SCF 4 |d1-d2|_inf = 9.978781161934513e-07\n", + "disloc SCF 0 |d1-d2|_inf = 0.03462421627571943\n", + "disloc SCF 1 |d1-d2|_inf = 0.0022123322463467043\n", + "disloc SCF 2 |d1-d2|_inf = 0.00021564683900149317\n", + "disloc SCF 3 |d1-d2|_inf = 1.1838612354972411e-05\n", + "disloc SCF 4 |d1-d2|_inf = 6.324895580611667e-07\n", + "\n", + "Cell vectors:\n", + "[[64.71441261 0. 0. ]\n", + " [ 0. 60.96818843 0. ]\n", + " [ 0. 0. 4.31110195]]\n", + "\n", + "Burgers vector length: 2.49 Angstrom\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "2a990407a4144ae097f576fd3a8fa971", + "model_id": "1329680a67d3459ca901a4ccb7c66955", "version_major": 2, "version_minor": 0 }, @@ -1097,13 +1059,73 @@ } ], "source": [ - "W_edge_bulk, W_edge_dislo = W_edge.build_cylinder(radius=15)\n", - "interactive_view(W_edge_dislo, scale=0.4)" + "Ni_edge_bulk, Ni_edge_dislo = Ni_edge.build_cylinder(radius=20)\n", + "\n", + "print(\"\\nCell vectors:\")\n", + "print(Ni_edge_dislo.cell.array)\n", + "\n", + "print(f\"\\nBurgers vector length: {np.linalg.norm(Ni_edge.burgers):.2f} Angstrom\")\n", + "\n", + "show_dislocation(Ni_edge_dislo, d_name=\"1/2<110> edge\", d_color=[0, 0, 1])" ] }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "disloc SCF 0 |d1-d2|_inf = 0.04310715442453525\n", + "disloc SCF 1 |d1-d2|_inf = 0.0031359890399249857\n", + "disloc SCF 2 |d1-d2|_inf = 0.00018078113282300745\n", + "disloc SCF 3 |d1-d2|_inf = 1.4501349155759957e-05\n", + "disloc SCF 4 |d1-d2|_inf = 9.978781162003902e-07\n", + "disloc SCF 0 |d1-d2|_inf = 0.03462421627571943\n", + "disloc SCF 1 |d1-d2|_inf = 0.002212332246347065\n", + "disloc SCF 2 |d1-d2|_inf = 0.00021564683900149317\n", + "disloc SCF 3 |d1-d2|_inf = 1.1838612354972411e-05\n", + "disloc SCF 4 |d1-d2|_inf = 6.324895580611667e-07\n", + "Expected partial distance: 12.4 Angstrom\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cbffabd9c6eb418f91e58d021cd4912e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "NGLWidget()" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Ni_edge_bulk, Ni_edge_dislo = Ni_edge.build_cylinder(radius=20, partial_distance=10)\n", + "print(f\"\\nExpected partial distance: {10 * Ni_edge.glide_distance:.1f} Angstrom\")\n", + "show_dislocation(Ni_edge_dislo, \n", + " partial_distance=10 * Ni_edge.glide_distance, \n", + " d_name=\"1/2<110> Shockley partial edge\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Diamond Cubic\n", + "\n", + "As an example of diamond structure we will use Si and potential from [work of D. Holland and M. Marder](https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.80.746)." + ] + }, + { + "cell_type": "code", + "execution_count": 23, "metadata": { "tags": [ "hide-output" @@ -1114,52 +1136,240 @@ "name": "stdout", "output_type": "stream", "text": [ - "PreconLBFGS: 0 18:21:44 -1197.049020 4.0122\n", - "PreconLBFGS: 1 18:21:46 -1197.620258 2.9055\n", - "PreconLBFGS: 2 18:21:46 -1198.067899 2.6049\n", - "PreconLBFGS: 3 18:21:47 -1198.399388 2.4441\n", - "PreconLBFGS: 4 18:21:47 -1198.586897 1.1265\n", - "PreconLBFGS: 5 18:21:47 -1198.671152 1.3040\n", - "PreconLBFGS: 6 18:21:48 -1198.697964 0.7715\n", - "PreconLBFGS: 7 18:21:49 -1198.716499 0.2101\n", - "PreconLBFGS: 8 18:21:50 -1198.718510 0.1449\n", - "PreconLBFGS: 9 18:21:50 -1198.719648 0.1189\n", - "PreconLBFGS: 10 18:21:51 -1198.720365 0.0850\n", - "PreconLBFGS: 11 18:21:52 -1198.720723 0.0767\n", - "PreconLBFGS: 12 18:21:53 -1198.720870 0.0402\n", - "PreconLBFGS: 13 18:21:54 -1198.720932 0.0269\n", - "PreconLBFGS: 14 18:21:55 -1198.720978 0.0333\n", - "PreconLBFGS: 15 18:21:56 -1198.721004 0.0175\n", - "PreconLBFGS: 16 18:21:57 -1198.721017 0.0121\n", - "PreconLBFGS: 17 18:21:58 -1198.721022 0.0046\n" + " Step Time Energy fmax\n", + "*Force-consistent energies used in optimization.\n", + "FIRE: 0 15:30:06 -34.692786* 0.0922\n", + "FIRE: 1 15:30:06 -34.692742* 0.1881\n", + "FIRE: 2 15:30:06 -34.692797* 0.0452\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "FIRE: 3 15:30:06 -34.692771* 0.1323\n", + "FIRE: 4 15:30:06 -34.692781* 0.1071\n", + "FIRE: 5 15:30:06 -34.692794* 0.0616\n", + "FIRE: 6 15:30:06 -34.692800* 0.0043\n", + "FIRE: 7 15:30:06 -34.692795* 0.0537\n", + "FIRE: 8 15:30:06 -34.692796* 0.0511\n", + "FIRE: 9 15:30:06 -34.692796* 0.0461\n", + "FIRE: 10 15:30:06 -34.692798* 0.0390\n", + "FIRE: 11 15:30:06 -34.692799* 0.0299\n", + "FIRE: 12 15:30:06 -34.692799* 0.0195\n", + "FIRE: 13 15:30:06 -34.692800* 0.0081\n", + "FIRE: 14 15:30:06 -34.692800* 0.0036\n", + "FIRE: 15 15:30:06 -34.692800* 0.0036\n", + "FIRE: 16 15:30:06 -34.692800* 0.0035\n", + "FIRE: 17 15:30:06 -34.692800* 0.0034\n", + "FIRE: 18 15:30:06 -34.692800* 0.0032\n", + "FIRE: 19 15:30:06 -34.692800* 0.0030\n", + "FIRE: 20 15:30:06 -34.692800* 0.0028\n", + "FIRE: 21 15:30:06 -34.692800* 0.0025\n", + "FIRE: 22 15:30:06 -34.692800* 0.0022\n", + "FIRE: 23 15:30:06 -34.692800* 0.0017\n", + "FIRE: 24 15:30:06 -34.692800* 0.0013\n", + "FIRE: 25 15:30:06 -34.692800* 0.0007\n", + "FIRE: 26 15:30:06 -34.692800* 0.0000\n", + "Fitting C_11\n", + "Strain array([-0.02, -0.01, 0. , 0.01, 0.02])\n", + "Stress array([-4.18437928e+00, -2.05313584e+00, -2.57946679e-05, 1.97559670e+00,\n", + " 3.87433910e+00]) GPa\n", + "Cij (gradient) / GPa : 201.46169296718193\n", + "Error in Cij / GPa : 2.6470882834179283\n", + "Correlation coefficient : 0.999741134311275\n", + "Setting C11 (1) to 1.257425 +/- 0.016522\n", + "\n", + "\n", + "Fitting C_21\n", + "Strain array([-0.02, -0.01, 0. , 0.01, 0.02])\n", + "Stress array([-1.13686951e+00, -5.40672589e-01, -2.57946679e-05, 4.89041361e-01,\n", + " 9.30285346e-01]) GPa\n", + "Cij (gradient) / GPa : 51.640236590323106\n", + "Error in Cij / GPa : 1.7644327851076396\n", + "Correlation coefficient : 0.9982534295801976\n", + "Setting C21 (7) to 0.322313 +/- 0.011013\n", + "\n", + "\n", + "Fitting C_31\n", + "Strain array([-0.02, -0.01, 0. , 0.01, 0.02])\n", + "Stress array([-1.13686951e+00, -5.40672589e-01, -2.57946679e-05, 4.89041361e-01,\n", + " 9.30285346e-01]) GPa\n", + "Cij (gradient) / GPa : 51.64023659032299\n", + "Error in Cij / GPa : 1.764432785107523\n", + "Correlation coefficient : 0.9982534295801978\n", + "Updating C31 (7) with value 0.322313 +/- 0.011013\n", + "\n", + "\n", + "Fitting C_44\n", + "Strain array([-0.02, -0.01, 0. , 0.01, 0.02])\n", + "Stress array([-2.43911684e+00, -1.19995048e+00, 2.16046225e-14, 1.16236368e+00,\n", + " 2.28858547e+00]) GPa\n", + "Cij (gradient) / GPa : 118.17718786807852\n", + "Error in Cij / GPa : 1.2857535435707688\n", + "Correlation coefficient : 0.9998224896147394\n", + "Setting C44 (4) to 0.737604 +/- 0.008025\n", + "\n", + "\n", + "[[b C11 b C12 b C12 b b b ]\n", + " [b C12 b C11 b C12 b b b ]\n", + " [b C12 b C12 b C11 b b b ]\n", + " [b b b b C44 b b ]\n", + " [b b b b b C44 b ]\n", + " [b b b b b b C44]]\n", + "\n", + " = \n", + "\n", + "[[201.46 51.64 51.64 0. 0. 0. ]\n", + " [ 51.64 201.46 51.64 0. 0. 0. ]\n", + " [ 51.64 51.64 201.46 0. 0. 0. ]\n", + " [ 0. 0. 0. 118.18 0. 0. ]\n", + " [ 0. 0. 0. 0. 118.18 0. ]\n", + " [ 0. 0. 0. 0. 0. 118.18]]\n", + "C_11 = 201.46 +/- 2.65 GPa\n", + "C_12 = 51.64 +/- 1.76 GPa\n", + "C_44 = 118.18 +/- 1.29 GPa\n" + ] + } + ], + "source": [ + "from matscipy.calculators.manybody.explicit_forms.stillinger_weber import StillingerWeber,\\\n", + " Holland_Marder_PRL_80_746_Si\n", + "from matscipy.calculators.manybody import Manybody\n", + "calc = Manybody(**StillingerWeber(Holland_Marder_PRL_80_746_Si))\n", + "\n", + "# the function accepts any ASE type of calculator\n", + "alat, C11, C12, C44 = get_elastic_constants(calculator=calc, symbol=\"Si\")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5.431 (Angstrom), 201.46, 51.64, 118.18 (GPa)\n" + ] + } + ], + "source": [ + "print(f\"{alat:.3f} (Angstrom), {C11:.2f}, {C12:.2f}, {C44:.2f} (GPa)\")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cell orientation:\n", + "[[ 1 1 -2]\n", + " [ 1 1 1]\n", + " [ 1 -1 0]]\n", + "Burgers vector:\n", + "[ 2.71547466 -2.71547466 0. ]\n" + ] + } + ], + "source": [ + "from matscipy.dislocation import DiamondGlideScrew\n", + "\n", + "Si_screw = DiamondGlideScrew(alat, C11, C12, C44, symbol=\"Si\")\n", + "\n", + "print(\"Cell orientation:\")\n", + "print(Si_screw.axes)\n", + "\n", + "print(\"Burgers vector:\")\n", + "print(Si_screw.burgers)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1/2<110>{111} screw dislocation (perfect and dissociated)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Cell vectors:\n", + "[[66.51527324 0. 0. ]\n", + " [ 0. 75.25344122 0. ]\n", + " [ 0. 0. 3.84026109]]\n", + "\n", + "Burgers vector length: 3.84 Angstrom\n" ] }, { "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f7355f892a57430e9b62045a228e9ac3", + "version_major": 2, + "version_minor": 0 + }, "text/plain": [ - "True" + "NGLWidget()" ] }, - "execution_count": 120, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "W_edge_dislo.calc = eam_calc\n", - "opt = PreconLBFGS(W_edge_dislo)\n", - "opt.run(fmax=0.01)" + "Si_screw_bulk, Si_screw_dislo = Si_screw.build_cylinder(radius=20)\n", + "\n", + "print(\"\\nCell vectors:\")\n", + "print(Si_screw_dislo.cell.array)\n", + "\n", + "print(f\"\\nBurgers vector length: {np.linalg.norm(Si_screw.burgers):.2f} Angstrom\")\n", + "\n", + "show_dislocation(Si_screw_dislo, \n", + " diamond_structure=True, \n", + " scale=0.3, \n", + " add_bonds=True, # bonds make it a bit easier to see the structure\n", + " d_name=\"1/2<110> screw\", \n", + " d_color=[0, 0, 1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The modification of the CNA algorithm for the diamond structure identifies the defect atoms gradually depending how _far_ they are from the perfect structure. The important outcome for us is now dislocation core and free surface atoms are identified as 1st and 2nd neighbors of the _Cubic diamond_ structure. \n", + "\n", + "As in FCC structure similar dissociation mechanism exists in diamond structure." ] }, { "cell_type": "code", - "execution_count": 121, + "execution_count": 27, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Expected partial distance: 16.6 Angstrom\n" + ] + }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "a0056c8ee94a4568b71887325358d4b4", + "model_id": "ee85e17cbfb74e9fab64ef50de7c4517", "version_major": 2, "version_minor": 0 }, @@ -1172,36 +1382,163 @@ } ], "source": [ - "interactive_view(W_edge_dislo, scale=0.4)" + "Si_screw_bulk, Si_screw_dislo = Si_screw.build_cylinder(radius=20, partial_distance=5)\n", + "\n", + "print(f\"Expected partial distance: {5 * Si_screw.glide_distance:.1f} Angstrom\")\n", + "show_dislocation(Si_screw_dislo, \n", + " diamond_structure=True, # bonds make it a bit easier to see the structure\n", + " scale=0.3, add_bonds=True, \n", + " partial_distance=5 * Si_screw.glide_distance, \n", + " d_name=\"1/6<112> 30 degree partial screw\") " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Face Centered Cubic\n", + "The stacking fault atoms are identified as _Hexagonal diamond_ structure.\n", "\n", - "Work in progress." + "### 1/2<110>{111} 60 degree screw dislocation (perfect and dissociated)\n", + "\n", + "Due to the particular symmetry of cubic diamond structure, there exist dislocations with 60 degree angle between burgers vector and dislocation line. This dislocation can dissociate in two partials: 30 and 90 degree." ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 28, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cell orientation:\n", + "[[ 1 1 -2]\n", + " [ 1 1 1]\n", + " [ 1 -1 0]]\n", + "Burgers vector:\n", + "[ 2.71547466 -2.71547466 0. ]\n" + ] + } + ], "source": [ - "## Diamond \n", + "from matscipy.dislocation import DiamondGlide60Degree\n", + "\n", + "Si_60_degree_screw = DiamondGlide60Degree(alat, C11, C12, C44, symbol=\"Si\")\n", "\n", - "Work in progress." + "print(\"Cell orientation:\")\n", + "print(Si_screw.axes)\n", + "\n", + "print(\"Burgers vector:\")\n", + "print(Si_screw.burgers)\n" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 29, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Cell vectors:\n", + "[[66.51527324 0. 0. ]\n", + " [ 0. 75.25344122 0. ]\n", + " [ 0. 0. 3.84026109]]\n", + "\n", + "Burgers vector length: 3.84 Angstrom\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8d7eb594109f426e99d12a4a0d60125b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "NGLWidget()" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Si_60_degree_screw_bulk, \\\n", + "Si_60_degree_screw_dislo = Si_60_degree_screw.build_cylinder(radius=20)\n", + "\n", + "print(\"\\nCell vectors:\")\n", + "print(Si_60_degree_screw_dislo.cell.array)\n", + "\n", + "print(f\"\\nBurgers vector length: {np.linalg.norm(Si_60_degree_screw.burgers):.2f} Angstrom\")\n", + "\n", + "show_dislocation(Si_60_degree_screw_dislo, \n", + " diamond_structure=True, \n", + " scale=0.3, add_bonds=True,\n", + " d_name=\"1/2<110> 60 degree screw\", \n", + " d_color=[0, 0, 1])" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Expected partial distance: 16.6 Angstrom\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8844142c06074a1ea1d1ceae83239da3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "NGLWidget()" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Si_60_degree_screw_bulk, \\\n", + "Si_60_degree_screw_dislo = Si_60_degree_screw.build_cylinder(radius=20, \n", + " partial_distance=5)\n", + "\n", + "print(f\"Expected partial distance: {5 * Si_60_degree_screw.glide_distance:.1f} Angstrom\")\n", + "show_dislocation(Si_60_degree_screw_dislo, \n", + " diamond_structure=True, \n", + " scale=0.3, \n", + " add_bonds=True, \n", + " d_color=[1, 0, 1],\n", + " partial_distance=5 * Si_screw.glide_distance, \n", + " d_name=[\"1/6<112> 90 degree partial screw\", \n", + " \"1/6<112> 30 degree partial screw\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [] } ], "metadata": { + "execution": { + "timeout": 180 + }, "kernelspec": { - "display_name": "base", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1216,9 +1553,8 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.15" - }, - "orig_nbformat": 4 + } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/docs/applications/plasticity.rst b/docs/applications/plasticity.rst index 2c5ca748..49eeefa0 100644 --- a/docs/applications/plasticity.rst +++ b/docs/applications/plasticity.rst @@ -3,7 +3,17 @@ Plasticity For large loads, solids can respond with irreversible deformation. One form of irreversibility is plasticity, that is carried by extended defects, the dislocations, in crystals. The module :mod:`matscipy.dislocation` implements tools for studying structure and movement of dislocations. Construction and analysis of model atomic systems is implemented for compact and dissociated screw, as well as edge dislocations in cubic crystals. The implementation supports ideal straight as well as kinked dislocations. -Creating an atomistic system containing a dislocation requires a rather deep knowledge of crystallographic system, elastisity theory as well as hands on experience with atomistic simulations. Thus, it can be challenging for people not familiar to the field. Within this module we attempt to create a flexible, friendly and pythonic tool to enable atomistic simulations of dislocations with ease. The base of the model is :class:`matscipy.dislocation.CubicCrystalDislocation` class that contains all the necessary information to create an atomistic dislocation. To start experimenting, a user only has to choose the dislocation of interest and provide a lattice parameter and elastic constants. +Creating an atomistic system containing a dislocation requires a rather deep knowledge of crystallographic system, elasticity theory as well as hands on experience with atomistic simulations. Thus, it can be challenging for people not familiar to the field. Within this module we attempt to create a flexible, friendly and pythonic tool to enable atomistic simulations of dislocations with ease. The base of the model is :class:`matscipy.dislocation.CubicCrystalDislocation` class that contains all the necessary information to create an atomistic dislocation. To start experimenting, a user only has to choose the dislocation of interest and provide a lattice parameter and elastic constants. + +Installation and tests +---------------------- + +:mod:`matscipy.dislocation` module relies on the anisotropic elasticity theory solution within Stroh formalism implemented in `atomman `_ package. `atomman `_ is not a part of default dependency of :mod:`matscipy`, however it can be easily installed with ``pip install atomman``. To test your installation you can run ``pytest test_dislocation.py`` from ``tests`` directory of the repository. If atomman is not installed, most of the tests will be skipped resulting in the output similar to the following: ``ssssssssssssss..ssssssss..s.ssssssss.s`` where ``s`` stands for skipped test and ``.`` for passed tests. You can see which test are skipped together with the reasoning behind by running pytest in verbose mode with ``pytest -v test_dislocation.py``. Once you have atomman installed you should have corresponding tests passing and should be able to use the code. If you plan to use `LAMMPS `_ and `lammps python module `_ there are couple of test that will test your installation when `lammps python module `_ is detected. + +The majority of the tests (~70 %) are used during the development and adding new dislocations to the module. The idea is to check if `Dislocation analysis (DXA) `_ algorithm detects the same dislocation as we intend to create. These tests require `OVITO python interface `_ to be installed and are skipped if it is not detected. If you do not plan to add new structures to the module, you can safely ignore these tests. + +Tutorials: +--------- .. toctree:: diff --git a/docs/applications/visualisation.py b/docs/applications/visualisation.py new file mode 100644 index 00000000..e37590d5 --- /dev/null +++ b/docs/applications/visualisation.py @@ -0,0 +1,130 @@ +import numpy as np + +from ovito.io.ase import ase_to_ovito +from ovito.modifiers import CommonNeighborAnalysisModifier, IdentifyDiamondModifier +from ovito.pipeline import StaticSource, Pipeline + +# Get the results of Ovito Common Neighbor Analysis +# https://www.ovito.org/docs/current/reference/pipelines/modifiers/common_neighbor_analysis.html +# and Identify Diamond modifier +# https://www.ovito.org/docs/current/reference/pipelines/modifiers/identify_diamond.html +# for better visualisation of the dislocation core +# it will be identified as "other" structure type +def get_structure_types(structure, diamond_structure=False): + """Get the results of Common Neighbor Analysis and + Identify Diamond modifiers from Ovito + Args: + structure (ase.atoms): input structure + Returns: + atom_labels (array of ints): per atom labels of the structure types + structure_names (list of strings): names of the structure types + colors (list of strings): colors of the structure types in hex format + """ + ovito_structure = structure.copy() + if "fix_mask" in ovito_structure.arrays: + del ovito_structure.arrays["fix_mask"] + + if diamond_structure: + modifier = IdentifyDiamondModifier() + else: + modifier = CommonNeighborAnalysisModifier() + + data = ase_to_ovito(ovito_structure) + pipeline = Pipeline(source=StaticSource(data=data)) + pipeline.modifiers.append(modifier) + data = pipeline.compute() + + atom_labels = data.particles['Structure Type'].array + + structure_names = [structure.name for structure in modifier.structures] + colors = [structure.color for structure in modifier.structures] + hex_colors = ['#{:02x}{:02x}{:02x}'.format(int(r*255), int(g*255), int(b*255)) for r, g, b in colors] + + return atom_labels, structure_names, hex_colors + +# interactive visualisation inside the notebook with nglview +from nglview import show_ase, ASEStructure + +def add_dislocation(view, system, name, color=[0, 1, 0], x_shift=0.0): + '''Add dislocation line to the view as a cylinder and two cones. + The cylinder is hollow by default so the second cylinder is needed to close it. + In case partial distance is provided, two dislocation lines are added and are shifter accordingly. + ''' + + center = system.positions.mean(axis=0) + view.shape.add_cylinder((center[0] + x_shift, center[1], -2.0), + (center[0] + x_shift, center[1], system.cell[2][2] - 0.5), + color, + [0.3], + name) + + view.shape.add_cone((center[0] + x_shift, center[1], -2.0), + (center[0] + x_shift, center[1], 0.5), + color, + [0.3], + name) + + view.shape.add_cone((center[0] + x_shift, center[1], system.cell[2][2] - 0.5), + (center[0] + x_shift, center[1], system.cell[2][2] + 1.0), + color, + [0.55], + name) + + +def show_dislocation(system, scale=0.5, diamond_structure=False, add_bonds=False, + d_name='', d_color=[0, 1, 0], partial_distance=None): + + atom_labels, structure_names, colors = get_structure_types(system, + diamond_structure=diamond_structure) + + view = show_ase(system) + view.hide([0]) + + if add_bonds: # add bonds between all atoms to have bonds between structures + component = view.add_component(ASEStructure(system), default_representation=False, name='between structures') + component.add_ball_and_stick(cylinderOnly=True, radiusType='covalent', radiusScale=scale, aspectRatio=0.1) + + for structure_type in np.unique(atom_labels): + # every structure type is a different component + mask = atom_labels == structure_type + component = view.add_component(ASEStructure(system[mask]), + default_representation=False, name=str(structure_names[structure_type])) + if add_bonds: + component.add_ball_and_stick(color=colors[structure_type], radiusType='covalent', radiusScale=scale) + else: + component.add_spacefill(color=colors[structure_type], radiusType='covalent', radiusScale=scale) + + component.add_unitcell() + + if partial_distance is None: + add_dislocation(view, system, d_name + ' dislocation line', d_color) + else: + if type(d_name) == list: + add_dislocation(view, system, d_name[0] + ' dislocation line', d_color, x_shift= -partial_distance / 2.0) + add_dislocation(view, system, d_name[1] + ' dislocation line', d_color, x_shift= partial_distance / 2.0) + else: + add_dislocation(view, system, d_name + ' dislocation line', d_color, x_shift= -partial_distance / 2.0) + add_dislocation(view, system, d_name + ' dislocation line', d_color, x_shift= partial_distance / 2.0) + + view.camera = 'orthographic' + view.parameters = {"clipDist": 0} + + view._remote_call("setSize", target="Widget", args=["700px", "400px"]) + view.center() + + tooltip_js = """ + this.stage.mouseControls.add('hoverPick', (stage, pickingProxy) => { + let tooltip = this.stage.tooltip; + if(pickingProxy && pickingProxy.atom && !pickingProxy.bond){ + let atom = pickingProxy.atom; + tooltip.innerText = atom.atomname + " atom: " + atom.structure.name; + } else if (pickingProxy && pickingProxy.bond){ + let bond = pickingProxy.bond; + tooltip.innerText = bond.atom1.atomname + "-" + bond.atom2.atomname + " bond: " + bond.structure.name; + } else if (pickingProxy && pickingProxy.unitcell){ + tooltip.innerText = "Unit cell"; + } + }); + """ + view._js(tooltip_js) + return view \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index e18f2aa6..e49893a5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -44,7 +44,8 @@ 'sphinx.ext.autosummary', 'sphinx.ext.mathjax', 'myst_nb', - 'numpydoc' + 'numpydoc', + 'sphinx_copybutton', ] # Add any paths that contain templates here, relative to this directory. @@ -61,7 +62,7 @@ # General information about the project. project = u'matscipy' -copyright = u'2015, James Kermode, Lars Pastewka' +copyright = u'2023, James Kermode, Lars Pastewka, et al' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the diff --git a/pyproject.toml b/pyproject.toml index 506bd38f..8e073428 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,9 @@ docs = [ "myst_nb", "nglview", "numpydoc", - "atomman" + "atomman", + "ovito", + "sphinx_copybutton" ] [project.urls]