{
"cells": [
{
"cell_type": "markdown",
"id": "7ca8f051",
"metadata": {},
"source": [
"# Elastic and piezoelectric properties with Abinit and AbiPy"
]
},
{
"cell_type": "markdown",
"id": "b2f0c006",
"metadata": {},
"source": [
"This tutorial shows how to calculate the following physical properties related to strain:\n",
"\n",
" * the *clamped-ion* elastic tensor\n",
" * the *clamped-ion* piezoelectric tensor (insulators only)\n",
" * the *internal* strain tensor\n",
" * the atomic relaxation corrections to the elastic and piezoelectric tensor (*relaxed-ion tensors*)\n",
"\n",
"The discussion is based on the [tutorial on elastic properties](https://docs.abinit.org/tutorial/elastic/)\n",
"available on the Abinit web site.\n",
"More specifically, we will discuss how to\n",
"\n",
" * build a flow to compute all the ingredients needed for elastic and piezoelectric tensors\n",
" * use anaddb and AbiPy to obtain the tensors and compute several important physical properties\n",
" starting from the final DDB file produced by the flow\n",
" * perform a convergence study with respect to the k-mesh and use the `DdbRobot` to analyze the convergence.\n",
"\n",
"You might find additional material related to the present section\n",
"in the following references (already mentioned in the official tutorial):\n",
"\n",
"* [Systematic treatment of displacements, strains, and electric fields in density-functional perturbation theory](https://dx.doi.org/10.1103/physrevb.72.035105)\n",
"* [Metric tensor formulation of strain in density-functional perturbation theory](https://doi.org/10.1103/physrevb.71.035117)\n",
"\n",
"The first paper provides a detailed discussion of the theory underlying the incorporation\n",
"of atom-relaxation corrections.\n",
"We strongly recommend to read this article as this notebook will mainly focus on the usage\n",
"of the python API assuming you are already familiar with the theoretical aspects.\n",
"The second paper discusses in more details the DFPT treatment of strain perturbations in Abinit.\n",
"\n",
"If you are already familiar with python and AbiPy-Abinit are already installed and configured,\n",
"you may want to use directly the command line interface.\n",
"There is a README.md file in the directory of this lesson explaining how to analyze the data from the shell\n",
"using ipython and matplotlib.\n",
"\n",
"```{note}\n",
"The code in this notebook requires abinit >= 8.9 and abipy >= 0.6\n",
"```\n",
"\n",
"## DFPT calculation of elastic and piezolectric tensors\n",
"\n",
"Before starting, we need to import the python modules and the functions needed in the notebook:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "2269fc2e",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import warnings\n",
"warnings.filterwarnings(\"ignore\") # to get rid of deprecation warnings\n",
"\n",
"from abipy import abilab\n",
"abilab.enable_notebook() # This line tells AbiPy we are running inside a notebook\n",
"import abipy.flowtk as flowtk\n",
"\n",
"# This line configures matplotlib to show figures embedded in the notebook.\n",
"# Replace `inline` with `notebook` in classic notebook\n",
"%matplotlib inline\n",
"\n",
"# Option available in jupyterlab. See https://github.com/matplotlib/jupyter-matplotlib\n",
"#%matplotlib widget"
]
},
{
"cell_type": "markdown",
"id": "cf5c0b6d",
"metadata": {},
"source": [
"and an useful function from the `lesson_elastic` module required to generate our DFPT flows:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "fb2bd86e",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
"\n",
"\n",
" \n",
"\n",
"def make_scf_input ( ngkpt = ( 4 , 4 , 4 )): \n",
" """ \n",
" This function constructs the input file for the GS calculation of \n",
" AlAs in hypothetical wurzite (hexagonal) structure. \n",
" In principle, the stucture should be relaxed before starting the calculation, \n",
" here we use the *unrelaxed* geometry of the official tutorial. \n",
"\n",
" Args: \n",
" ngkpt: K-mesh used both in the GS and in the DFPT part. \n",
" """ \n",
"\n",
" # Initialize structure. Use enough significant digits \n",
" # so that Abinit will recognize the correct spacegroup \n",
" # (Hexagonal and rhombohedral lattices are a bit problematic). \n",
" structure = abilab . Structure . from_abivars ( \n",
" acell = [ 7.5389648144E+00 , 7.5389648144E+00 , 1.2277795374E+01 ], \n",
" natom = 4 , \n",
" ntypat = 2 , \n",
" rprim = [ np . sqrt ( 0.75 ), 0.5 , 0.0 , \n",
" - np . sqrt ( 0.75 ), 0.5 , 0.0 , \n",
" 0.0 , 0.0 , 1.0 ], \n",
" typat = [ 1 , 1 , 2 , 2 ], \n",
" xred = [ 1 / 3 , 2 / 3 , 0 , \n",
" 2 / 3 , 1 / 3 , 1 / 2 , \n",
" 1 / 3 , 2 / 3 , 3.7608588373E-01 , \n",
" 2 / 3 , 1 / 3 , 8.7608588373E-01 ], \n",
" znucl = [ 13 , 33 ], \n",
" ) \n",
"\n",
" pseudos = abidata . pseudos ( "13al.pspnc" , "33as.pspnc" ) \n",
" gs_inp = abilab . AbinitInput ( structure , pseudos = pseudos ) \n",
"\n",
" # Set other important variables (consistent with tutorial) \n",
" # All the other DFPT runs will inherit these parameters. \n",
" gs_inp . set_vars ( \n",
" nband = 8 , \n",
" ecut = 6.0 , \n",
" ecutsm = 0.5 , # Important when performing structural optimization \n",
" # with variable cell. All DFPT calculations should use \n",
" # the same value to be consistent. \n",
" ngkpt = ngkpt , \n",
" nshiftk = 1 , \n",
" shiftk = [ 0.0 , 0.0 , 0.5 ], # This choice preserves the hexagonal symmetry of the grid. \n",
" diemac = 9.0 , \n",
" nstep = 40 , \n",
" paral_kgb = 0 , \n",
" tolvrs = 1.0e-18 , \n",
" ) \n",
"\n",
" return gs_inp \n",
" \n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from lesson_elastic import make_scf_input\n",
"abilab.print_source(make_scf_input)"
]
},
{
"cell_type": "markdown",
"id": "c8394a0f",
"metadata": {},
"source": [
"The function makes some assumptions for important parameters such as\n",
"the crystalline structure and the pseudos.\n",
"This is done on purpose to keep the code as simple as possible.\n",
"It should not be so difficult to generalize the implementation to take into account other cases.\n",
"Note how the function accepts an optional argument {{ngkpt}} defining the **k**-mesh so that we can easily\n",
"change the sampling *e.g.* for convergence studies.\n",
"\n",
"Let's start to play with our new function:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "395b4b6a",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"##############################################
#### SECTION: basic
##############################################
nband 8
ecut 6.0
ngkpt 4 4 4
nshiftk 1
shiftk 0.0 0.0 0.5
nstep 40
tolvrs 1e-18
##############################################
#### SECTION: files
##############################################
indata_prefix indata/in
tmpdata_prefix tmpdata/tmp
outdata_prefix outdata/out
pp_dirpath /usr/share/miniconda/envs/abipy/lib/python3.12/site-packages/abipy/data/pseudos
pseudos 13al.pspnc 33as.pspnc
##############################################
#### SECTION: gstate
##############################################
diemac 9.0
##############################################
#### SECTION: paral
##############################################
paral_kgb 0
##############################################
#### SECTION: rlx
##############################################
ecutsm 0.5
##############################################
#### STRUCTURE
##############################################
natom 4
ntypat 2
typat 1 1 2
2
znucl 13 33
xred 0.3333333333 0.6666666667 0.0000000000
0.6666666667 0.3333333333 0.5000000000
0.3333333333 0.6666666667 0.3760858837
0.6666666667 0.3333333333 0.8760858837
acell 1.0 1.0 1.0
rprim 6.5289350475 3.7694824072 0.0000000000
-6.5289350475 3.7694824072 0.0000000000
0.0000000000 0.0000000000 12.2777953740\n",
"
"
],
"text/plain": [
"
"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"scf_input = make_scf_input()\n",
"scf_input"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "3b38f992",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Full Formula (Al2 As2)\n",
"Reduced Formula: AlAs\n",
"abc : 3.989448 3.989448 6.497130\n",
"angles: 90.000000 90.000000 120.000000\n",
"pbc : True True True\n",
"Sites (4)\n",
" # SP a b c\n",
"--- ---- -------- -------- --------\n",
" 0 Al 0.333333 0.666667 0\n",
" 1 Al 0.666667 0.333333 0.5\n",
" 2 As 0.333333 0.666667 0.376086\n",
" 3 As 0.666667 0.333333 0.876086\n"
]
}
],
"source": [
"print(scf_input.structure)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "55143050",
"metadata": {},
"outputs": [
{
"ename": "AttributeError",
"evalue": "'Arrow3D' object has no attribute 'do_3d_projection'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
"File \u001b[0;32m/usr/share/miniconda/envs/abipy/lib/python3.12/site-packages/IPython/core/formatters.py:343\u001b[0m, in \u001b[0;36mBaseFormatter.__call__\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m 341\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n\u001b[1;32m 342\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 343\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mprinter\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 344\u001b[0m \u001b[38;5;66;03m# Finally look for special method names\u001b[39;00m\n\u001b[1;32m 345\u001b[0m method \u001b[38;5;241m=\u001b[39m get_real_method(obj, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprint_method)\n",
"File \u001b[0;32m/usr/share/miniconda/envs/abipy/lib/python3.12/site-packages/IPython/core/pylabtools.py:170\u001b[0m, in \u001b[0;36mprint_figure\u001b[0;34m(fig, fmt, bbox_inches, base64, **kwargs)\u001b[0m\n\u001b[1;32m 167\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mmatplotlib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mbackend_bases\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m FigureCanvasBase\n\u001b[1;32m 168\u001b[0m FigureCanvasBase(fig)\n\u001b[0;32m--> 170\u001b[0m \u001b[43mfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcanvas\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprint_figure\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbytes_io\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkw\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 171\u001b[0m data \u001b[38;5;241m=\u001b[39m bytes_io\u001b[38;5;241m.\u001b[39mgetvalue()\n\u001b[1;32m 172\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m fmt \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124msvg\u001b[39m\u001b[38;5;124m'\u001b[39m:\n",
"File \u001b[0;32m/usr/share/miniconda/envs/abipy/lib/python3.12/site-packages/matplotlib/backend_bases.py:2175\u001b[0m, in \u001b[0;36mFigureCanvasBase.print_figure\u001b[0;34m(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)\u001b[0m\n\u001b[1;32m 2172\u001b[0m \u001b[38;5;66;03m# we do this instead of `self.figure.draw_without_rendering`\u001b[39;00m\n\u001b[1;32m 2173\u001b[0m \u001b[38;5;66;03m# so that we can inject the orientation\u001b[39;00m\n\u001b[1;32m 2174\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(renderer, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_draw_disabled\u001b[39m\u001b[38;5;124m\"\u001b[39m, nullcontext)():\n\u001b[0;32m-> 2175\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfigure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2176\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bbox_inches:\n\u001b[1;32m 2177\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bbox_inches \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtight\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n",
"File \u001b[0;32m/usr/share/miniconda/envs/abipy/lib/python3.12/site-packages/matplotlib/artist.py:95\u001b[0m, in \u001b[0;36m_finalize_rasterization..draw_wrapper\u001b[0;34m(artist, renderer, *args, **kwargs)\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(draw)\n\u001b[1;32m 94\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdraw_wrapper\u001b[39m(artist, renderer, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m---> 95\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 96\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m renderer\u001b[38;5;241m.\u001b[39m_rasterizing:\n\u001b[1;32m 97\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstop_rasterizing()\n",
"File \u001b[0;32m/usr/share/miniconda/envs/abipy/lib/python3.12/site-packages/matplotlib/artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[0;34m(artist, renderer)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[0;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
"File \u001b[0;32m/usr/share/miniconda/envs/abipy/lib/python3.12/site-packages/matplotlib/figure.py:3162\u001b[0m, in \u001b[0;36mFigure.draw\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 3159\u001b[0m \u001b[38;5;66;03m# ValueError can occur when resizing a window.\u001b[39;00m\n\u001b[1;32m 3161\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpatch\u001b[38;5;241m.\u001b[39mdraw(renderer)\n\u001b[0;32m-> 3162\u001b[0m \u001b[43mmimage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_draw_list_compositing_images\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3163\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43martists\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msuppressComposite\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3165\u001b[0m renderer\u001b[38;5;241m.\u001b[39mclose_group(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfigure\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 3166\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n",
"File \u001b[0;32m/usr/share/miniconda/envs/abipy/lib/python3.12/site-packages/matplotlib/image.py:132\u001b[0m, in \u001b[0;36m_draw_list_compositing_images\u001b[0;34m(renderer, parent, artists, suppress_composite)\u001b[0m\n\u001b[1;32m 130\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m not_composite \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m has_images:\n\u001b[1;32m 131\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m artists:\n\u001b[0;32m--> 132\u001b[0m \u001b[43ma\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 133\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 134\u001b[0m \u001b[38;5;66;03m# Composite any adjacent images together\u001b[39;00m\n\u001b[1;32m 135\u001b[0m image_group \u001b[38;5;241m=\u001b[39m []\n",
"File \u001b[0;32m/usr/share/miniconda/envs/abipy/lib/python3.12/site-packages/matplotlib/artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[0;34m(artist, renderer)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[0;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
"File \u001b[0;32m/usr/share/miniconda/envs/abipy/lib/python3.12/site-packages/mpl_toolkits/mplot3d/axes3d.py:441\u001b[0m, in \u001b[0;36mAxes3D.draw\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 437\u001b[0m zorder_offset \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mmax\u001b[39m(axis\u001b[38;5;241m.\u001b[39mget_zorder()\n\u001b[1;32m 438\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m axis \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_axis_map\u001b[38;5;241m.\u001b[39mvalues()) \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[1;32m 439\u001b[0m collection_zorder \u001b[38;5;241m=\u001b[39m patch_zorder \u001b[38;5;241m=\u001b[39m zorder_offset\n\u001b[0;32m--> 441\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m artist \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28;43msorted\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mcollections_and_patches\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 442\u001b[0m \u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mlambda\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43martist\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43martist\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdo_3d_projection\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 443\u001b[0m \u001b[43m \u001b[49m\u001b[43mreverse\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m:\n\u001b[1;32m 444\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(artist, mcoll\u001b[38;5;241m.\u001b[39mCollection):\n\u001b[1;32m 445\u001b[0m artist\u001b[38;5;241m.\u001b[39mzorder \u001b[38;5;241m=\u001b[39m collection_zorder\n",
"File \u001b[0;32m/usr/share/miniconda/envs/abipy/lib/python3.12/site-packages/mpl_toolkits/mplot3d/axes3d.py:442\u001b[0m, in \u001b[0;36mAxes3D.draw..\u001b[0;34m(artist)\u001b[0m\n\u001b[1;32m 437\u001b[0m zorder_offset \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mmax\u001b[39m(axis\u001b[38;5;241m.\u001b[39mget_zorder()\n\u001b[1;32m 438\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m axis \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_axis_map\u001b[38;5;241m.\u001b[39mvalues()) \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[1;32m 439\u001b[0m collection_zorder \u001b[38;5;241m=\u001b[39m patch_zorder \u001b[38;5;241m=\u001b[39m zorder_offset\n\u001b[1;32m 441\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m artist \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28msorted\u001b[39m(collections_and_patches,\n\u001b[0;32m--> 442\u001b[0m key\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mlambda\u001b[39;00m artist: \u001b[43martist\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdo_3d_projection\u001b[49m(),\n\u001b[1;32m 443\u001b[0m reverse\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m):\n\u001b[1;32m 444\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(artist, mcoll\u001b[38;5;241m.\u001b[39mCollection):\n\u001b[1;32m 445\u001b[0m artist\u001b[38;5;241m.\u001b[39mzorder \u001b[38;5;241m=\u001b[39m collection_zorder\n",
"\u001b[0;31mAttributeError\u001b[0m: 'Arrow3D' object has no attribute 'do_3d_projection'"
]
},
{
"data": {
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"scf_input.structure.plot();"
]
},