mirror of
https://github.com/triqs/dft_tools
synced 2024-09-26 19:40:48 +02:00
357 lines
12 KiB
Plaintext
357 lines
12 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {
|
|
"nbsphinx": "hidden"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import matplotlib\n",
|
|
"matplotlib.use(\"Pdf\")\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"%matplotlib inline\n",
|
|
"%config InlineBackend.figure_format = 'svg'\n",
|
|
"\n",
|
|
"# set matplotlib parameters\n",
|
|
"params = {'backend': 'ps',\n",
|
|
" 'axes.labelsize': 13,\n",
|
|
" 'font.size': 13,\n",
|
|
" 'legend.fontsize': 13,\n",
|
|
" 'xtick.labelsize': 13,\n",
|
|
" 'ytick.labelsize': 13,\n",
|
|
" 'text.usetex': False,\n",
|
|
" 'text.latex.preamble': \"\\\\usepackage{mathpazo}, \\\\usepackage{amsmath}\",\n",
|
|
" 'font.family': 'sans-serif',\n",
|
|
" 'font.sans-serif': ['Computer Modern Sans serif']}\n",
|
|
"plt.rcParams.update(params)\n",
|
|
"\n",
|
|
"import warnings \n",
|
|
"warnings.filterwarnings(\"ignore\") #ignore some matplotlib warnings\n",
|
|
"\n",
|
|
"# numpy\n",
|
|
"import numpy as np"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"In this basic example we will perform a VASP calculation for SrVO$_3$, build PLOs for the Vanadium t$_{2g}$ orbitals, and load them as SumK object, which can be then used to perform a DMFT calculation.\n",
|
|
"\n",
|
|
"## VASP setup\n",
|
|
"\n",
|
|
"First we setup the VASP [INCAR link](INCAR) file by specifing the LOCPROJ, EMIN, EMAX and LORBIT flags:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"```\n",
|
|
"SYSTEM = SrVO3\n",
|
|
"NCORE = 4\n",
|
|
"LMAXMIX=6\n",
|
|
"EDIFF = 1.E-10\n",
|
|
"\n",
|
|
"# DOS energy window\n",
|
|
"NEDOS = 2001\n",
|
|
"\n",
|
|
"! switch off symmetries\n",
|
|
"ISYM=-1\n",
|
|
"\n",
|
|
"# Smearing procedure\n",
|
|
"ISMEAR = -5\n",
|
|
"\n",
|
|
"# the energy window to optimize projector channels\n",
|
|
"EMIN = 3.9\n",
|
|
"EMAX = 7.1\n",
|
|
"\n",
|
|
"# use the PAW channel optimization\n",
|
|
"LORBIT=14\n",
|
|
"\n",
|
|
"# project to V d\n",
|
|
"LOCPROJ = 2 : d : Pr\n",
|
|
"```\n",
|
|
"Moreover we prepare a [KPOINTS link](KPOINTS), [POSCAR link](POSCAR), and a POTCAR file. For the POTCAR file please use the VASP provided PBE pseudopotentials: `Sr_sv`, `V`, and `O`. \n",
|
|
"\n",
|
|
"Now VASP is executed, which should converge in roughly 27 iterations. Afterwards you should find the files LOCPROJ and PROJCAR in you directory. \n",
|
|
"\n",
|
|
"## PLOVASP\n",
|
|
"\n",
|
|
"First import the PLOVASP module of DFTTools:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Starting run with 1 MPI rank(s) at : 2019-12-05 16:12:52.689539\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# import plovasp converter\n",
|
|
"import triqs_dft_tools.converters.plovasp.converter as plo_converter"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Next, create a configuration file for plovasp [plo.cfg link](plo.cfg):\n",
|
|
"\n",
|
|
"```\n",
|
|
"[General]\n",
|
|
"DOSMESH = -3.0 3.0 2001\n",
|
|
"\n",
|
|
"[Shell 1]\n",
|
|
"LSHELL = 2\n",
|
|
"IONS = 2\n",
|
|
"EWINDOW = -1.4 2.0\n",
|
|
"\n",
|
|
"TRANSFORM = 1.0 0.0 0.0 0.0 0.0\n",
|
|
" 0.0 1.0 0.0 0.0 0.0\n",
|
|
" 0.0 0.0 0.0 1.0 0.0\n",
|
|
"\n",
|
|
"```\n",
|
|
"where the energy window of the t$_{2g}$ bands is specified by `EWINDOW` and the `TRANSFORM` flag picks the correct three orbitals out of the five Vanadium $d$ orbitals [see the guide for the ordering of orbitals](../../guide/conv_vasp.html). Before running PLOVASP, make sure that the Fermi energy is written in the first line of the `LOCPROJ` file, or copy it there (see the VASP [interface guide](../../guide/conv_vasp.html) for more information). The first line should look like\n",
|
|
"```\n",
|
|
"1 729 21 5 5.3834262 # of spin, # of k-points, # of bands, # of proj, Efermi\n",
|
|
"```\n",
|
|
"\n",
|
|
"Now run PLOVASP:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Read parameters:\n",
|
|
"0 -> {'m': 0, 'l': 2, 'isite': 2, 'label': 'dxy'}\n",
|
|
"1 -> {'m': 1, 'l': 2, 'isite': 2, 'label': 'dyz'}\n",
|
|
"2 -> {'m': 2, 'l': 2, 'isite': 2, 'label': 'dz2'}\n",
|
|
"3 -> {'m': 3, 'l': 2, 'isite': 2, 'label': 'dxz'}\n",
|
|
"4 -> {'m': 4, 'l': 2, 'isite': 2, 'label': 'dx2-y2'}\n",
|
|
" Found POSCAR, title line: SrVO3\n",
|
|
" Total number of ions: 5\n",
|
|
" Number of types: 3\n",
|
|
" Number of ions for each type: [1, 1, 3]\n",
|
|
"\n",
|
|
" Total number of k-points: 729\n",
|
|
" Total number of tetrahedra: 4374\n",
|
|
"eigvals from LOCPROJ\n",
|
|
"\n",
|
|
" Unorthonormalized density matrices and overlaps:\n",
|
|
" Spin: 1\n",
|
|
" Site: 2\n",
|
|
" Density matrix Overlap\n",
|
|
" 0.5875772 0.0015679 -0.0003707 0.0015674 0.0000000 0.9294791 -0.0000080 -0.0000078 -0.0000080 -0.0000001\n",
|
|
" 0.0015679 0.5876177 -0.0001854 -0.0016078 0.0003240 -0.0000080 0.9294790 -0.0000042 0.0000080 0.0000070\n",
|
|
" -0.0003707 -0.0001854 0.5815486 -0.0001854 -0.0000000 -0.0000078 -0.0000042 0.9715751 -0.0000038 0.0000003\n",
|
|
" 0.0015674 -0.0016078 -0.0001854 0.5876172 -0.0003240 -0.0000080 0.0000080 -0.0000038 0.9294791 -0.0000066\n",
|
|
" 0.0000000 0.0003240 -0.0000000 -0.0003240 0.5815487 -0.0000001 0.0000070 0.0000003 -0.0000066 0.9715748\n",
|
|
"\n",
|
|
" Generating 1 shell...\n",
|
|
"\n",
|
|
" Shell : 1\n",
|
|
" Orbital l : 2\n",
|
|
" Number of ions: 1\n",
|
|
" Dimension : 3\n",
|
|
" Correlated : True\n",
|
|
" Ion sort : [1]\n",
|
|
"Density matrix:\n",
|
|
" Shell 1\n",
|
|
" Site 1\n",
|
|
" 0.3332630 0.0021719 0.0021714\n",
|
|
" 0.0021719 0.3333128 -0.0022211\n",
|
|
" 0.0021714 -0.0022211 0.3333123\n",
|
|
" trace: 0.9998880790966638\n",
|
|
"\n",
|
|
" Impurity density: 0.9998880790966638\n",
|
|
"\n",
|
|
"Overlap:\n",
|
|
" Site 1\n",
|
|
"[[ 1. -0. 0.]\n",
|
|
" [-0. 1. 0.]\n",
|
|
" [ 0. 0. 1.]]\n",
|
|
"\n",
|
|
"Local Hamiltonian:\n",
|
|
" Shell 1\n",
|
|
" Site 1\n",
|
|
" 0.5633806 0.0007563 0.0007563\n",
|
|
" 0.0007563 0.5633801 -0.0007559\n",
|
|
" 0.0007563 -0.0007559 0.5633801\n",
|
|
"\n",
|
|
"Evaluating DOS...\n",
|
|
" Shell 1\n",
|
|
" Total number of states: [[[7.33737319 7.48285647 7.28002405]]]\n",
|
|
" Storing ctrl-file...\n",
|
|
" Storing PLO-group file 'vasp.pg1'...\n",
|
|
" Density within window: 0.9999741659673522\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Generate and store PLOs\n",
|
|
"plo_converter.generate_and_output_as_text('plo.cfg', vasp_dir='./')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"PLOVASP created one shell with three orbitals, which are equally filled by 1/3, one electron in total. Additionally we calculated the density of states. Both in VASP and PLOVASP. The later stores the data in the file pdos_x.dat, which can be simply plotted with [matplotlib](https://matplotlib.org/). The result should look similar to:\n",
|
|
"\n",
|
|
"![](svo_dos.svg)\n",
|
|
"\n",
|
|
"Here the gray area highlights the energy window for the PLOs. The total DOS of VASP (blue) coincides with the PLO DOS in the window, as we re-orthonormalized the projector functions in the given window, picking up also Oxygen weight. This setting is closed to the result of maximally localized Wannier functions created with [wannier90](http://www.wannier.org/) without running the actual minimization of the spread. Note, for a proper comparison one can use the hydrogen projector in VASP by using the the line `LOCPROJ= 2 : d : Hy`, instead of `Pr`. \n",
|
|
"\n",
|
|
"\n",
|
|
"## Converting to hdf5 file\n",
|
|
"\n",
|
|
"Finally we can run the VASP converter to create a h5 file:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Reading input from vasp.ctrl...\n",
|
|
"{\n",
|
|
" \"ngroups\": 1,\n",
|
|
" \"nk\": 729,\n",
|
|
" \"ns\": 1,\n",
|
|
" \"nc_flag\": 0\n",
|
|
"}\n",
|
|
"\n",
|
|
" No. of inequivalent shells: 1\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# import VASPconverter\n",
|
|
"from triqs_dft_tools.converters.vasp_converter import *\n",
|
|
"\n",
|
|
"\n",
|
|
"# create Converter\n",
|
|
"Converter = VaspConverter(filename = 'vasp')\n",
|
|
"# run the converter\n",
|
|
"Converter.convert_dft_input()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"The resulting h5 file `vasp.h5` can now be loaded as sumk object via:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# SumK\n",
|
|
"from triqs_dft_tools.sumk_dft_tools import SumkDFTTools\n",
|
|
"\n",
|
|
"SK = SumkDFTTools(hdf_file='vasp.h5', use_dft_blocks = False)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Here one should carefully determine the block structure manually. This is important to find degenerate orbitals and spin-channels:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"found 1 blocks of degenerate orbitals in shell 0\n",
|
|
"block 0 consists of orbitals:\n",
|
|
" up_2\n",
|
|
" up_0\n",
|
|
" up_1\n",
|
|
" down_2\n",
|
|
" down_1\n",
|
|
" down_0\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"Sigma = SK.block_structure.create_gf(beta=40)\n",
|
|
"SK.put_Sigma([Sigma])\n",
|
|
"G = SK.extract_G_loc()\n",
|
|
"SK.analyse_block_structure_from_gf(G, threshold = 1e-3)\n",
|
|
"for i_sh in range(len(SK.deg_shells)):\n",
|
|
" num_block_deg_orbs = len(SK.deg_shells[i_sh])\n",
|
|
" mpi.report('found {0:d} blocks of degenerate orbitals in shell {1:d}'.format(num_block_deg_orbs, i_sh))\n",
|
|
" for iblock in range(num_block_deg_orbs):\n",
|
|
" mpi.report('block {0:d} consists of orbitals:'.format(iblock))\n",
|
|
" for keys in list(SK.deg_shells[i_sh][iblock].keys()):\n",
|
|
" mpi.report(' '+keys)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"This minimal example extracts the block structure by calculating once the local Green's functions and then finds degenerate orbitals with a certain threshold in `Gloc`. Afterwards the result is reported, where 1 block is found with size 6 (3x2 orbitals for spin), where a all 6 orbitals are marked as degenerate. This is indeed correct in cubic SrVO$_3$, as all 3 t$_{2g}$ orbitals are degenerate. Note: for a magnetic calculation one has to break the symmetry between up and down at this point manually. Moreover, one can reduce the threshold for example to `1e-5` and finds that then the degeneracy of the 3 t$_{2g}$ orbitals is not found anymore, resulting in only two degenerate blocks for spin up and down, each with size 3x3.\n",
|
|
"\n",
|
|
"Afterwards the exact same DMFT script as in the [Wien2k tutorial](../srvo3.html) can be used. For a more elaborate example including charge self-consistency take a look at the [VASP NiO example](../nio_csc.html)."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|