
{
"cell_type": "markdown",
"id": "4d1e2e8e",
"metadata": {},
"source": [
"We are using the same norm-conserving pseudopotentials of the official tutorial but\n",
"this does not mean you should use them for production calculations (there must be a reason\n",
"why the directory is called **Psps_for_tests**).\n",
"\n",
"There are 16 valence electrons per unit cell hence {{nband}} has been set to 8\n",
"(yes, we are dealing with a non-magnetic semiconductor):"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "92c054a7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
" summary: Troullier-Martins psp for element Al Thu Oct 27 17:31:05 EDT 1994\n",
" number of valence electrons: 3.0\n",
" maximum angular momentum: d\n",
" angular momentum for local part: d\n",
" XC correlation: LDA_XC_TETER93\n",
" supports spin-orbit: False\n",
" radius for non-linear core correction: 2.09673076353074\n",
" hint for low accuracy: ecut: 0.0, pawecutdg: 0.0\n",
" hint for normal accuracy: ecut: 0.0, pawecutdg: 0.0\n",
" hint for high accuracy: ecut: 0.0, pawecutdg: 0.0 \n",
"\n",
"\n",
" summary: Troullier-Martins psp for element As Thu Oct 27 17:37:14 EDT 1994\n",
" number of valence electrons: 5.0\n",
" maximum angular momentum: p\n",
" angular momentum for local part: p\n",
" XC correlation: LDA_XC_TETER93\n",
" supports spin-orbit: False\n",
" radius for non-linear core correction: 2.0573171556401\n",
" hint for low accuracy: ecut: 0.0, pawecutdg: 0.0\n",
" hint for normal accuracy: ecut: 0.0, pawecutdg: 0.0\n",
" hint for high accuracy: ecut: 0.0, pawecutdg: 0.0 \n",
"\n"
]
}
],
"source": [
"for pseudo in scf_input.pseudos:\n",
" print(pseudo, \"\\n\")"
]
},
{
"cell_type": "markdown",
"id": "4533707c",
"metadata": {},
"source": [
"The `scf_input` represents the **building block** for our DFPT calculation.\n",
"As usual, AbiPy provides a `Work` to compute elastic and piezoelectric properties\n",
"starting from an input representing a ground-state calculation\n",
"thus it is just a matter of calling `make_scf_input` and pass the result to\n",
"`ElasticWork.from_scf_input` to construct our flow.\n",
"\n",
"Let's have a look at the actual implementation:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "1ef8bc84",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
"\n",
" \n",
" \n",
" \n",
"\n",
"\n",
" \n",
"\n",
"def build_flow ( options = None ): \n",
" """ \n",
" Create a `Flow` for phonon calculations. The flow has one work with: \n",
"\n",
" - 1 GS Task \n",
" - 3 DDK Task \n",
" - 4 Phonon Tasks (Gamma point) \n",
" - 6 Elastic tasks (3 uniaxial + 3 shear strain) \n",
"\n",
" The Phonon tasks and the elastic task will read the 3 DDK files produced at the beginning \n",
" """ \n",
" workdir = options . workdir if ( options and options . workdir ) else "flow_elastic" \n",
"\n",
" flow = flowtk . Flow ( workdir = workdir ) \n",
"\n",
" # Build input for GS calculation and register the first work. \n",
" scf_input = make_scf_input () \n",
"\n",
" # Build work for elastic properties (clamped-ions) \n",
" # activate internal strain and piezoelectric part. \n",
" elast_work = flowtk . ElasticWork . from_scf_input ( scf_input , with_relaxed_ion = True , with_piezo = True ) \n",
"\n",
" flow . register_work ( elast_work ) \n",
"\n",
" return flow \n",
" \n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from lesson_elastic import build_flow\n",
"abilab.print_source(build_flow)"
]
},
{
"cell_type": "markdown",
"id": "5afd96e7",
"metadata": {},
"source": [
"Now we can call the function to build our flow:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "cc474f2b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Number of works: 1, total number of tasks: 14\n",
"Number of tasks with a given class:\n",
"\n",
"Task Class Number\n",
"------------ --------\n",
"ScfTask 1\n",
"DdkTask 3\n",
"PhononTask 4\n",
"ElasticTask 6"
]
}
],
"source": [
"flow = build_flow()\n",
"flow.show_info()"
]
},
{
"cell_type": "markdown",
"id": "a109fc47",
"metadata": {},
"source": [
"and use the `get_graphviz` method to visualize the connection among the `Tasks`:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "556bc000",
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"flow \n",
" \n",
"Flow, node_id=122, workdir=flow_elastic \n",
"\n",
"clusterw0 \n",
" \n",
"ElasticWork (w0) \n",
" \n",
"\n",
"\n",
"w0_t0 \n",
"\n",
"w0_t0 \n",
"ScfTask \n",
" \n",
"\n",
"\n",
"w0_t1 \n",
"\n",
"w0_t1 \n",
"DdkTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t1 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t2 \n",
"\n",
"w0_t2 \n",
"DdkTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t2 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t3 \n",
"\n",
"w0_t3 \n",
"DdkTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t3 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t4 \n",
"\n",
"w0_t4 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t4 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t5 \n",
"\n",
"w0_t5 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t5 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t6 \n",
"\n",
"w0_t6 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t6 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t7 \n",
"\n",
"w0_t7 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t7 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t8 \n",
"\n",
"w0_t8 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t8 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t9 \n",
"\n",
"w0_t9 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t9 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t10 \n",
"\n",
"w0_t10 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t10 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t11 \n",
"\n",
"w0_t11 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t11 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t12 \n",
"\n",
"w0_t12 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t12 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t13 \n",
"\n",
"w0_t13 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t13 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t4 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t5 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t6 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t7 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t8 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t9 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t10 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t11 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t12 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t13 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t4 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t5 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t6 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t7 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t8 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t9 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t10 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t11 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t12 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t13 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t4 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t5 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t6 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t7 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t8 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t9 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t10 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t11 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t12 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t13 \n",
" \n",
" \n",
"DDK \n",
" \n",
" \n",
" \n"
],
"text/plain": [
""
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"flow.get_graphviz()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "cad96ff9",
"metadata": {},
"outputs": [],
"source": [
"# matplotlib version based on networkx\n",
"#flow.plot_networkx(with_edge_labels=True);"
]
},
{
"cell_type": "markdown",
"id": "bac9413b",
"metadata": {},
"source": [
"In a nutshell:\n",
"\n",
" * we compute the `WFK` file in the `ScfTask` (red circle)\n",
" * the ground-state wavefunctions are used by the three `DdkTasks` to compute\n",
" $\\dfrac{\\partial u}{\\partial{\\bf k}}$ for the three different directions.\n",
" * The `ElasticTasks` needs the `WFK` file to compute the six strain perturbations\n",
" (3 for uniaxial and 3 for shear strain) while the `DDK` files are required\n",
" to compute the mixed 2nd-order derivatives with respect to strain and electric field\n",
" needed for the piezoelectric tensor.\n",
"\n",
"Note that, **contrarily to the approach used in the standard tutorial**, the AbiPy `Work` does not use datasets.\n",
"The perturbations of interest (strain, atomic-perturbation, ddk, electric field)\n",
"are obtained with different `Tasks` that can be executed in parallel.\n",
"\n",
"To understand better this point, we can print a table with the most important Abinit variables defining\n",
"the DFPT calculation.\n",
"If the variable is not present in the input, the entry is set to `None`."
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "63349140",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" qpt \n",
" rfphon \n",
" rfatpol \n",
" rfdir \n",
" rfelfd \n",
" rfstrs \n",
" kptopt \n",
" class \n",
" \n",
" \n",
" \n",
" \n",
" w0_t0 \n",
" None \n",
" None \n",
" None \n",
" None \n",
" None \n",
" None \n",
" None \n",
" ScfTask \n",
" \n",
" \n",
" w0_t1 \n",
" (0, 0, 0) \n",
" None \n",
" None \n",
" (1, 0, 0) \n",
" 2 \n",
" None \n",
" 2 \n",
" DdkTask \n",
" \n",
" \n",
" w0_t2 \n",
" (0, 0, 0) \n",
" None \n",
" None \n",
" (0, 1, 0) \n",
" 2 \n",
" None \n",
" 2 \n",
" DdkTask \n",
" \n",
" \n",
" w0_t3 \n",
" (0, 0, 0) \n",
" None \n",
" None \n",
" (0, 0, 1) \n",
" 2 \n",
" None \n",
" 2 \n",
" DdkTask \n",
" \n",
" \n",
" w0_t4 \n",
" (0, 0, 0) \n",
" 1 \n",
" [1, 1] \n",
" [1, 0, 0] \n",
" None \n",
" None \n",
" 2 \n",
" PhononTask \n",
" \n",
" \n",
" w0_t5 \n",
" (0, 0, 0) \n",
" 1 \n",
" [1, 1] \n",
" [0, 0, 1] \n",
" None \n",
" None \n",
" 2 \n",
" PhononTask \n",
" \n",
" \n",
" w0_t6 \n",
" (0, 0, 0) \n",
" 1 \n",
" [3, 3] \n",
" [1, 0, 0] \n",
" None \n",
" None \n",
" 2 \n",
" PhononTask \n",
" \n",
" \n",
" w0_t7 \n",
" (0, 0, 0) \n",
" 1 \n",
" [3, 3] \n",
" [0, 0, 1] \n",
" None \n",
" None \n",
" 2 \n",
" PhononTask \n",
" \n",
" \n",
" w0_t8 \n",
" (0, 0, 0) \n",
" None \n",
" None \n",
" [1, 0, 0] \n",
" None \n",
" 1 \n",
" 2 \n",
" ElasticTask \n",
" \n",
" \n",
" w0_t9 \n",
" (0, 0, 0) \n",
" None \n",
" None \n",
" [0, 1, 0] \n",
" None \n",
" 1 \n",
" 2 \n",
" ElasticTask \n",
" \n",
" \n",
" w0_t10 \n",
" (0, 0, 0) \n",
" None \n",
" None \n",
" [0, 0, 1] \n",
" None \n",
" 1 \n",
" 2 \n",
" ElasticTask \n",
" \n",
" \n",
" w0_t11 \n",
" (0, 0, 0) \n",
" None \n",
" None \n",
" [1, 0, 0] \n",
" None \n",
" 2 \n",
" 2 \n",
" ElasticTask \n",
" \n",
" \n",
" w0_t12 \n",
" (0, 0, 0) \n",
" None \n",
" None \n",
" [0, 1, 0] \n",
" None \n",
" 2 \n",
" 2 \n",
" ElasticTask \n",
" \n",
" \n",
" w0_t13 \n",
" (0, 0, 0) \n",
" None \n",
" None \n",
" [0, 0, 1] \n",
" None \n",
" 2 \n",
" 2 \n",
" ElasticTask \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" qpt rfphon rfatpol rfdir rfelfd rfstrs kptopt class\n",
"w0_t0 None None None None None None None ScfTask\n",
"w0_t1 (0, 0, 0) None None (1, 0, 0) 2 None 2 DdkTask\n",
"w0_t2 (0, 0, 0) None None (0, 1, 0) 2 None 2 DdkTask\n",
"w0_t3 (0, 0, 0) None None (0, 0, 1) 2 None 2 DdkTask\n",
"w0_t4 (0, 0, 0) 1 [1, 1] [1, 0, 0] None None 2 PhononTask\n",
"w0_t5 (0, 0, 0) 1 [1, 1] [0, 0, 1] None None 2 PhononTask\n",
"w0_t6 (0, 0, 0) 1 [3, 3] [1, 0, 0] None None 2 PhononTask\n",
"w0_t7 (0, 0, 0) 1 [3, 3] [0, 0, 1] None None 2 PhononTask\n",
"w0_t8 (0, 0, 0) None None [1, 0, 0] None 1 2 ElasticTask\n",
"w0_t9 (0, 0, 0) None None [0, 1, 0] None 1 2 ElasticTask\n",
"w0_t10 (0, 0, 0) None None [0, 0, 1] None 1 2 ElasticTask\n",
"w0_t11 (0, 0, 0) None None [1, 0, 0] None 2 2 ElasticTask\n",
"w0_t12 (0, 0, 0) None None [0, 1, 0] None 2 2 ElasticTask\n",
"w0_t13 (0, 0, 0) None None [0, 0, 1] None 2 2 ElasticTask"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"flow.get_vars_dataframe(\"qpt\", \"rfphon\", \"rfatpol\", \"rfdir\", \"rfelfd\", \"rfstrs\", \"kptopt\")"
]
},
{
"cell_type": "markdown",
"id": "3a0698bc",
"metadata": {},
"source": [
"If the meaning of these variables is not clear, you can consult the [Abinit documentation](https://docs.abinit.org)\n",
"or access the documentation directly from python with *e.g.*:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "5a351609",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Default value: 0Description \n",
"Used to run strain response-function calculations (e.g. needed to get elastic\n",
"constants). Define, with rfdir , the set of perturbations.\n",
"\n",
" * 0 --> no strain perturbation\n",
" * 1 --> only uniaxial strain(s) (ipert=natom+3 is activated)\n",
" * 2 --> only shear strain(s) (ipert=natom+4 is activated)\n",
" * 3 --> both uniaxial and shear strain(s) (both ipert=natom+3 and ipert=natom+4 are activated)\n",
"\n",
"See the possible restrictions on the use of strain perturbations, in the help:respfn .\n"
],
"text/plain": [
"rfstrs "
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"abilab.docvar(\"rfstrs\")"
]
},
{
"cell_type": "markdown",
"id": "b68ae41a",
"metadata": {},
"source": [
"```{note}\n",
"For your convenience the links to the doc of the different variables are listed below:\n",
"\n",
"- {{qpt}}\n",
"- {{rfphon}}\n",
"- {{rfatpol}}\n",
"- {{rfdir}}\n",
"- {{rfelfd}}\n",
"- {{rfstrs}}\n",
"- {{kptopt}}\n",
"```\n",
"\n",
"Now we can generate the `flow_elastic` directory with the input files by executing the `lesson_elastic.py` script.\n",
"Then use the {{abirun}} script to launch the entire calculation with:\n",
"\n",
" abirun.py flow_elastic scheduler\n",
"\n",
"You will see that all `PhononTasks` and `ElasticTasks` are executed in parallel on your machine\n",
"once the three `DdkTasks` are completed.\n",
"\n",
"```{include} ../snippets/abicheck_warning.md\n",
"```\n",
"\n",
"If you prefer to skip this part, you may want to jump to next section about the post-processing of the results.\n",
"Note that the output files are already available in the repository so it is also possible to try\n",
"the AbiPy post-processing tools without having to run the flow."
]
},
{
"cell_type": "markdown",
"id": "e3378b90",
"metadata": {},
"source": [
"## Post-processing the results\n",
"\n",
"Our flow is completed and we have the final DDB file\n",
"in the `outdata` directory of the `Work` (AbiPy has automatically merged all the partial DDB files\n",
"at the end of the calculation by invoking `anaddb` for you).\n",
"Let's open this DDB file with:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "fb0add80",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"================================= File Info =================================\n",
"Name: out_DDB\n",
"Directory: /home/runner/work/abipy_book/abipy_book/abipy_book/elastic/flow_elastic/w0/outdata\n",
"Size: 27.03 kB\n",
"Access Time: Sun Oct 27 17:42:03 2024\n",
"Modification Time: Sun Oct 27 17:38:46 2024\n",
"Change Time: Sun Oct 27 17:38:46 2024\n",
"\n",
"================================= Structure =================================\n",
"Full Formula (Al2 As2)\n",
"Reduced Formula: AlAs\n",
"abc : 3.989448 3.989448 6.497130\n",
"angles: 90.000000 90.000000 120.000000\n",
"pbc : True True True\n",
"Sites (4)\n",
" # SP a b c cartesian_forces\n",
"--- ---- -------- -------- -------- -------------------------------------------------\n",
" 0 Al 0.333333 0.666667 0 [-0.00000000e+00 -0.00000000e+00 4.06423231e-06]\n",
" 1 Al 0.666667 0.333333 0.5 [-0.00000000e+00 -0.00000000e+00 4.06423231e-06]\n",
" 2 As 0.333333 0.666667 0.376086 [-0.00000000e+00 -0.00000000e+00 -4.06423231e-06]\n",
" 3 As 0.666667 0.333333 0.876086 [-0.00000000e+00 -0.00000000e+00 -4.06423231e-06]\n",
"\n",
"Abinit Spacegroup: spgid: 0, num_spatial_symmetries: 12, has_timerev: True, symmorphic: True\n",
"\n",
"================================== DDB Info ==================================\n",
"\n",
"Number of q-points in DDB: 1\n",
"guessed_ngqpt: [1 1 1] (guess for the q-mesh divisions made by AbiPy)\n",
"ecut = 6.000000, ecutsm = 0.500000, nkpt = 8, nsym = 12, usepaw = 0\n",
"nsppol 1, nspinor 1, nspden 1, ixc = 1, occopt = 1, tsmear = 0.010000\n",
"\n",
"Has total energy: True\n",
"Total energy: -551.6004805663522 eV\n",
"Has forces: True\n",
"\n",
"Cartesian stress tensor in GPa with pressure: -1.518e-07 (GPa):\n",
"[[-1.11784777e-05 0.00000000e+00 0.00000000e+00]\n",
" [ 0.00000000e+00 -1.11786387e-05 0.00000000e+00]\n",
" [ 0.00000000e+00 0.00000000e+00 2.28125046e-05]]\n",
"\n",
"Has (at least one) atomic pertubation: True\n",
"Has (at least one diagonal) electric-field perturbation: False\n",
"Has (at least one) Born effective charge: True\n",
"Has (all) strain terms: True\n",
"Has (all) internal strain terms: True\n",
"Has (all) piezoelectric terms: True\n",
"Has (all) dynamical quadrupole terms: False\n"
]
}
],
"source": [
"ddb = abilab.abiopen(\"flow_elastic/w0/outdata/out_DDB\")\n",
"print(ddb)"
]
},
{
"cell_type": "markdown",
"id": "db84d516",
"metadata": {},
"source": [
"The `DdbFile` object provides an easy-to-use interface that invokes `anaddb` to post-process\n",
"the data stored in the DDB file.\n",
"All the methods that invoke `anaddb` use the `ana` prefix so it is not strange to\n",
"see that we can obtain the elastic and piezoelectric tensors by just calling:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "78a1769d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ANADDB INPUT:\n",
" outdata_prefix \"outdata/out\"\n",
" asr 2\n",
" chneut 1\n",
" dieflag 0\n",
" elaflag 3\n",
" piezoflag 3\n",
" instrflag 1\n",
"workdir: /tmp/tmpsuvqtekr\n"
]
}
],
"source": [
"edata = ddb.anaget_elastic(verbose=1)"
]
},
{
"cell_type": "markdown",
"id": "bfdbcc85",
"metadata": {},
"source": [
"Note that we are calling the method without arguments. This means that AbiPy will try to detect\n",
"**automatically** how to set the anaddb input variables.\n",
"The docstring of the method explains the logic used to set the variables."
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "1d834e88",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
"\n",
" \n",
" \n",
" \n",
"\n",
"\n",
" \n",
"\n",
" def anaget_elastic ( self , relaxed_ion = "automatic" , piezo = "automatic" , \n",
" dde = False , stress_correction = False , asr = 2 , chneut = 1 , \n",
" mpi_procs = 1 , workdir = None , manager = None , verbose = 0 , retpath = False , return_input = False ): \n",
" """ \n",
" Call anaddb to compute elastic and piezoelectric tensors. Require DDB with strain terms. \n",
"\n",
" By default, this method sets the anaddb input variables automatically \n",
" by looking at the 2nd-order derivatives available in the DDB file. \n",
" This behaviour can be changed by setting explicitly the value of: \n",
" `relaxed_ion` and `piezo`. \n",
"\n",
" Args: \n",
" relaxed_ion: Activate computation of relaxed-ion tensors. \n",
" Allowed values are [True, False, "automatic"]. Defaults to "automatic". \n",
" In "automatic" mode, relaxed-ion tensors are automatically computed if \n",
" internal strain terms and phonons at Gamma are present in the DDB. \n",
" piezo: Activate computation of piezoelectric tensors. \n",
" Allowed values are [True, False, "automatic"]. Defaults to "automatic". \n",
" In "automatic" mode, piezoelectric tensors are automatically computed if \n",
" piezoelectric terms are present in the DDB. \n",
" NB: relaxed-ion piezoelectric requires the activation of `relaxed_ion`. \n",
" dde: if True, dielectric tensors will be calculated. \n",
" stress_correction: Calculate the relaxed ion elastic tensors, considering \n",
" the stress left inside cell. The DDB must contain the stress tensor. \n",
" asr: Anaddb input variable. See official documentation. \n",
" chneut: Anaddb input variable. See official documentation. \n",
" mpi_procs: Number of MPI processes to use. \n",
" workdir: Working directory. If None, a temporary directory is created. \n",
" manager: |TaskManager| object. If None, the object is initialized from the configuration file \n",
" verbose: verbosity level. Set it to a value > 0 to get more information \n",
" retpath: True to return path to anaddb.nc file. \n",
" return_input: True if the |AnaddbInput| object should be returned as 2nd argument \n",
"\n",
" Return: \n",
" |ElasticData| object if ``retpath`` is None else absolute path to anaddb.nc file. \n",
" """ \n",
" \n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"abilab.print_doc(ddb.anaget_elastic)"
]
},
{
"cell_type": "markdown",
"id": "b861e508",
"metadata": {},
"source": [
"Let's print the object to get a summary of the most important results:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "5502a7ef",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"================================= Structure =================================\n",
"Full Formula (Al2 As2)\n",
"Reduced Formula: AlAs\n",
"abc : 3.989448 3.989448 6.497130\n",
"angles: 90.000000 90.000000 120.000000\n",
"pbc : True True True\n",
"Sites (4)\n",
" # SP a b c\n",
"--- ---- -------- -------- --------\n",
" 0 Al 0.333333 0.666667 0\n",
" 1 Al 0.666667 0.333333 0.5\n",
" 2 As 0.333333 0.666667 0.376086\n",
" 3 As 0.666667 0.333333 0.876086\n",
"\n",
"============================== Anaddb Variables ==============================\n",
"{\n",
" \"asr\": 2,\n",
" \"chneut\": 1,\n",
" \"dieflag\": 0,\n",
" \"elaflag\": 3,\n",
" \"instrflag\": 1,\n",
" \"piezoflag\": 3\n",
"}\n",
"\n",
"========================= elastic tensors available =========================\n",
"[ELASTIC_RELAXED]\n",
"relaxed-ion elastic tensor in Voigt notation (shape: (6, 6))\n",
"Units: GPa, set to zero below: 0.001, fit_to_structure: True\n",
"\n",
" xx yy zz yz xz xy\n",
"xx 135.262182 54.450376 38.052927 0.00000 0.000000 0.000000\n",
"yy 54.450376 135.262181 38.052927 0.00000 0.000000 0.000000\n",
"zz 38.052927 38.052926 148.211029 0.00000 0.000000 0.000000\n",
"yz 0.000000 0.000000 0.000000 30.55071 0.000000 0.000000\n",
"xz 0.000000 0.000000 0.000000 0.00000 30.550709 0.000000\n",
"xy 0.000000 0.000000 0.000000 0.00000 0.000000 40.405903\n",
"\n",
"[ELASTIC_CLAMPED]\n",
"clamped-ion elastic tensor in Voigt notation (shape: (6, 6))\n",
"Units: GPa, set to zero below: 0.001, fit_to_structure: True\n",
"\n",
" xx yy zz yz xz xy\n",
"xx 165.988592 40.464803 21.090298 0.000000 0.000000 0.000000\n",
"yy 40.464802 165.988592 21.090299 0.000000 0.000000 0.000000\n",
"zz 21.090298 21.090298 182.585743 0.000000 0.000000 0.000000\n",
"yz 0.000000 0.000000 0.000000 40.818194 0.000000 0.000000\n",
"xz 0.000000 0.000000 0.000000 0.000000 40.818195 0.000000\n",
"xy 0.000000 0.000000 0.000000 0.000000 0.000000 62.761895\n",
"\n",
"\n",
"====================== piezoelectric tensors available ======================\n",
"[PIEZO_RELAXED]\n",
"relaxed-ion piezoelectric tensor in Voigt notation (shape: (3, 6))\n",
"Units: c/m^2, set to zero below: 1e-05, fit_to_structure: True\n",
"\n",
" xx yy zz yz xz xy\n",
"Px 0.000000 0.000000 0.000000 0.000000 -0.048288 0.0\n",
"Py 0.000000 0.000000 0.000000 -0.048288 0.000000 0.0\n",
"Pz -0.011872 -0.011872 0.064628 0.000000 0.000000 0.0\n",
"\n",
"[PIEZO_CLAMPED]\n",
"clamped-ion piezoelectric tensor in Voigt notation (shape: (3, 6))\n",
"Units: c/m^2, set to zero below: 1e-05, fit_to_structure: True\n",
"\n",
" xx yy zz yz xz xy\n",
"Px 0.000000 0.000000 0.00000 0.000000 0.435488 0.0\n",
"Py 0.000000 0.000000 0.00000 0.435488 0.000000 0.0\n",
"Pz 0.384901 0.384901 -0.73943 0.000000 0.000000 0.0\n",
"\n"
]
}
],
"source": [
"print(edata)"
]
},
{
"cell_type": "markdown",
"id": "d8e17a36",
"metadata": {},
"source": [
"Since the DDB file contains `internal strain terms` and piezoelectric terms,\n",
"AbiPy set `elaflag` to 3, `instrflag` to 1 and `piezoflag` to 3 so that anaddb\n",
"will compute both `relaxed` and `clamped-ion` tensors."
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "17301ffe",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Default value: 0Description \n",
"Flag for calculation of elastic and compliance tensors\n",
"\n",
" * 0 --> No elastic or compliance tensor will be calculated.\n",
" * 1 --> Only clamped-ion elastic and compliance tensors will be calculated.\n",
" Requirements for preceding response-function DDB generation run: Strain perturbation.\n",
" Set rfstrs to 1, 2, or 3. Note that rfstrs =3 is recommended so that responses\n",
" to both uniaxial and shear strains will be computed.\n",
" * 2 --> Both relaxed- and clamped-ion elastic and compliance tensor will be calculated,\n",
" but only the relaxed-ion quantities will be printed. The input variable anaddb:instrflag should also be set to 1,\n",
" because the internal-strain tensor is needed to compute the relaxed-ion corrections.\n",
" Requirements for preceding response-function DDB generation run:\n",
" Strain and atomic-displacement responses at Q=0. Set rfstrs = 1, 2, or 3 (preferably 3).\n",
" Set rfatpol and rfdir to do a full calculation of phonons at Q=0\n",
" (needed because the inverse of force-constant tensor is required).\n",
" * 3 --> Both relaxed and clamped-ion elastic and compliance tensors will be printed out.\n",
" The input variable anaddb:instrflag should also be set to 1.\n",
" Requirements for preceding response-function DDB generation run: Same as for **elaflag** =2.\n",
" * 4 --> Calculate the elastic and compliance tensors (relaxed ion) at fixed displacement field,\n",
" the relaxed-ion tensors at fixed electric field will be printed out too, for comparison.\n",
" When **elaflag** =4, we need the information of internal strain and relaxed-ion dielectric tensor\n",
" to build the whole tensor, so we need set anaddb:instrflag =1 and anaddb:dieflag =3 or 4 .\n",
" * 5 --> Calculate the relaxed ion elastic and compliance tensors, considering the stress left inside cell.\n",
" At the same time, bare relaxed ion tensors will still be printed out for comparison.\n",
" In this calculation, stress tensor is needed to compute the correction term, so one is supposed\n",
" to merge the first order derivative data base (DDB file) with the second order derivative data base (DDB file)\n",
" into a new DDB file, which can contain both information. And the program will also check for the users.\n"
],
"text/plain": [
"elaflag@anaddb "
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"abilab.docvar(\"elaflag\", executable=\"anaddb\")"
]
},
{
"cell_type": "markdown",
"id": "16aaffd6",
"metadata": {},
"source": [
"The tensors are available as attributes of the `edata` object:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "0d2a0b27",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" xx \n",
" yy \n",
" zz \n",
" yz \n",
" xz \n",
" xy \n",
" \n",
" \n",
" Voigt index \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" xx \n",
" 135.262182 \n",
" 54.450376 \n",
" 38.052927 \n",
" 0.00000 \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" yy \n",
" 54.450376 \n",
" 135.262181 \n",
" 38.052927 \n",
" 0.00000 \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" zz \n",
" 38.052927 \n",
" 38.052926 \n",
" 148.211029 \n",
" 0.00000 \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" yz \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.000000 \n",
" 30.55071 \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" xz \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.00000 \n",
" 30.550709 \n",
" 0.000000 \n",
" \n",
" \n",
" xy \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.00000 \n",
" 0.000000 \n",
" 40.405903 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
"MyElasticTensor([[[[ 1.35262182e+02 3.86872778e-07 7.68078576e-08]\n",
" [ 3.86872778e-07 5.44503761e+01 -2.34729999e-09]\n",
" [ 7.68078576e-08 -2.34729999e-09 3.80529272e+01]]\n",
"\n",
" [[ 2.23597953e-07 4.04059029e+01 -1.04441413e-09]\n",
" [ 4.04059029e+01 -5.56918764e-07 4.85287557e-09]\n",
" [-1.04441413e-09 4.85287557e-09 -5.11644117e-08]]\n",
"\n",
" [[ 8.37849888e-08 -1.04444344e-09 3.05507088e+01]\n",
" [-1.04444344e-09 -3.34035225e-08 -7.82061279e-09]\n",
" [ 3.05507088e+01 -7.82061279e-09 -2.55296131e-08]]]\n",
"\n",
"\n",
" [[[ 2.23597953e-07 4.04059029e+01 -1.04441413e-09]\n",
" [ 4.04059029e+01 -5.56918764e-07 4.85287557e-09]\n",
" [-1.04441413e-09 4.85287557e-09 -5.11644117e-08]]\n",
"\n",
" [[ 5.44503755e+01 -6.93954124e-07 -2.49674821e-08]\n",
" [-6.93954124e-07 1.35262181e+02 3.75489657e-09]\n",
" [-2.49674821e-08 3.75489657e-09 3.80529266e+01]]\n",
"\n",
" [[ 3.87661429e-09 4.99024214e-09 -7.82059494e-09]\n",
" [ 4.99024214e-09 6.92339892e-09 3.05507104e+01]\n",
" [-7.82059494e-09 3.05507104e+01 4.33875176e-09]]]\n",
"\n",
"\n",
" [[[ 8.37849888e-08 -1.04444344e-09 3.05507088e+01]\n",
" [-1.04444344e-09 -3.34035225e-08 -7.82061279e-09]\n",
" [ 3.05507088e+01 -7.82061279e-09 -2.55296131e-08]]\n",
"\n",
" [[ 3.87661429e-09 4.99024214e-09 -7.82059494e-09]\n",
" [ 4.99024214e-09 6.92339892e-09 3.05507104e+01]\n",
" [-7.82059494e-09 3.05507104e+01 4.33875176e-09]]\n",
"\n",
" [[ 3.80529269e+01 2.82167427e-07 -3.01436764e-08]\n",
" [ 2.82167427e-07 3.80529257e+01 -1.28501813e-09]\n",
" [-3.01436764e-08 -1.28501813e-09 1.48211029e+02]]]])"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"edata.elastic_relaxed"
]
},
{
"cell_type": "markdown",
"id": "6fa4ba9c",
"metadata": {},
"source": [
"These are pymatgen tensors,\n",
"more specifically [ElasticTensor objects](https://github.com/materialsproject/pymatgen/blob/master/src/pymatgen/analysis/elasticity/elastic.py)\n",
"so we have access to several useful methods.\n",
"To get the Voigt bulk modulus, use:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "c7b5bf75",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"75.5386499927217"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"edata.elastic_relaxed.k_voigt"
]
},
{
"cell_type": "markdown",
"id": "6695bcbc",
"metadata": {},
"source": [
"while the compliance tensor is easily obtained with:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "e775d357",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ComplianceTensor([[[[ 9.12540966e-03 -6.63185579e-11 -1.35430962e-11]\n",
" [-6.63185579e-11 -3.24901993e-03 5.18499125e-13]\n",
" [-1.35430962e-11 5.18499125e-13 -1.50875299e-03]]\n",
"\n",
" [[-4.85950967e-11 6.18721480e-03 2.11517754e-13]\n",
" [ 6.18721480e-03 7.09227024e-11 -9.82817856e-13]\n",
" [ 2.11517754e-13 -9.82817856e-13 -1.46075699e-12]]\n",
"\n",
" [[-1.49197674e-11 2.11523732e-13 8.18311620e-03]\n",
" [ 2.11523732e-13 8.81357700e-12 2.09477889e-12]\n",
" [ 8.18311620e-03 2.09477889e-12 4.38686654e-12]]]\n",
"\n",
"\n",
" [[[-4.85950967e-11 6.18721480e-03 2.11517754e-13]\n",
" [ 6.18721480e-03 7.09227024e-11 -9.82817856e-13]\n",
" [ 2.11517754e-13 -9.82817856e-13 -1.46075699e-12]]\n",
"\n",
" [[-3.24901988e-03 9.91846910e-11 7.06872960e-12]\n",
" [ 9.91846910e-11 9.12540970e-03 -7.17334705e-13]\n",
" [ 7.06872960e-12 -7.17334705e-13 -1.50875296e-03]]\n",
"\n",
" [[-1.03685440e-13 -1.01063771e-12 2.09477411e-12]\n",
" [-1.01063771e-12 -7.20728753e-13 8.18311576e-03]\n",
" [ 2.09477411e-12 8.18311576e-03 -2.67440577e-13]]]\n",
"\n",
"\n",
" [[[-1.49197674e-11 2.11523732e-13 8.18311620e-03]\n",
" [ 2.11523732e-13 8.81357700e-12 2.09477889e-12]\n",
" [ 8.18311620e-03 2.09477889e-12 4.38686654e-12]]\n",
"\n",
" [[-1.03685440e-13 -1.01063771e-12 2.09477411e-12]\n",
" [-1.01063771e-12 -7.20728753e-13 8.18311576e-03]\n",
" [ 2.09477411e-12 8.18311576e-03 -2.67440577e-13]]\n",
"\n",
" [[-1.50875300e-03 -3.19970345e-11 4.99090402e-12]\n",
" [-3.19970345e-11 -1.50875290e-03 1.92949068e-13]\n",
" [ 4.99090402e-12 1.92949068e-13 7.52187567e-03]]]])"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"edata.elastic_relaxed.compliance_tensor"
]
},
{
"cell_type": "markdown",
"id": "9f7f21fb",
"metadata": {},
"source": [
"One can also use the [elate](http://progs.coudert.name/elate) online tool to analyse the elastic tensor."
]
},
{
"cell_type": "markdown",
"id": "c71f1be1",
"metadata": {},
"source": [
"To build a pandas DataFrame with properties derived from the elastic tensor\n",
"and the associated structure, use:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "1b7f8c2e",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" property \n",
" 0 \n",
" 1 \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" trans_v \n",
" 3.194459e+03 \n",
" 3.838052e+03 \n",
" \n",
" \n",
" 1 \n",
" long_v \n",
" 5.796035e+03 \n",
" 6.295200e+03 \n",
" \n",
" \n",
" 2 \n",
" snyder_ac \n",
" 5.767044e+01 \n",
" 8.693459e+01 \n",
" \n",
" \n",
" 3 \n",
" snyder_opt \n",
" 3.158141e-01 \n",
" 3.621134e-01 \n",
" \n",
" \n",
" 4 \n",
" snyder_total \n",
" 5.798626e+01 \n",
" 8.729670e+01 \n",
" \n",
" \n",
" 5 \n",
" clarke_thermalcond \n",
" 7.734051e-01 \n",
" 9.006348e-01 \n",
" \n",
" \n",
" 6 \n",
" cahill_thermalcond \n",
" 8.539415e-01 \n",
" 9.791319e-01 \n",
" \n",
" \n",
" 7 \n",
" debye_temperature \n",
" 3.760623e+02 \n",
" 4.477874e+02 \n",
" \n",
" \n",
" 8 \n",
" k_voigt \n",
" 7.553865e+01 \n",
" 7.553930e+01 \n",
" \n",
" \n",
" 9 \n",
" k_reuss \n",
" 7.553074e+01 \n",
" 7.553579e+01 \n",
" \n",
" \n",
" 10 \n",
" k_vrh \n",
" 7.553469e+01 \n",
" 7.553754e+01 \n",
" \n",
" \n",
" 11 \n",
" g_voigt \n",
" 3.951341e+01 \n",
" 5.767416e+01 \n",
" \n",
" \n",
" 12 \n",
" g_reuss \n",
" 3.761300e+01 \n",
" 5.366047e+01 \n",
" \n",
" \n",
" 13 \n",
" g_vrh \n",
" 3.856321e+01 \n",
" 5.566731e+01 \n",
" \n",
" \n",
" 14 \n",
" universal_anisotropy \n",
" 2.527308e-01 \n",
" 3.740360e-01 \n",
" \n",
" \n",
" 15 \n",
" homogeneous_poisson \n",
" 2.818554e-01 \n",
" 2.041909e-01 \n",
" \n",
" \n",
" 16 \n",
" y_mod \n",
" 9.886491e+10 \n",
" 1.340681e+11 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" property 0 1\n",
"0 trans_v 3.194459e+03 3.838052e+03\n",
"1 long_v 5.796035e+03 6.295200e+03\n",
"2 snyder_ac 5.767044e+01 8.693459e+01\n",
"3 snyder_opt 3.158141e-01 3.621134e-01\n",
"4 snyder_total 5.798626e+01 8.729670e+01\n",
"5 clarke_thermalcond 7.734051e-01 9.006348e-01\n",
"6 cahill_thermalcond 8.539415e-01 9.791319e-01\n",
"7 debye_temperature 3.760623e+02 4.477874e+02\n",
"8 k_voigt 7.553865e+01 7.553930e+01\n",
"9 k_reuss 7.553074e+01 7.553579e+01\n",
"10 k_vrh 7.553469e+01 7.553754e+01\n",
"11 g_voigt 3.951341e+01 5.767416e+01\n",
"12 g_reuss 3.761300e+01 5.366047e+01\n",
"13 g_vrh 3.856321e+01 5.566731e+01\n",
"14 universal_anisotropy 2.527308e-01 3.740360e-01\n",
"15 homogeneous_poisson 2.818554e-01 2.041909e-01\n",
"16 y_mod 9.886491e+10 1.340681e+11"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"edata.get_elastic_properties_dataframe(properties_as_index=True)"
]
},
{
"cell_type": "markdown",
"id": "1b6752a0",
"metadata": {},
"source": [
"For the meaning of the different quantities please consult the\n",
"[pymatgen module](https://github.com/materialsproject/pymatgen/blob/master/src/pymatgen/analysis/elasticity/elastic.py)."
]
},
{
"cell_type": "markdown",
"id": "65a77b75",
"metadata": {},
"source": [
"To construct a dataframe with the Voigt indices and the tensor elements use:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "c0dfbca6",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" voigt_cinds \n",
" elastic_relaxed \n",
" elastic_clamped \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" (0, 0) \n",
" 135.262182 \n",
" 165.988592 \n",
" \n",
" \n",
" 1 \n",
" (0, 1) \n",
" 54.450376 \n",
" 40.464803 \n",
" \n",
" \n",
" 2 \n",
" (0, 2) \n",
" 38.052927 \n",
" 21.090298 \n",
" \n",
" \n",
" 3 \n",
" (0, 3) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 4 \n",
" (0, 4) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 5 \n",
" (0, 5) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 6 \n",
" (1, 0) \n",
" 54.450376 \n",
" 40.464802 \n",
" \n",
" \n",
" 7 \n",
" (1, 1) \n",
" 135.262181 \n",
" 165.988592 \n",
" \n",
" \n",
" 8 \n",
" (1, 2) \n",
" 38.052927 \n",
" 21.090299 \n",
" \n",
" \n",
" 9 \n",
" (1, 3) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 10 \n",
" (1, 4) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 11 \n",
" (1, 5) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 12 \n",
" (2, 0) \n",
" 38.052927 \n",
" 21.090298 \n",
" \n",
" \n",
" 13 \n",
" (2, 1) \n",
" 38.052926 \n",
" 21.090298 \n",
" \n",
" \n",
" 14 \n",
" (2, 2) \n",
" 148.211029 \n",
" 182.585743 \n",
" \n",
" \n",
" 15 \n",
" (2, 3) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 16 \n",
" (2, 4) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 17 \n",
" (2, 5) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 18 \n",
" (3, 0) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 19 \n",
" (3, 1) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 20 \n",
" (3, 2) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 21 \n",
" (3, 3) \n",
" 30.550710 \n",
" 40.818194 \n",
" \n",
" \n",
" 22 \n",
" (3, 4) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 23 \n",
" (3, 5) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 24 \n",
" (4, 0) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 25 \n",
" (4, 1) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 26 \n",
" (4, 2) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 27 \n",
" (4, 3) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 28 \n",
" (4, 4) \n",
" 30.550709 \n",
" 40.818195 \n",
" \n",
" \n",
" 29 \n",
" (4, 5) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 30 \n",
" (5, 0) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 31 \n",
" (5, 1) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 32 \n",
" (5, 2) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 33 \n",
" (5, 3) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 34 \n",
" (5, 4) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 35 \n",
" (5, 5) \n",
" 40.405903 \n",
" 62.761895 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" voigt_cinds elastic_relaxed elastic_clamped\n",
"0 (0, 0) 135.262182 165.988592\n",
"1 (0, 1) 54.450376 40.464803\n",
"2 (0, 2) 38.052927 21.090298\n",
"3 (0, 3) 0.000000 0.000000\n",
"4 (0, 4) 0.000000 0.000000\n",
"5 (0, 5) 0.000000 0.000000\n",
"6 (1, 0) 54.450376 40.464802\n",
"7 (1, 1) 135.262181 165.988592\n",
"8 (1, 2) 38.052927 21.090299\n",
"9 (1, 3) 0.000000 0.000000\n",
"10 (1, 4) 0.000000 0.000000\n",
"11 (1, 5) 0.000000 0.000000\n",
"12 (2, 0) 38.052927 21.090298\n",
"13 (2, 1) 38.052926 21.090298\n",
"14 (2, 2) 148.211029 182.585743\n",
"15 (2, 3) 0.000000 0.000000\n",
"16 (2, 4) 0.000000 0.000000\n",
"17 (2, 5) 0.000000 0.000000\n",
"18 (3, 0) 0.000000 0.000000\n",
"19 (3, 1) 0.000000 0.000000\n",
"20 (3, 2) 0.000000 0.000000\n",
"21 (3, 3) 30.550710 40.818194\n",
"22 (3, 4) 0.000000 0.000000\n",
"23 (3, 5) 0.000000 0.000000\n",
"24 (4, 0) 0.000000 0.000000\n",
"25 (4, 1) 0.000000 0.000000\n",
"26 (4, 2) 0.000000 0.000000\n",
"27 (4, 3) 0.000000 0.000000\n",
"28 (4, 4) 30.550709 40.818195\n",
"29 (4, 5) 0.000000 0.000000\n",
"30 (5, 0) 0.000000 0.000000\n",
"31 (5, 1) 0.000000 0.000000\n",
"32 (5, 2) 0.000000 0.000000\n",
"33 (5, 3) 0.000000 0.000000\n",
"34 (5, 4) 0.000000 0.000000\n",
"35 (5, 5) 40.405903 62.761895"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"edata.get_elastic_voigt_dataframe(tol=1e-5)"
]
},
{
"cell_type": "markdown",
"id": "7cd33aff",
"metadata": {},
"source": [
"Note that the Voigt indices are given following the Python (C) notation\n",
"in which we start to count from zero.\n",
"\n",
"This might be a bit confusing, especially when comparing with results reported in the literature.\n",
"The reason why we opted with the 0-based notation is that it facilitates the integration between\n",
"the DataFrame and other python methods.\n",
"A similar approach is used in AbiPy when e.g. one has to specify the band or the phonon mode index."
]
},
{
"cell_type": "markdown",
"id": "b69ce9fc",
"metadata": {},
"source": [
"At this point, it should be clear how to analyze the *relaxed-ion* piezoelectric tensor:"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "a63af934",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" xx \n",
" yy \n",
" zz \n",
" yz \n",
" xz \n",
" xy \n",
" \n",
" \n",
" Voigt index \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Px \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.000000 \n",
" -0.048288 \n",
" 0.0 \n",
" \n",
" \n",
" Py \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.000000 \n",
" -0.048288 \n",
" 0.000000 \n",
" 0.0 \n",
" \n",
" \n",
" Pz \n",
" -0.011872 \n",
" -0.011872 \n",
" 0.064628 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
"MyPiezoTensor([[[ 1.75409585e-09 3.86140603e-11 -4.82884490e-02]\n",
" [ 3.86140603e-11 -1.29936258e-09 -8.89549419e-13]\n",
" [-4.82884490e-02 -8.89549419e-13 -1.18917273e-11]]\n",
"\n",
" [[ 5.01757913e-12 2.85370175e-11 -8.00602698e-13]\n",
" [ 2.85370175e-11 1.03270778e-10 -4.82883778e-02]\n",
" [-8.00602698e-13 -4.82883778e-02 1.04468440e-11]]\n",
"\n",
" [[-1.18716022e-02 -8.38243007e-09 1.10922123e-09]\n",
" [-8.38243007e-09 -1.18715660e-02 4.49488923e-11]\n",
" [ 1.10922123e-09 4.49488923e-11 6.46276918e-02]]])"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"edata.piezo_relaxed"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "4c2760d4",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" voigt_cinds \n",
" piezo_relaxed \n",
" piezo_clamped \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" (0, 0) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 1 \n",
" (0, 1) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 2 \n",
" (0, 2) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 3 \n",
" (0, 3) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 4 \n",
" (0, 4) \n",
" -0.048288 \n",
" 0.435488 \n",
" \n",
" \n",
" 5 \n",
" (0, 5) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 6 \n",
" (1, 0) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 7 \n",
" (1, 1) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 8 \n",
" (1, 2) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 9 \n",
" (1, 3) \n",
" -0.048288 \n",
" 0.435488 \n",
" \n",
" \n",
" 10 \n",
" (1, 4) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 11 \n",
" (1, 5) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 12 \n",
" (2, 0) \n",
" -0.011872 \n",
" 0.384901 \n",
" \n",
" \n",
" 13 \n",
" (2, 1) \n",
" -0.011872 \n",
" 0.384901 \n",
" \n",
" \n",
" 14 \n",
" (2, 2) \n",
" 0.064628 \n",
" -0.739430 \n",
" \n",
" \n",
" 15 \n",
" (2, 3) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 16 \n",
" (2, 4) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 17 \n",
" (2, 5) \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" voigt_cinds piezo_relaxed piezo_clamped\n",
"0 (0, 0) 0.000000 0.000000\n",
"1 (0, 1) 0.000000 0.000000\n",
"2 (0, 2) 0.000000 0.000000\n",
"3 (0, 3) 0.000000 0.000000\n",
"4 (0, 4) -0.048288 0.435488\n",
"5 (0, 5) 0.000000 0.000000\n",
"6 (1, 0) 0.000000 0.000000\n",
"7 (1, 1) 0.000000 0.000000\n",
"8 (1, 2) 0.000000 0.000000\n",
"9 (1, 3) -0.048288 0.435488\n",
"10 (1, 4) 0.000000 0.000000\n",
"11 (1, 5) 0.000000 0.000000\n",
"12 (2, 0) -0.011872 0.384901\n",
"13 (2, 1) -0.011872 0.384901\n",
"14 (2, 2) 0.064628 -0.739430\n",
"15 (2, 3) 0.000000 0.000000\n",
"16 (2, 4) 0.000000 0.000000\n",
"17 (2, 5) 0.000000 0.000000"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"edata.get_piezo_voigt_dataframe(tol=1e-6)"
]
},
{
"cell_type": "markdown",
"id": "baf45693",
"metadata": {},
"source": [
"## Convergence study wrt the number of k-points\n",
"\n",
"In this part of the tutorial, we discuss how to compute elastic and piezoelectric\n",
"tensors with different k-point meshes and how to use the `DdbRobot` to analyze the results.\n",
"\n",
"In principle, one should relax the structure with different k-point samplings and then\n",
"use the relaxed structure to compute elastic and piezoelectric properties.\n",
"This is easy with AbiPy but, for the time being, we ignore this point and use\n",
"the same structure so that we can learn how to use Python to analyze multiple calculations.\n",
"At the end of this tutorial you will find an example of flow in which the structural relaxation\n",
"is performed with different k-meshes.\n",
"\n",
"Since we do not have to change the structure, performing a convergence study with respect to k-points\n",
"is just a matter of creating multiple `Works` inside a loop over k-meshes (our `make_scf_input`\n",
"is already accepting `ngkpt` in input):"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "426524b8",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
"\n",
" \n",
" \n",
" \n",
"\n",
"\n",
" \n",
"\n",
"def build_ngkpt_convflow ( options = None , ngkpt_list = ([ 2 , 2 , 2 ], [ 4 , 4 , 4 ], [ 8 , 8 , 8 ])): \n",
" """ \n",
" Build and return a flow computing elastic and piezoelectric properties with \n",
" different k-point samplings given in `ngkpt_list`. \n",
" In principle, one should perform different structural relaxations for each `ngkpt` \n",
" and use the relaxed structures to compute elastic properties. \n",
" """ \n",
" workdir = options . workdir if ( options and options . workdir ) else "flow_elastic_ngkpt_conv" \n",
"\n",
" flow = flowtk . Flow ( workdir = workdir ) \n",
"\n",
" for ngkpt in ngkpt_list : \n",
" scf_input = make_scf_input ( ngkpt = ngkpt ) \n",
"\n",
" elast_work = flowtk . ElasticWork . from_scf_input ( scf_input , with_relaxed_ion = True , with_piezo = True ) \n",
"\n",
" flow . register_work ( elast_work ) \n",
"\n",
" return flow \n",
" \n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from lesson_elastic import build_ngkpt_convflow\n",
"abilab.print_source(build_ngkpt_convflow)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "d19487ca",
"metadata": {},
"outputs": [],
"source": [
"ngkpt_flow = build_ngkpt_convflow(options=None, ngkpt_list=([2, 2, 2], [4, 4, 4], [8, 8, 8]))"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "00e96ada",
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"flow \n",
" \n",
"Flow, node_id=141, workdir=flow_elastic_ngkpt_conv \n",
"\n",
"clusterw0 \n",
" \n",
"ElasticWork (w0) \n",
" \n",
"\n",
"clusterw1 \n",
" \n",
"ElasticWork (w1) \n",
" \n",
"\n",
"clusterw2 \n",
" \n",
"ElasticWork (w2) \n",
" \n",
"\n",
"\n",
"w0_t0 \n",
"\n",
"w0_t0 \n",
"ScfTask \n",
" \n",
"\n",
"\n",
"w0_t1 \n",
"\n",
"w0_t1 \n",
"DdkTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t1 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t2 \n",
"\n",
"w0_t2 \n",
"DdkTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t2 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t3 \n",
"\n",
"w0_t3 \n",
"DdkTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t3 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t4 \n",
"\n",
"w0_t4 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t4 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t5 \n",
"\n",
"w0_t5 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t5 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t6 \n",
"\n",
"w0_t6 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t6 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t7 \n",
"\n",
"w0_t7 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t7 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t8 \n",
"\n",
"w0_t8 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t8 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t9 \n",
"\n",
"w0_t9 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t9 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t10 \n",
"\n",
"w0_t10 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t10 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t11 \n",
"\n",
"w0_t11 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t11 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t12 \n",
"\n",
"w0_t12 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t12 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t13 \n",
"\n",
"w0_t13 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w0_t0->w0_t13 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t4 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t5 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t6 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t7 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t8 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t9 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t10 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t11 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t12 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t1->w0_t13 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t4 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t5 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t6 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t7 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t8 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t9 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t10 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t11 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t12 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t2->w0_t13 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t4 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t5 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t6 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t7 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t8 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t9 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t10 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t11 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t12 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w0_t3->w0_t13 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t0 \n",
"\n",
"w1_t0 \n",
"ScfTask \n",
" \n",
"\n",
"\n",
"w1_t1 \n",
"\n",
"w1_t1 \n",
"DdkTask \n",
" \n",
"\n",
"\n",
"w1_t0->w1_t1 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w1_t2 \n",
"\n",
"w1_t2 \n",
"DdkTask \n",
" \n",
"\n",
"\n",
"w1_t0->w1_t2 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w1_t3 \n",
"\n",
"w1_t3 \n",
"DdkTask \n",
" \n",
"\n",
"\n",
"w1_t0->w1_t3 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w1_t4 \n",
"\n",
"w1_t4 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w1_t0->w1_t4 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w1_t5 \n",
"\n",
"w1_t5 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w1_t0->w1_t5 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w1_t6 \n",
"\n",
"w1_t6 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w1_t0->w1_t6 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w1_t7 \n",
"\n",
"w1_t7 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w1_t0->w1_t7 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w1_t8 \n",
"\n",
"w1_t8 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w1_t0->w1_t8 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w1_t9 \n",
"\n",
"w1_t9 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w1_t0->w1_t9 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w1_t10 \n",
"\n",
"w1_t10 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w1_t0->w1_t10 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w1_t11 \n",
"\n",
"w1_t11 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w1_t0->w1_t11 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w1_t12 \n",
"\n",
"w1_t12 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w1_t0->w1_t12 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w1_t13 \n",
"\n",
"w1_t13 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w1_t0->w1_t13 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w1_t1->w1_t4 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t1->w1_t5 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t1->w1_t6 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t1->w1_t7 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t1->w1_t8 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t1->w1_t9 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t1->w1_t10 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t1->w1_t11 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t1->w1_t12 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t1->w1_t13 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t2->w1_t4 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t2->w1_t5 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t2->w1_t6 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t2->w1_t7 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t2->w1_t8 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t2->w1_t9 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t2->w1_t10 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t2->w1_t11 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t2->w1_t12 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t2->w1_t13 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t3->w1_t4 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t3->w1_t5 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t3->w1_t6 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t3->w1_t7 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t3->w1_t8 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t3->w1_t9 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t3->w1_t10 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t3->w1_t11 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t3->w1_t12 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w1_t3->w1_t13 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t0 \n",
"\n",
"w2_t0 \n",
"ScfTask \n",
" \n",
"\n",
"\n",
"w2_t1 \n",
"\n",
"w2_t1 \n",
"DdkTask \n",
" \n",
"\n",
"\n",
"w2_t0->w2_t1 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w2_t2 \n",
"\n",
"w2_t2 \n",
"DdkTask \n",
" \n",
"\n",
"\n",
"w2_t0->w2_t2 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w2_t3 \n",
"\n",
"w2_t3 \n",
"DdkTask \n",
" \n",
"\n",
"\n",
"w2_t0->w2_t3 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w2_t4 \n",
"\n",
"w2_t4 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w2_t0->w2_t4 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w2_t5 \n",
"\n",
"w2_t5 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w2_t0->w2_t5 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w2_t6 \n",
"\n",
"w2_t6 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w2_t0->w2_t6 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w2_t7 \n",
"\n",
"w2_t7 \n",
"PhononTask \n",
" \n",
"\n",
"\n",
"w2_t0->w2_t7 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w2_t8 \n",
"\n",
"w2_t8 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w2_t0->w2_t8 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w2_t9 \n",
"\n",
"w2_t9 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w2_t0->w2_t9 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w2_t10 \n",
"\n",
"w2_t10 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w2_t0->w2_t10 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w2_t11 \n",
"\n",
"w2_t11 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w2_t0->w2_t11 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w2_t12 \n",
"\n",
"w2_t12 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w2_t0->w2_t12 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w2_t13 \n",
"\n",
"w2_t13 \n",
"ElasticTask \n",
" \n",
"\n",
"\n",
"w2_t0->w2_t13 \n",
" \n",
" \n",
"WFK \n",
" \n",
"\n",
"\n",
"w2_t1->w2_t4 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t1->w2_t5 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t1->w2_t6 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t1->w2_t7 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t1->w2_t8 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t1->w2_t9 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t1->w2_t10 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t1->w2_t11 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t1->w2_t12 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t1->w2_t13 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t2->w2_t4 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t2->w2_t5 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t2->w2_t6 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t2->w2_t7 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t2->w2_t8 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t2->w2_t9 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t2->w2_t10 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t2->w2_t11 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t2->w2_t12 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t2->w2_t13 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t3->w2_t4 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t3->w2_t5 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t3->w2_t6 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t3->w2_t7 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t3->w2_t8 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t3->w2_t9 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t3->w2_t10 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t3->w2_t11 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t3->w2_t12 \n",
" \n",
" \n",
"DDK \n",
" \n",
"\n",
"\n",
"w2_t3->w2_t13 \n",
" \n",
" \n",
"DDK \n",
" \n",
" \n",
" \n"
],
"text/plain": [
""
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ngkpt_flow.get_graphviz()"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "d3389b69",
"metadata": {},
"outputs": [],
"source": [
"#ngkpt_flow.get_vars_dataframe(\"ngkpt\")"
]
},
{
"cell_type": "markdown",
"id": "6a191e93",
"metadata": {},
"source": [
"To generate the flow with the `lesson_elastic.py` script, open the file,\n",
"comment the call to `build_flow` and uncomment `build_ngkpt_convflow`.\n",
"Then run the script and launch the calculation with:\n",
"\n",
" abirun.py flow_elastic_ngkpt_conv scheduler\n",
"\n",
"as usual.\n",
"\n",
"There are several output files located inside the `outdata` directories:"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "c1172400",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"flow_elastic_ngkpt_conv/w2/outdata/out_DDB\r\n",
"flow_elastic_ngkpt_conv/w1/outdata/out_DDB\r\n",
"flow_elastic_ngkpt_conv/w0/outdata/out_DDB\r\n"
]
}
],
"source": [
"!find flow_elastic_ngkpt_conv/ -name \"*_DDB\""
]
},
{
"cell_type": "markdown",
"id": "1f679ccf",
"metadata": {},
"source": [
"Remember that our goal is to analyze the convergence of the elastic and piezoelectric properties\n",
"as function of `nkpt`.\n",
"So we are mainly interested in the final DDB files located in the `outdata` directories\n",
"of the works (`w0/outdata`, `w1/outdata`, `w2/outdata`).\n",
"These are indeed the DDB files with all the information needed in anaddb to compute the tensors.\n",
"\n",
"The code below tells our robot that we would like to analyze all the DDB files\n",
"located in the output directories of the works:"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "758b1944",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"flow_elastic_ngkpt_conv/w2/outdata/out_DDB \n",
"flow_elastic_ngkpt_conv/w1/outdata/out_DDB \n",
"flow_elastic_ngkpt_conv/w0/outdata/out_DDB \n",
" "
],
"text/plain": [
"Label Relpath\n",
"------------------------------------------ ------------------------------------------\n",
"flow_elastic_ngkpt_conv/w2/outdata/out_DDB flow_elastic_ngkpt_conv/w2/outdata/out_DDB\n",
"flow_elastic_ngkpt_conv/w1/outdata/out_DDB flow_elastic_ngkpt_conv/w1/outdata/out_DDB\n",
"flow_elastic_ngkpt_conv/w0/outdata/out_DDB flow_elastic_ngkpt_conv/w0/outdata/out_DDB"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"robot = abilab.DdbRobot.from_dir_glob(\"./flow_elastic_ngkpt_conv/w*/outdata/\")\n",
"robot"
]
},
{
"cell_type": "markdown",
"id": "cadfc4a0",
"metadata": {},
"source": [
"The DDB file are available in `robot.abifile`.\n",
"Each `DdbFile` object has a header (dictionary) containing metadata extracted from the DDB file.\n",
"To get the keywords in the header, use:"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "767b8fcd",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"dict_keys(['version', 'lines', 'usepaw', 'natom', 'nkpt', 'nsppol', 'nsym', 'ntypat', 'occopt', 'nband', 'acell', 'amu', 'dilatmx', 'ecut', 'ecutsm', 'intxc', 'iscf', 'ixc', 'kpt', 'kptnrm', 'ngfft', 'nspden', 'nspinor', 'occ', 'rprim', 'dfpt_sciss', 'spinat', 'symafm', 'symrel', 'tnons', 'tolwfr', 'tphysel', 'tsmear', 'typat', 'wtk', 'xred', 'znucl', 'zion'])"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"robot.abifiles[0].header.keys()"
]
},
{
"cell_type": "markdown",
"id": "6efa7131",
"metadata": {},
"source": [
"We will be using these meta variables to construct our pandas Dataframe so that we can analyze\n",
"the convergence of our physical quantities with e.g. `nkpt`.\n",
"\n",
"Let's call `anacompare_elastic` to construct a DataFrame (`data`) with the elastic properties obtained\n",
"with the three DDB files and add the value of `ddb.header[\"nkpt\"]`.\n",
"`elastdata_list` is a list of `ElastData` object we can use afterwards to access the individual tensors:"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "07eb1b0c",
"metadata": {},
"outputs": [],
"source": [
"data, elastdata_list = robot.anacompare_elastic(ddb_header_keys=\"nkpt\")"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "e379370f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['trans_v', 'long_v', 'snyder_ac', 'snyder_opt', 'snyder_total',\n",
" 'clarke_thermalcond', 'cahill_thermalcond', 'debye_temperature',\n",
" 'k_voigt', 'k_reuss', 'k_vrh', 'g_voigt', 'g_reuss', 'g_vrh',\n",
" 'universal_anisotropy', 'homogeneous_poisson', 'y_mod', 'tensor_name',\n",
" 'formula', 'nkpt', 'natom', 'alpha', 'beta', 'gamma', 'a', 'b', 'c',\n",
" 'volume', 'abispg_num', 'spglib_symb', 'spglib_num',\n",
" 'spglib_lattice_type'],\n",
" dtype='object')"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.keys()"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "7e038f27",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" trans_v \n",
" long_v \n",
" snyder_ac \n",
" snyder_opt \n",
" snyder_total \n",
" clarke_thermalcond \n",
" cahill_thermalcond \n",
" debye_temperature \n",
" k_voigt \n",
" k_reuss \n",
" ... \n",
" beta \n",
" gamma \n",
" a \n",
" b \n",
" c \n",
" volume \n",
" abispg_num \n",
" spglib_symb \n",
" spglib_num \n",
" spglib_lattice_type \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 3187.357490 \n",
" 5761.696015 \n",
" 56.983956 \n",
" 0.314556 \n",
" 57.298512 \n",
" 0.770980 \n",
" 0.850540 \n",
" 375.118016 \n",
" 74.267964 \n",
" 74.258479 \n",
" ... \n",
" 90.0 \n",
" 120.0 \n",
" 3.989448 \n",
" 3.989448 \n",
" 6.49713 \n",
" 89.552529 \n",
" 0 \n",
" P6_3mc \n",
" 186 \n",
" hexagonal \n",
" \n",
" \n",
" 1 \n",
" 3849.753468 \n",
" 6277.945639 \n",
" 87.049415 \n",
" 0.362273 \n",
" 87.411688 \n",
" 0.901308 \n",
" 0.979563 \n",
" 448.886026 \n",
" 74.268035 \n",
" 74.260840 \n",
" ... \n",
" 90.0 \n",
" 120.0 \n",
" 3.989448 \n",
" 3.989448 \n",
" 6.49713 \n",
" 89.552529 \n",
" 0 \n",
" P6_3mc \n",
" 186 \n",
" hexagonal \n",
" \n",
" \n",
" 2 \n",
" 3194.458696 \n",
" 5796.034979 \n",
" 57.670442 \n",
" 0.315814 \n",
" 57.986256 \n",
" 0.773405 \n",
" 0.853941 \n",
" 376.062257 \n",
" 75.538650 \n",
" 75.530735 \n",
" ... \n",
" 90.0 \n",
" 120.0 \n",
" 3.989448 \n",
" 3.989448 \n",
" 6.49713 \n",
" 89.552529 \n",
" 0 \n",
" P6_3mc \n",
" 186 \n",
" hexagonal \n",
" \n",
" \n",
" 3 \n",
" 3838.051896 \n",
" 6295.200076 \n",
" 86.934586 \n",
" 0.362113 \n",
" 87.296699 \n",
" 0.900635 \n",
" 0.979132 \n",
" 447.787424 \n",
" 75.539303 \n",
" 75.535785 \n",
" ... \n",
" 90.0 \n",
" 120.0 \n",
" 3.989448 \n",
" 3.989448 \n",
" 6.49713 \n",
" 89.552529 \n",
" 0 \n",
" P6_3mc \n",
" 186 \n",
" hexagonal \n",
" \n",
" \n",
" 4 \n",
" 3151.515933 \n",
" 5705.015874 \n",
" 55.194905 \n",
" 0.311229 \n",
" 55.506134 \n",
" 0.762578 \n",
" 0.841544 \n",
" 370.940943 \n",
" 73.572019 \n",
" 72.331727 \n",
" ... \n",
" 90.0 \n",
" 120.0 \n",
" 3.989448 \n",
" 3.989448 \n",
" 6.49713 \n",
" 89.552529 \n",
" 0 \n",
" P6_3mc \n",
" 186 \n",
" hexagonal \n",
" \n",
" \n",
" 5 \n",
" 3753.376690 \n",
" 6179.896893 \n",
" 81.728454 \n",
" 0.354736 \n",
" 82.083190 \n",
" 0.882070 \n",
" 0.959183 \n",
" 438.077881 \n",
" 73.667176 \n",
" 73.014097 \n",
" ... \n",
" 90.0 \n",
" 120.0 \n",
" 3.989448 \n",
" 3.989448 \n",
" 6.49713 \n",
" 89.552529 \n",
" 0 \n",
" P6_3mc \n",
" 186 \n",
" hexagonal \n",
" \n",
" \n",
"
\n",
"
6 rows × 32 columns
\n",
"
"
],
"text/plain": [
" trans_v long_v snyder_ac snyder_opt snyder_total \\\n",
"0 3187.357490 5761.696015 56.983956 0.314556 57.298512 \n",
"1 3849.753468 6277.945639 87.049415 0.362273 87.411688 \n",
"2 3194.458696 5796.034979 57.670442 0.315814 57.986256 \n",
"3 3838.051896 6295.200076 86.934586 0.362113 87.296699 \n",
"4 3151.515933 5705.015874 55.194905 0.311229 55.506134 \n",
"5 3753.376690 6179.896893 81.728454 0.354736 82.083190 \n",
"\n",
" clarke_thermalcond cahill_thermalcond debye_temperature k_voigt \\\n",
"0 0.770980 0.850540 375.118016 74.267964 \n",
"1 0.901308 0.979563 448.886026 74.268035 \n",
"2 0.773405 0.853941 376.062257 75.538650 \n",
"3 0.900635 0.979132 447.787424 75.539303 \n",
"4 0.762578 0.841544 370.940943 73.572019 \n",
"5 0.882070 0.959183 438.077881 73.667176 \n",
"\n",
" k_reuss ... beta gamma a b c volume \\\n",
"0 74.258479 ... 90.0 120.0 3.989448 3.989448 6.49713 89.552529 \n",
"1 74.260840 ... 90.0 120.0 3.989448 3.989448 6.49713 89.552529 \n",
"2 75.530735 ... 90.0 120.0 3.989448 3.989448 6.49713 89.552529 \n",
"3 75.535785 ... 90.0 120.0 3.989448 3.989448 6.49713 89.552529 \n",
"4 72.331727 ... 90.0 120.0 3.989448 3.989448 6.49713 89.552529 \n",
"5 73.014097 ... 90.0 120.0 3.989448 3.989448 6.49713 89.552529 \n",
"\n",
" abispg_num spglib_symb spglib_num spglib_lattice_type \n",
"0 0 P6_3mc 186 hexagonal \n",
"1 0 P6_3mc 186 hexagonal \n",
"2 0 P6_3mc 186 hexagonal \n",
"3 0 P6_3mc 186 hexagonal \n",
"4 0 P6_3mc 186 hexagonal \n",
"5 0 P6_3mc 186 hexagonal \n",
"\n",
"[6 rows x 32 columns]"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "90c8abcb",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" k_voigt \n",
" nkpt \n",
" tensor_name \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 74.267964 \n",
" 40 \n",
" elastic_relaxed \n",
" \n",
" \n",
" 1 \n",
" 74.268035 \n",
" 40 \n",
" elastic_clamped \n",
" \n",
" \n",
" 2 \n",
" 75.538650 \n",
" 8 \n",
" elastic_relaxed \n",
" \n",
" \n",
" 3 \n",
" 75.539303 \n",
" 8 \n",
" elastic_clamped \n",
" \n",
" \n",
" 4 \n",
" 73.572019 \n",
" 2 \n",
" elastic_relaxed \n",
" \n",
" \n",
" 5 \n",
" 73.667176 \n",
" 2 \n",
" elastic_clamped \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" k_voigt nkpt tensor_name\n",
"0 74.267964 40 elastic_relaxed\n",
"1 74.268035 40 elastic_clamped\n",
"2 75.538650 8 elastic_relaxed\n",
"3 75.539303 8 elastic_clamped\n",
"4 73.572019 2 elastic_relaxed\n",
"5 73.667176 2 elastic_clamped"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data[[\"k_voigt\", \"nkpt\", \"tensor_name\"]]"
]
},
{
"cell_type": "markdown",
"id": "3e6fdf67",
"metadata": {},
"source": [
"To plot the convergence of selected properties versus the number of k-points, use:"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "eebec8b5",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"robot.plot_xy_with_hue(data, x=\"nkpt\", y=[\"k_voigt\", \"g_voigt\", \"y_mod\"], hue=\"tensor_name\");"
]
},
{
"cell_type": "markdown",
"id": "9ee53d17",
"metadata": {},
"source": [
"For more examples on the use of DDB and robots, see the\n",
"[DDB notebook](https://nbviewer.jupyter.org/github/abinit/abitutorials/blob/master/abitutorials/ddb.ipynb)\n",
"\n",
"Now let's try something a bit more complicated.\n",
"Assume we want to plot the convergence of the individual elements of the tensor as as function of `nkpt`.\n",
"In this case, we have to work a bit more to create a Dataframe with the elements in Voigt notation,\n",
"add the value of `nkpt` associated to this tensor and finally concatenate the results in a single DataFrame:"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "c2949032",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" voigt_cinds \n",
" elastic_relaxed \n",
" elastic_clamped \n",
" nkpt \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" (0, 0) \n",
" 1.309889e+02 \n",
" 1.628166e+02 \n",
" 40 \n",
" \n",
" \n",
" 1 \n",
" (0, 1) \n",
" 5.249070e+01 \n",
" 3.820562e+01 \n",
" 40 \n",
" \n",
" \n",
" 2 \n",
" (0, 2) \n",
" 3.807428e+01 \n",
" 2.045653e+01 \n",
" 40 \n",
" \n",
" \n",
" 3 \n",
" (0, 3) \n",
" 4.710262e-09 \n",
" 4.611456e-09 \n",
" 40 \n",
" \n",
" \n",
" 4 \n",
" (0, 4) \n",
" 7.390751e-08 \n",
" -5.268783e-09 \n",
" 40 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" voigt_cinds elastic_relaxed elastic_clamped nkpt\n",
"0 (0, 0) 1.309889e+02 1.628166e+02 40\n",
"1 (0, 1) 5.249070e+01 3.820562e+01 40\n",
"2 (0, 2) 3.807428e+01 2.045653e+01 40\n",
"3 (0, 3) 4.710262e-09 4.611456e-09 40\n",
"4 (0, 4) 7.390751e-08 -5.268783e-09 40"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_list = []\n",
"for edata, ddb in zip(elastdata_list, robot.abifiles):\n",
"\n",
" # Get dataframe with tensor elements in Voigt notation\n",
" df = edata.get_elastic_voigt_dataframe()\n",
"\n",
" # Add metadata and store dataframe in df_list\n",
" df[\"nkpt\"] = ddb.header[\"nkpt\"]\n",
" df_list.append(df)\n",
"\n",
"# Concatenate dataframes\n",
"import pandas as pd\n",
"data = pd.concat(df_list)\n",
"data.head()"
]
},
{
"cell_type": "markdown",
"id": "7cb078aa",
"metadata": {},
"source": [
"To select only the (0, 0) elements, use the syntax:"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "eaa4a303",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" voigt_cinds \n",
" elastic_relaxed \n",
" elastic_clamped \n",
" nkpt \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" (0, 0) \n",
" 130.988919 \n",
" 162.816606 \n",
" 40 \n",
" \n",
" \n",
" 0 \n",
" (0, 0) \n",
" 135.262182 \n",
" 165.988592 \n",
" 8 \n",
" \n",
" \n",
" 0 \n",
" (0, 0) \n",
" 152.688699 \n",
" 177.895515 \n",
" 2 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" voigt_cinds elastic_relaxed elastic_clamped nkpt\n",
"0 (0, 0) 130.988919 162.816606 40\n",
"0 (0, 0) 135.262182 165.988592 8\n",
"0 (0, 0) 152.688699 177.895515 2"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c00 = data[data[\"voigt_cinds\"] == (0, 0)]\n",
"c00"
]
},
{
"cell_type": "markdown",
"id": "119ac92e",
"metadata": {},
"source": [
"Now we can finally plot the (0, 0) tensor elements as function of `nkpt` with:"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "53c532a0",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"c00.plot(x=\"nkpt\", y=[k for k in c00 if k.startswith(\"elastic_\")], subplots=True, style=\"-o\");"
]
}
],
"metadata": {
"jupytext": {
"text_representation": {
"extension": ".md",
"format_name": "myst",
"format_version": 0.13,
"jupytext_version": "1.10.3"
}
},
"kernelspec": {
"display_name": "Python [default]",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.2"
},
"source_map": [
12,
16,
59,
74,
78,
81,
92,
97,
101,
103,
112,
115,
125,
128,
132,
135,
139,
143,
146,
166,
168,
173,
175,
204,
213,
216,
223,
225,
231,
233,
237,
239,
245,
247,
251,
253,
260,
262,
266,
268,
272,
277,
279,
284,
288,
290,
300,
304,
308,
310,
328,
333,
337,
341,
343,
355,
357,
368,
371,
377,
379,
388,
392,
396,
400,
402,
406,
408,
418,
433,
437,
440,
444
]
},
"nbformat": 4,
"nbformat_minor": 5
}