docs/build/_modules/effmass/inputs.html
<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>effmass.inputs — effmass 1.0.0 documentation</title>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<!--[if lt IE 9]>
<script src="../../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> effmass
</a>
<div class="version">
1.0.0
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../Features.html">Features</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Supported%20codes.html">Supported Codes</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../API%20documentation.html">API documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Implementation.html">Implementation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Related%20packages.html">Related packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Development.html">Development</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Testing.html">Testing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Citing.html">Citing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../License.html">License</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Contributors.html">Contributors</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Acknowledgements.html">Acknowledgements</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">effmass</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html" class="icon icon-home"></a> »</li>
<li><a href="../index.html">Module code</a> »</li>
<li>effmass.inputs</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for effmass.inputs</h1><div class="highlight"><pre>
<span></span><span class="ch">#! /usr/bin/env python3</span>
<span class="sd">"""</span>
<span class="sd">A module for storing electronic structure data and user settings. Currently supported codes are VASP and FHI-Aims (with limited functionality).</span>
<span class="sd">The module contains a :class:`Data` class which parses OUTCAR and PROCAR files using the `vasppy <https://github.com/bjmorgan/vasppy>`_ package. </span>
<span class="sd">A function for parsing DOSCAR files is also provided. </span>
<span class="sd">The module contains a :class:`DataAims` class which parses and stores the `geometry.in`/`calculation.out` files generated for/from a FHI-AIMS calculation.</span>
<span class="sd">A :class:`Settings` class stores analysis parameters set by the user.</span>
<span class="sd">"""</span>
<span class="kn">from</span> <span class="nn">vasppy</span> <span class="kn">import</span> <span class="n">procar</span><span class="p">,</span> <span class="n">outcar</span>
<span class="kn">from</span> <span class="nn">effmass</span> <span class="kn">import</span> <span class="n">extrema</span>
<span class="kn">from</span> <span class="nn">ase.calculators.castep</span> <span class="kn">import</span> <span class="n">Castep</span>
<span class="kn">from</span> <span class="nn">ase</span> <span class="kn">import</span> <span class="n">io</span>
<span class="kn">import</span> <span class="nn">ase.io</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="kn">import</span> <span class="nn">warnings</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<div class="viewcode-block" id="Settings"><a class="viewcode-back" href="../../inputs.html#effmass.inputs.Settings">[docs]</a><span class="k">class</span> <span class="nc">Settings</span><span class="p">:</span>
<span class="sd">"""Class for setting analysis parameters.</span>
<span class="sd"> Attributes: energy_range (float): energy in kT over which the</span>
<span class="sd"> segment extends. extrema_search_depth (float): energy in kT from</span>
<span class="sd"> bandedge over which to search for extrema. degree_bandfit (int):</span>
<span class="sd"> the degree of the polynomial which is used to fit to dispersion data</span>
<span class="sd"> when calculating the transport mass.</span>
<span class="sd"> """</span>
<div class="viewcode-block" id="Settings.__init__"><a class="viewcode-back" href="../../inputs.html#effmass.inputs.Settings.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">energy_range</span><span class="o">=</span><span class="mf">0.25</span><span class="p">,</span>
<span class="n">extrema_search_depth</span><span class="o">=</span><span class="mf">0.025</span><span class="p">,</span>
<span class="n">bandfit</span><span class="o">=</span><span class="mi">6</span><span class="p">):</span>
<span class="sd">"""Initialises an instance of the Settings class and checks input using</span>
<span class="sd"> :meth:`check_settings()`.</span>
<span class="sd"> Args:</span>
<span class="sd"> energy_range (float): energy in eV over which the segment extends. Defaults to 0.25 eV.</span>
<span class="sd"> extrema_search_depth (float): energy in eV from bandedge over which to search for extrema. Defaults to 0.025 eV.</span>
<span class="sd"> degree_bandfit (int): the degree of the polynomial which is used to fit to dispersion data when calculating the transport mass.</span>
<span class="sd"> Returns:</span>
<span class="sd"> None.</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">energy_range</span> <span class="o">=</span> <span class="n">energy_range</span>
<span class="bp">self</span><span class="o">.</span><span class="n">extrema_search_depth</span> <span class="o">=</span> <span class="n">extrema_search_depth</span>
<span class="bp">self</span><span class="o">.</span><span class="n">degree_bandfit</span> <span class="o">=</span> <span class="n">bandfit</span>
<span class="bp">self</span><span class="o">.</span><span class="n">check_settings</span><span class="p">()</span></div>
<div class="viewcode-block" id="Settings.check_settings"><a class="viewcode-back" href="../../inputs.html#effmass.inputs.Settings.check_settings">[docs]</a> <span class="k">def</span> <span class="nf">check_settings</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""Check that Settings class attributes are sane.</span>
<span class="sd"> Args:</span>
<span class="sd"> None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> None.</span>
<span class="sd"> """</span>
<span class="k">assert</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">energy_range</span> <span class="o">></span>
<span class="mi">0</span><span class="p">),</span> <span class="s2">"The energy range must be a positive number"</span>
<span class="k">assert</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">extrema_search_depth</span> <span class="o">></span>
<span class="mi">0</span><span class="p">),</span> <span class="s2">"The energy depth must be a positive number"</span>
<span class="k">assert</span> <span class="p">(</span>
<span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">degree_bandfit</span><span class="p">)</span> <span class="o">==</span> <span class="nb">int</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">degree_bandfit</span> <span class="o">></span> <span class="mi">1</span>
<span class="p">),</span> <span class="s2">"The bandfit degree must be a positive integer greater than 1"</span> </div></div>
<div class="viewcode-block" id="Data"><a class="viewcode-back" href="../../inputs.html#effmass.inputs.Data">[docs]</a><span class="k">class</span> <span class="nc">Data</span><span class="p">():</span>
<span class="sa">r</span><span class="sd">"""Parent class for parsing and storing data from bandstructure calculations. Contains a :meth:`check_data` method for basic checks on bandstructure data.</span>
<span class="sd"> Attributes:</span>
<span class="sd"> spin_channels (int): 1 (non-spin-polarised), 2 (spin-polarised), 4 (spin-orbit coupling).</span>
<span class="sd"> number_of_kpoints (int): the number of k-points per band.</span>
<span class="sd"> number_of_bands (int): the number of bands.</span>
<span class="sd"> kpoints (array(float)): 2-dimensional array with shape (number_of_kpoints, 3). Each row contains the fractional coordinates of a kpoint [kx,ky,kz].</span>
<span class="sd"> energies (array(float)): 2-dimensional array with shape (number_of_bands,number_of_kpoints). Each row contains energies of eigenstates in eV for a particular band.</span>
<span class="sd"> occupancy (array(float)): 2-dimensional array with shape (number_of_bands,number_of_kpoints). Each row contains occupation number of the eigenstates for a particular band. Values range from 0-1 (spin-polarised) or 0-2 (non-spin-polarised).</span>
<span class="sd"> reciprocal_lattice (list(float)): the reciprocal lattice vectors in format [[x1,y1,z1],[x2,y2,z2],[x3,y3,z3]], units Angstrom :math:`^{-1}`.</span>
<span class="sd"> CBM (float): the conduction band minimum energy in eV.</span>
<span class="sd"> VBM (float): the valence band maximum in eV.</span>
<span class="sd"> fermi_energy (float): the fermi energy in eV."""</span>
<div class="viewcode-block" id="Data.__init__"><a class="viewcode-back" href="../../inputs.html#effmass.inputs.Data.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">"""</span>
<span class="sd"> Initialises an instance of the :class:`~effmass.inputs.Data` class. All attributes are None until set by the derived class.</span>
<span class="sd"> Args:</span>
<span class="sd"> None.</span>
<span class="sd"> Returns: </span>
<span class="sd"> None.</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">spin_channels</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">number_of_kpoints</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">energies</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">occupancy</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kpoints</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fermi_energy</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">reciprocal_lattice</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">CBM</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">VBM</span> <span class="o">=</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="Data.check_data"><a class="viewcode-back" href="../../inputs.html#effmass.inputs.Data.check_data">[docs]</a> <span class="k">def</span> <span class="nf">check_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">spin_channels</span><span class="p">,</span> <span class="n">number_of_kpoints</span><span class="p">,</span> <span class="n">number_of_bands</span><span class="p">,</span> <span class="n">CBM</span><span class="p">,</span>
<span class="n">VBM</span><span class="p">,</span> <span class="n">fermi_energy</span><span class="p">,</span> <span class="n">occupancy</span><span class="p">):</span>
<span class="sd">"""Check that Data class attributes make basic sense.</span>
<span class="sd"> Args:</span>
<span class="sd"> None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> None.</span>
<span class="sd"> Notes:</span>
<span class="sd"> There is a similar method that runs automatically when reading data in using the `vasppy.procar <http://vasppy.readthedocs.io/en/latest/vasppy.html#module-vasppy.procar>`_ module.</span>
<span class="sd"> """</span>
<span class="k">assert</span> <span class="p">(</span>
<span class="p">((</span><span class="n">spin_channels</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="n">spin_channels</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="o">|</span>
<span class="p">(</span><span class="n">spin_channels</span> <span class="o">==</span> <span class="mi">4</span><span class="p">))</span> <span class="ow">is</span> <span class="kc">True</span>
<span class="p">),</span> <span class="s2">"Spin channels must have value 1 (non spin-polarised) or 2 (spin-polarised)"</span>
<span class="k">assert</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">number_of_kpoints</span><span class="p">)</span> <span class="o">==</span> <span class="nb">int</span>
<span class="ow">and</span> <span class="n">number_of_kpoints</span> <span class="o">></span> <span class="mi">0</span>
<span class="p">),</span> <span class="s2">"The number of kpoints is not a positive integer"</span>
<span class="k">assert</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">number_of_bands</span><span class="p">)</span> <span class="o">==</span> <span class="nb">int</span> <span class="ow">and</span> <span class="n">number_of_bands</span> <span class="o">></span> <span class="mi">0</span>
<span class="p">),</span> <span class="s2">"The number of bands is not a positive integer"</span>
<span class="k">assert</span> <span class="p">(</span><span class="n">CBM</span> <span class="o">></span>
<span class="n">VBM</span><span class="p">),</span> <span class="s2">"The CBM energy is lower than than the VBM energy"</span>
<span class="k">if</span> <span class="n">fermi_energy</span> <span class="o"><</span> <span class="n">VBM</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">"The fermi energy is lower than the VBM"</span><span class="p">)</span>
<span class="k">if</span> <span class="n">fermi_energy</span> <span class="o">></span> <span class="n">CBM</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">"The fermi energy is higher than the CBM"</span><span class="p">)</span>
<span class="k">if</span> <span class="n">occupancy</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="p">((</span><span class="n">occupancy</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="n">occupancy</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="o">|</span>
<span class="p">(</span><span class="n">occupancy</span> <span class="o">==</span> <span class="mi">2</span><span class="p">))</span><span class="o">.</span><span class="n">all</span><span class="p">()</span> <span class="ow">is</span> <span class="kc">False</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">"You have partial occupancy of bands"</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">find_cbm_vbm</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">CBM</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">VBM</span> <span class="o">=</span> <span class="n">extrema</span><span class="o">.</span><span class="n">calc_CBM_VBM_from_Fermi</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">CBMVBM_search_depth</span><span class="o">=</span><span class="mf">4.0</span><span class="p">)</span></div>
<div class="viewcode-block" id="DataASE"><a class="viewcode-back" href="../../inputs.html#effmass.inputs.DataASE">[docs]</a><span class="k">class</span> <span class="nc">DataASE</span><span class="p">(</span><span class="n">Data</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">"""</span>
<span class="sd"> Class for interfacing with the ASE bandstructure object. Inherits attributes and methods from the :class:`~effmass.inputs.Data` class, and extends</span>
<span class="sd"> with a method for inferring the CBM/VBM from Fermi level.</span>
<span class="sd"> Note: DataASE.fermi_energy is taken from the seedname.out file. </span>
<span class="sd"> Note: The DataASE class does not parse eigenstate occupancy data. The Fermi energy will \</span>
<span class="sd"> be used to infer which bands are occupied (below the fermi energy) and which are unoccupied (above \</span>
<span class="sd"> the fermi energy). You should independently confirm that the fermi energy is in the band gap of \</span>
<span class="sd"> your material. Note that you can manually set the `fermi_energy` attribute and find the CBM and VBM using the method `find_cbm_vbm`. ")</span>
<span class="sd"> """</span>
<div class="viewcode-block" id="DataASE.__init__"><a class="viewcode-back" href="../../inputs.html#effmass.inputs.DataASE.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bs</span><span class="p">,</span> <span class="n">atoms</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">"""</span>
<span class="sd"> Initialises an instance of the :class:`~effmass.inputs.DataASE` class and infers which bands are occupied and unoccupied from the fermi level.</span>
<span class="sd"> Args:</span>
<span class="sd"> bs (ase.spectrum.band_structure.BandStructure): An instance of the ase.spectrum.band_structure.BandStructure object.</span>
<span class="sd"> Returns: </span>
<span class="sd"> None.</span>
<span class="sd"> """</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">"The DataASE class does not parse eigenstate occupancy data. The Fermi energy will </span><span class="se">\</span>
<span class="s2"> be used to infer which bands are occupied (below the fermi energy) and which are unoccupied (above </span><span class="se">\</span>
<span class="s2"> the fermi energy). You should independently confirm that the fermi energy is in the band gap of </span><span class="se">\</span>
<span class="s2"> your material. Note that you can manually set the DataASE.fermi_energy attribute and then re-find the CBM and VBM using the method `DataASE.find_cbm_vbm`. "</span><span class="p">)</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">spin_channels</span> <span class="o">=</span> <span class="n">bs</span><span class="o">.</span><span class="n">energies</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">number_of_kpoints</span> <span class="o">=</span> <span class="n">bs</span><span class="o">.</span><span class="n">energies</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span> <span class="o">=</span> <span class="n">bs</span><span class="o">.</span><span class="n">energies</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">bs</span><span class="o">.</span><span class="n">energies</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">energies</span> <span class="o">=</span> <span class="n">bs</span><span class="o">.</span><span class="n">energies</span><span class="o">.</span><span class="n">transpose</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">number_of_kpoints</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">transpose</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kpoints</span> <span class="o">=</span> <span class="n">bs</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">kpts</span>
<span class="bp">self</span><span class="o">.</span><span class="n">reciprocal_lattice</span> <span class="o">=</span> <span class="n">atoms</span><span class="o">.</span><span class="n">cell</span><span class="o">.</span><span class="n">reciprocal</span><span class="p">()</span><span class="o">*</span><span class="mi">2</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fermi_energy</span> <span class="o">=</span> <span class="n">bs</span><span class="o">.</span><span class="n">reference</span>
<span class="bp">self</span><span class="o">.</span><span class="n">find_cbm_vbm</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">check_data</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">spin_channels</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">number_of_kpoints</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">CBM</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">VBM</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">fermi_energy</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">occupancy</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="DataCastep"><a class="viewcode-back" href="../../inputs.html#effmass.inputs.DataCastep">[docs]</a><span class="k">class</span> <span class="nc">DataCastep</span><span class="p">(</span><span class="n">DataASE</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">"""Class for parsing and storing data from a Castep bandstructure calculation. Inherits attributes and methods from the :class:`~effmass.inputs.DataASE` class."""</span>
<div class="viewcode-block" id="DataCastep.__init__"><a class="viewcode-back" href="../../inputs.html#effmass.inputs.DataCastep.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">directory_path</span><span class="p">,</span><span class="n">seedname</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">"""</span>
<span class="sd"> Initialises an instance of the :class:`~effmass.inputs.DataCastep` class.</span>
<span class="sd"> Args:</span>
<span class="sd"> directory_path (str): The path to a directory containing seedname.cell, seedname.out and seedname.bands</span>
<span class="sd"> seedname (str): The name (without suffix) of the input and output files</span>
<span class="sd"> </span>
<span class="sd"> Returns: </span>
<span class="sd"> None.</span>
<span class="sd"> """</span>
<span class="n">Castep_calculator</span> <span class="o">=</span> <span class="n">Castep</span><span class="p">(</span><span class="n">directory_path</span><span class="p">)</span>
<span class="n">Castep_calculator</span><span class="o">.</span><span class="n">atoms</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">directory_path</span><span class="o">+</span><span class="s2">"./"</span><span class="o">+</span><span class="n">seedname</span><span class="o">+</span><span class="s2">".cell"</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="s1">'castep-cell'</span><span class="p">)</span>
<span class="n">ASE_bandstructure</span> <span class="o">=</span> <span class="n">Castep_calculator</span><span class="o">.</span><span class="n">band_structure</span><span class="p">(</span><span class="n">directory_path</span><span class="o">+</span><span class="s2">"./"</span><span class="o">+</span><span class="n">seedname</span><span class="o">+</span><span class="s2">".bands"</span><span class="p">)</span>
<span class="n">ASE_atoms</span> <span class="o">=</span> <span class="n">Castep_calculator</span><span class="o">.</span><span class="n">atoms</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">ASE_bandstructure</span><span class="p">,</span> <span class="n">ASE_atoms</span><span class="p">)</span></div></div>
<span class="c1"># class DataQE(DataASE):</span>
<span class="c1"># r"""Class for parsing and storing data from a Quantum Espresso bandstructure calculation. Inherits attributes and methods from the :class:`~effmass.inputs.DataASE` class."""</span>
<span class="c1"># def __init__(self,directory_path,seedname):</span>
<span class="c1"># r"""</span>
<span class="c1"># Initialises an instance of the :class:`~effmass.inputs.DataQE` class.</span>
<span class="c1"># Args:</span>
<span class="c1"># Returns: </span>
<span class="c1"># None.</span>
<span class="c1"># """</span>
<span class="c1"># QE_calculator = ase.calculators.espresso.Espresso()</span>
<span class="c1"># QE_calculator.atoms = ase.io.espresso.read_espresso_out()</span>
<span class="c1"># ASE_bandstructure = QE_calculator.band_structure()</span>
<span class="c1"># super().__init__(self, ASE_bandstructure)</span>
<div class="viewcode-block" id="DataVasp"><a class="viewcode-back" href="../../inputs.html#effmass.inputs.DataVasp">[docs]</a><span class="k">class</span> <span class="nc">DataVasp</span><span class="p">(</span><span class="n">Data</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">"""</span>
<span class="sd"> Class for parsing and storing data from a vasp calculation. Extends the :class:`~effmass.inputs.Data` class to include support for analysing DOSCAR data"</span>
<span class="sd"> </span>
<span class="sd"> Additional attributes:</span>
<span class="sd"> dos (array): 2-dimensional array. Each row contains density of states data (units "number of states / unit cell") at a given energy: [energy(float),dos(float)].</span>
<span class="sd"> integrated_dos: 2-dimensional array. Each row contains integrated density of states data at a given energy: [energy(float),integrated_dos(float)].</span>
<span class="sd"> </span>
<span class="sd"> Note: DataVasp.fermi_energy is automatically set to the mean of DataVasp.CBM and DataVasp.VBM.</span>
<span class="sd"> """</span>
<div class="viewcode-block" id="DataVasp.__init__"><a class="viewcode-back" href="../../inputs.html#effmass.inputs.DataVasp.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">outcar_path</span><span class="p">,</span> <span class="n">procar_path</span><span class="p">,</span> <span class="n">ignore</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">"""</span>
<span class="sd"> Initialises an instance of the :class:`~effmass.inputs.Data` class and checks data using :meth:`check_data`.</span>
<span class="sd"> Args:</span>
<span class="sd"> outcar_path (str): The path to the OUTCAR file</span>
<span class="sd"> procar_path (:obj:`str` or :obj:`list`): The path(s) to one or more PROCAR files.</span>
<span class="sd"> </span>
<span class="sd"> ignore (int): The number of kpoints to ignore at the beginning of the bandstructure slice through kspace (useful for hybrid calculations where zero weightings are appended to a previous self-consistent calculation).</span>
<span class="sd"> **kwargs: Additional keyword arguments for reading the PROCAR file(s). </span>
<span class="sd"> </span>
<span class="sd"> Returns: </span>
<span class="sd"> None.</span>
<span class="sd"> """</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="k">assert</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">outcar_path</span><span class="p">)</span> <span class="o">==</span> <span class="nb">str</span><span class="p">),</span> <span class="s2">"The OUTCAR path must be a string"</span>
<span class="k">assert</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">ignore</span><span class="p">)</span> <span class="o">==</span> <span class="nb">int</span> <span class="ow">and</span> <span class="n">ignore</span> <span class="o">>=</span> <span class="mi">0</span>
<span class="p">),</span> <span class="s2">"The number of kpoints to ignore must be a positive integer"</span>
<span class="n">reciprocal_lattice</span> <span class="o">=</span> <span class="n">outcar</span><span class="o">.</span><span class="n">reciprocal_lattice_from_outcar</span><span class="p">(</span><span class="n">outcar_path</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">procar_path</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
<span class="n">vasp_data</span> <span class="o">=</span> <span class="n">procar</span><span class="o">.</span><span class="n">Procar</span><span class="o">.</span><span class="n">from_files</span><span class="p">(</span><span class="n">procar_path</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">procar_path</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">vasp_data</span> <span class="o">=</span> <span class="n">procar</span><span class="o">.</span><span class="n">Procar</span><span class="o">.</span><span class="n">from_file</span><span class="p">(</span><span class="n">procar_path</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'procar_path must be a string or list of strings'</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">spin_channels</span> <span class="o">=</span> <span class="n">vasp_data</span><span class="o">.</span><span class="n">spin_channels</span>
<span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span> <span class="o">=</span> <span class="n">vasp_data</span><span class="o">.</span><span class="n">number_of_bands</span>
<span class="n">number_of_kpoints</span> <span class="o">=</span> <span class="n">vasp_data</span><span class="o">.</span><span class="n">number_of_k_points</span>
<span class="n">vasp_data_energies</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span> <span class="p">[</span> <span class="n">band</span><span class="o">.</span><span class="n">energy</span> <span class="k">for</span> <span class="n">band</span> <span class="ow">in</span> <span class="n">np</span><span class="o">.</span><span class="n">ravel</span><span class="p">(</span> <span class="n">vasp_data</span><span class="o">.</span><span class="n">bands</span> <span class="p">)</span> <span class="p">]</span> <span class="p">)</span>
<span class="n">vasp_data_occupancies</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span> <span class="p">[</span> <span class="n">band</span><span class="o">.</span><span class="n">occupancy</span> <span class="k">for</span> <span class="n">band</span> <span class="ow">in</span> <span class="n">np</span><span class="o">.</span><span class="n">ravel</span><span class="p">(</span> <span class="n">vasp_data</span><span class="o">.</span><span class="n">bands</span> <span class="p">)</span> <span class="p">]</span> <span class="p">)</span>
<span class="k">if</span> <span class="n">vasp_data</span><span class="o">.</span><span class="n">calculation</span><span class="p">[</span><span class="s1">'spin_polarised'</span><span class="p">]:</span> <span class="c1"># to account for the change in PROCAR format for calculations with 2 spin channels (1 k-point block ---> 2 k-point blocks)</span>
<span class="n">energies</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span><span class="n">number_of_kpoints</span><span class="p">])</span> <span class="c1"># This is a very ugly way to slice 'n' dice. Should avoid creating new array and use array methods instead. But it does the job so will keep for now.</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span><span class="p">):</span>
<span class="n">energies</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">vasp_data_energies</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span>
<span class="n">number_of_kpoints</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="c1"># factor of 2 for each kpoint block</span>
<span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span><span class="p">)</span><span class="o">.</span><span class="n">T</span><span class="p">[</span><span class="n">i</span><span class="p">][:</span><span class="n">number_of_kpoints</span><span class="p">]</span>
<span class="n">energies</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span><span class="o">+</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">vasp_data_energies</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span>
<span class="n">number_of_kpoints</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span><span class="p">)</span><span class="o">.</span><span class="n">T</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">number_of_kpoints</span><span class="p">:]</span>
<span class="n">occupancy</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span><span class="n">number_of_kpoints</span><span class="p">])</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span><span class="p">):</span>
<span class="n">occupancy</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">vasp_data_occupancies</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span>
<span class="n">number_of_kpoints</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span><span class="p">)</span><span class="o">.</span><span class="n">T</span><span class="p">[</span><span class="n">i</span><span class="p">][:</span><span class="n">number_of_kpoints</span><span class="p">]</span>
<span class="n">occupancy</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span><span class="o">+</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">vasp_data_occupancies</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span>
<span class="n">number_of_kpoints</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span><span class="p">)</span><span class="o">.</span><span class="n">T</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">number_of_kpoints</span><span class="p">:]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">energies</span> <span class="o">=</span> <span class="n">vasp_data_energies</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span>
<span class="n">number_of_kpoints</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span><span class="p">)</span><span class="o">.</span><span class="n">T</span>
<span class="n">occupancy</span> <span class="o">=</span> <span class="n">vasp_data_occupancies</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span>
<span class="n">number_of_kpoints</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span><span class="p">)</span><span class="o">.</span><span class="n">T</span>
<span class="c1"># remove values which are from the self-consistent calculation prior to the bandstructure calculation (workflow for hybrid functionals)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">energies</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">energies</span><span class="p">,</span><span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">ignore</span><span class="p">)),</span><span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">occupancy</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">occupancy</span><span class="p">,</span><span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">ignore</span><span class="p">)),</span><span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">number_of_kpoints</span> <span class="o">=</span> <span class="n">number_of_kpoints</span> <span class="o">-</span> <span class="n">ignore</span>
<span class="c1"># handle negative occupancy values</span>
<span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">occupancy</span> <span class="o"><</span> <span class="mi">0</span><span class="p">):</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">"One or more occupancies in your PROCAR file are negative. All negative occupancies will be set to zero."</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">occupancy</span><span class="p">[</span> <span class="bp">self</span><span class="o">.</span><span class="n">occupancy</span> <span class="o"><</span> <span class="mi">0</span> <span class="p">]</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kpoints</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span> <span class="p">[</span> <span class="n">kp</span><span class="o">.</span><span class="n">frac_coords</span>
<span class="k">for</span> <span class="n">kp</span> <span class="ow">in</span> <span class="n">vasp_data</span><span class="o">.</span><span class="n">k_points</span><span class="p">[</span><span class="n">ignore</span><span class="p">:</span><span class="n">vasp_data</span><span class="o">.</span><span class="n">number_of_k_points</span><span class="p">]</span> <span class="p">]</span> <span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">reciprocal_lattice</span> <span class="o">=</span> <span class="n">reciprocal_lattice</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span>
<span class="bp">self</span><span class="o">.</span><span class="n">CBM</span> <span class="o">=</span> <span class="n">extrema</span><span class="o">.</span><span class="n">_calc_CBM</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">occupancy</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">energies</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">VBM</span> <span class="o">=</span> <span class="n">extrema</span><span class="o">.</span><span class="n">_calc_VBM</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">occupancy</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">energies</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fermi_energy</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">CBM</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">VBM</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dos</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">integrated_dos</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">check_data</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">spin_channels</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">number_of_kpoints</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">CBM</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">VBM</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">fermi_energy</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">occupancy</span><span class="p">)</span></div>
<div class="viewcode-block" id="DataVasp.parse_DOSCAR"><a class="viewcode-back" href="../../inputs.html#effmass.inputs.DataVasp.parse_DOSCAR">[docs]</a> <span class="k">def</span> <span class="nf">parse_DOSCAR</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="o">=</span><span class="s1">'./DOSCAR'</span><span class="p">):</span>
<span class="sd">"""Parses the DOS and integrated DOS from a vasp DOSCAR file.</span>
<span class="sd"> Args:</span>
<span class="sd"> filename (str, optional): The location and filename of the DOSCAR to read in. Defaults to `'./DOSCAR'`.</span>
<span class="sd"> Returns:</span>
<span class="sd"> None.</span>
<span class="sd"> Notes:</span>
<span class="sd"> If the DOS has been sampled at more than 10000 points then this function will break at the expression for `num_data_points`.</span>
<span class="sd"> In this case, edit your DOSCAR file so that in the header there is a space preceding the number of points.</span>
<span class="sd"> """</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">lines</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span>
<span class="n">num_data_points</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">2</span><span class="p">])</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">())</span> <span class="o">==</span> <span class="mi">5</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dos</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span>
<span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">]),</span>
<span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">1</span><span class="p">])</span> <span class="o">+</span> <span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">2</span><span class="p">])</span>
<span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">[</span><span class="mi">6</span><span class="p">:</span><span class="n">num_data_points</span> <span class="o">+</span> <span class="mi">6</span><span class="p">]])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">integrated_dos</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span>
<span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">]),</span>
<span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">3</span><span class="p">])</span> <span class="o">+</span> <span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">4</span><span class="p">])</span>
<span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">[</span><span class="mi">6</span><span class="p">:</span><span class="n">num_data_points</span> <span class="o">+</span> <span class="mi">6</span><span class="p">]])</span>
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">())</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dos</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">]),</span>
<span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">1</span><span class="p">])]</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">[</span><span class="mi">6</span><span class="p">:</span><span class="n">num_data_points</span> <span class="o">+</span> <span class="mi">6</span><span class="p">]])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">integrated_dos</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span>
<span class="p">[[</span><span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">]),</span>
<span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">2</span><span class="p">])]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">[</span><span class="mi">6</span><span class="p">:</span><span class="n">num_data_points</span> <span class="o">+</span> <span class="mi">6</span><span class="p">]])</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"problem parsing DOSCAR"</span><span class="p">)</span>
<span class="k">return</span></div></div>
<div class="viewcode-block" id="DataAims"><a class="viewcode-back" href="../../inputs.html#effmass.inputs.DataAims">[docs]</a><span class="k">class</span> <span class="nc">DataAims</span><span class="p">(</span><span class="n">Data</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">"""</span>
<span class="sd"> Class for parsing and storing data from a FHI-AIMS calculation.</span>
<span class="sd"> Attributes:</span>
<span class="sd"> spin_channels (int): 1 (non-spin-polarised), 2 (spin-polarised), 4 (spin-orbit coupling).</span>
<span class="sd"> number_of_kpoints (int): the number of k-points per band.</span>
<span class="sd"> number_of_bands (int): the number of bands.</span>
<span class="sd"> kpoints (array(float)): 2-dimensional array with shape (number_of_kpoints, 3). Each row contains the fractional coordinates of a kpoint [kx,ky,kz].</span>
<span class="sd"> energies (array(float)): 2-dimensional array with shape (number_of_bands,number_of_kpoints). Each row contains energies of eigenstates in eV for a particular band.</span>
<span class="sd"> occupancy (array(float)): 2-dimensional array with shape (number_of_bands,number_of_kpoints). Each row contains occupation number of the eigenstates for a particular band. Values range from 0-1 (spin-polarised) or 0-2 (non-spin-polarised).</span>
<span class="sd"> reciprocal_lattice (list(float)): the reciprocal lattice vectors in format [[x1,y1,z1],[x2,y2,z2],[x3,y3,z3]], units Angstrom :math:`^{-1}`.</span>
<span class="sd"> CBM (float): the conduction band minimum energy in eV.</span>
<span class="sd"> VBM (float): the valence band maximum in eV.</span>
<span class="sd"> fermi_energy (float): the fermi energy in eV. Automatically set to the mean of Data.CBM and Data.VBM.</span>
<span class="sd"> """</span>
<div class="viewcode-block" id="DataAims.__init__"><a class="viewcode-back" href="../../inputs.html#effmass.inputs.DataAims.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">directory_path</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">"""</span>
<span class="sd"> Initialises an instance of the :class:`~effmass.inputs.DataAims` class and checks data using :meth:`check_data`.</span>
<span class="sd"> Args:</span>
<span class="sd"> directory_path (str): The path to the directory containing output, geometry.in, control.in and bandstructure files</span>
<span class="sd"> Returns:</span>
<span class="sd"> None.</span>
<span class="sd"> """</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="k">assert</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">directory_path</span><span class="p">)</span> <span class="o">==</span> <span class="nb">str</span><span class="p">),</span> <span class="s2">"The file path must be a string"</span>
<span class="s2">"Finding reciprocal lattice vectors"</span>
<span class="n">latvec</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"</span><span class="si">{}</span><span class="s2">/geometry.in"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">directory_path</span><span class="p">)):</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"</span><span class="se">\t</span><span class="s2">"</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">words</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">words</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">words</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"lattice_vector"</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">words</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">4</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"geometry.in: Syntax error in line '"</span><span class="o">+</span><span class="n">line</span><span class="o">+</span><span class="s2">"'"</span><span class="p">)</span>
<span class="n">latvec</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="mi">4</span><span class="p">]))</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">latvec</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"geometry.in: Must contain exactly 3 lattice vectors"</span><span class="p">)</span>
<span class="n">latvec</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">latvec</span><span class="p">)</span>
<span class="n">latvec</span> <span class="o">=</span> <span class="n">latvec</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float</span><span class="p">)</span>
<span class="c1">#Calculate reciprocal lattice vectors</span>
<span class="n">rlatvec</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">volume</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">latvec</span><span class="p">[</span><span class="mi">0</span><span class="p">,:],</span><span class="n">np</span><span class="o">.</span><span class="n">cross</span><span class="p">(</span><span class="n">latvec</span><span class="p">[</span><span class="mi">1</span><span class="p">,:],</span><span class="n">latvec</span><span class="p">[</span><span class="mi">2</span><span class="p">,:])))</span>
<span class="n">rlatvec</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">cross</span><span class="p">(</span><span class="n">latvec</span><span class="p">[</span><span class="mi">1</span><span class="p">,:],</span><span class="n">latvec</span><span class="p">[</span><span class="mi">2</span><span class="p">,:])</span><span class="o">/</span><span class="n">volume</span><span class="p">))</span>
<span class="n">rlatvec</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">cross</span><span class="p">(</span><span class="n">latvec</span><span class="p">[</span><span class="mi">2</span><span class="p">,:],</span><span class="n">latvec</span><span class="p">[</span><span class="mi">0</span><span class="p">,:])</span><span class="o">/</span><span class="n">volume</span><span class="p">))</span>
<span class="n">rlatvec</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">cross</span><span class="p">(</span><span class="n">latvec</span><span class="p">[</span><span class="mi">0</span><span class="p">,:],</span><span class="n">latvec</span><span class="p">[</span><span class="mi">1</span><span class="p">,:])</span><span class="o">/</span><span class="n">volume</span><span class="p">))</span>
<span class="n">reciprocal_lattice</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">rlatvec</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">reciprocal_lattice</span> <span class="o">=</span> <span class="n">reciprocal_lattice</span>
<span class="s2">"Finding spin channels"</span>
<span class="n">spin_channels</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"</span><span class="si">{}</span><span class="s2">/calculation.out"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">directory_path</span><span class="p">)):</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"</span><span class="se">\t</span><span class="s2">"</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="s2">"include_spin_orbit"</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
<span class="n">spin_channels</span> <span class="o">=</span> <span class="mi">4</span>
<span class="k">break</span>
<span class="k">elif</span> <span class="s2">"Number of spin channels"</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
<span class="n">words</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="n">spin_channels</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="k">break</span>
<span class="bp">self</span><span class="o">.</span><span class="n">spin_channels</span> <span class="o">=</span> <span class="n">spin_channels</span>
<span class="s2">"Finding number of bands"</span>
<span class="n">number_of_bands</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"</span><span class="si">{}</span><span class="s2">/calculation.out"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">directory_path</span><span class="p">)):</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"</span><span class="se">\t</span><span class="s2">"</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="s2">"Number of states"</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
<span class="n">words</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="n">number_of_bands</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="k">break</span>
<span class="k">if</span> <span class="n">spin_channels</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="c1">#Doubling for spin-polarised calculation</span>
<span class="n">number_of_bands</span> <span class="o">=</span> <span class="mi">2</span><span class="o">*</span><span class="n">number_of_bands</span>
<span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span> <span class="o">=</span> <span class="n">number_of_bands</span>
<span class="s2">"Finding number of kpoints and determining number of BZ paths"</span>
<span class="n">number_of_kpoints</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">number_of_BZ_paths</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">path_list</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"</span><span class="si">{}</span><span class="s2">/calculation.out"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">directory_path</span><span class="p">)):</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"</span><span class="se">\t</span><span class="s2">"</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"#"</span><span class="p">)</span> <span class="ow">and</span> <span class="s2">"output"</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
<span class="k">if</span> <span class="s2">"band"</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
<span class="n">words</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="k">if</span> <span class="n">words</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">==</span><span class="s2">"output"</span> <span class="ow">and</span> <span class="n">words</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">==</span><span class="s2">"band"</span><span class="p">:</span>
<span class="n">path_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="mi">8</span><span class="p">]))</span>
<span class="n">number_of_BZ_paths</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">number_of_kpoints</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">path_list</span><span class="p">)</span>
<span class="s2">"Reading out bandstructure files to determine kpoint, energy and occupation matrices"</span>
<span class="n">kpoints</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">([</span><span class="n">number_of_kpoints</span><span class="p">,</span><span class="mi">3</span><span class="p">])</span>
<span class="n">energies</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">([</span><span class="n">number_of_bands</span><span class="p">,</span><span class="n">number_of_kpoints</span><span class="p">])</span>
<span class="n">occupancy</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">([</span><span class="n">number_of_bands</span><span class="p">,</span><span class="n">number_of_kpoints</span><span class="p">])</span>
<span class="n">path_counter</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="n">spin_channels</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">or</span> <span class="n">spin_channels</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span>
<span class="n">kpoint_counter</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">while</span> <span class="n">path_counter</span><span class="o"><</span><span class="n">number_of_BZ_paths</span><span class="p">:</span>
<span class="n">kpoint_counter</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">path_list</span><span class="p">[:</span><span class="n">path_counter</span><span class="p">])</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"</span><span class="si">{}</span><span class="s2">/band1</span><span class="si">{:03d}</span><span class="s2">.out"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">directory_path</span><span class="p">,</span> <span class="n">path_counter</span><span class="o">+</span><span class="mi">1</span><span class="p">)):</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"</span><span class="se">\t</span><span class="s2">"</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">words</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="n">kpoints</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">kpoint_counter</span><span class="p">),</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="n">kpoints</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">kpoint_counter</span><span class="p">),</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
<span class="n">kpoints</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">kpoint_counter</span><span class="p">),</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">number_of_bands</span><span class="p">):</span>
<span class="n">energies</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="nb">int</span><span class="p">(</span><span class="n">kpoint_counter</span><span class="p">)]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="mi">5</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">i</span><span class="p">])</span>
<span class="n">occupancy</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="nb">int</span><span class="p">(</span><span class="n">kpoint_counter</span><span class="p">)]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="mi">4</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">i</span><span class="p">])</span>
<span class="n">kpoint_counter</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">path_counter</span> <span class="o">+=</span><span class="mi">1</span>
<span class="k">if</span> <span class="n">spin_channels</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
<span class="k">while</span> <span class="n">path_counter</span><span class="o"><</span><span class="n">number_of_BZ_paths</span><span class="p">:</span>
<span class="n">kpoint_counter</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">path_list</span><span class="p">[:</span><span class="n">path_counter</span><span class="p">])</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"</span><span class="si">{}</span><span class="s2">/band1</span><span class="si">{:03d}</span><span class="s2">.out"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">directory_path</span><span class="p">,</span> <span class="n">path_counter</span><span class="o">+</span><span class="mi">1</span><span class="p">)):</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"</span><span class="se">\t</span><span class="s2">"</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">words</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="n">kpoints</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">kpoint_counter</span><span class="p">),</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="n">kpoints</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">kpoint_counter</span><span class="p">),</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
<span class="n">kpoints</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">kpoint_counter</span><span class="p">),</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">number_of_bands</span><span class="o">//</span><span class="mi">2</span><span class="p">):</span>
<span class="n">energies</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="nb">int</span><span class="p">(</span><span class="n">kpoint_counter</span><span class="p">)]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="mi">5</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">i</span><span class="p">])</span>
<span class="n">occupancy</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="nb">int</span><span class="p">(</span><span class="n">kpoint_counter</span><span class="p">)]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="mi">4</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">i</span><span class="p">])</span>
<span class="n">kpoint_counter</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">kpoint_counter</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">path_list</span><span class="p">[:</span><span class="n">path_counter</span><span class="p">])</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"</span><span class="si">{}</span><span class="s2">/band2</span><span class="si">{:03d}</span><span class="s2">.out"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">directory_path</span><span class="p">,</span> <span class="n">path_counter</span><span class="o">+</span><span class="mi">1</span><span class="p">)):</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"</span><span class="se">\t</span><span class="s2">"</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">words</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">number_of_bands</span><span class="o">//</span><span class="mi">2</span><span class="p">):</span>
<span class="n">energies</span><span class="p">[</span><span class="n">number_of_bands</span><span class="o">//</span><span class="mi">2</span><span class="o">+</span><span class="n">i</span><span class="p">,</span><span class="n">kpoint_counter</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="mi">5</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">i</span><span class="p">])</span>
<span class="n">occupancy</span><span class="p">[</span><span class="n">number_of_bands</span><span class="o">//</span><span class="mi">2</span><span class="o">+</span><span class="n">i</span><span class="p">,</span><span class="n">kpoint_counter</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">words</span><span class="p">[</span><span class="mi">4</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">i</span><span class="p">])</span>
<span class="n">kpoint_counter</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">path_counter</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="s2">"Delete double kpoints at path edges"</span>
<span class="n">index_count</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">kpoints</span><span class="p">)</span>
<span class="n">index</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">while</span> <span class="n">index</span> <span class="o"><</span> <span class="n">index_count</span><span class="o">-</span><span class="mi">1</span><span class="p">:</span>
<span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">array_equal</span><span class="p">(</span><span class="n">kpoints</span><span class="p">[</span><span class="n">index</span><span class="p">],</span><span class="n">kpoints</span><span class="p">[</span><span class="n">index</span><span class="o">+</span><span class="mi">1</span><span class="p">]):</span>
<span class="n">kpoints</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">kpoints</span><span class="p">,</span><span class="n">index</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="n">energies</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">energies</span><span class="p">,</span><span class="n">index</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">occupancy</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">occupancy</span><span class="p">,</span><span class="n">index</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">index_count</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">kpoints</span><span class="p">)</span>
<span class="n">index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">number_of_kpoints</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">kpoints</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">CBM</span> <span class="o">=</span> <span class="n">extrema</span><span class="o">.</span><span class="n">_calc_CBM</span><span class="p">(</span><span class="n">occupancy</span><span class="p">,</span> <span class="n">energies</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">VBM</span> <span class="o">=</span> <span class="n">extrema</span><span class="o">.</span><span class="n">_calc_VBM</span><span class="p">(</span><span class="n">occupancy</span><span class="p">,</span> <span class="n">energies</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fermi_energy</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">CBM</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">VBM</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span>
<span class="s2">"Cutting energy values in a range of 30 eV above and below the Fermi level. FHI AIMS is all electron, but not all states are needed for a meaningful effmass calculation"</span>
<span class="n">index_count</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">occupancy</span><span class="p">)</span>
<span class="n">index</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">while</span> <span class="n">index</span> <span class="o"><</span> <span class="n">index_count</span><span class="o">-</span><span class="mi">1</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">all</span><span class="p">(</span><span class="n">item</span> <span class="o"><</span> <span class="bp">self</span><span class="o">.</span><span class="n">fermi_energy</span> <span class="o">-</span> <span class="mi">30</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">energies</span><span class="p">[</span><span class="n">index</span><span class="p">]):</span>
<span class="n">energies</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">energies</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="n">axis</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">occupancy</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">occupancy</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="n">axis</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">index_count</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">occupancy</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">all</span><span class="p">(</span><span class="n">item</span> <span class="o">></span> <span class="bp">self</span><span class="o">.</span><span class="n">fermi_energy</span> <span class="o">+</span> <span class="mi">30</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">energies</span><span class="p">[</span><span class="n">index</span><span class="p">]):</span>
<span class="n">energies</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">energies</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="n">axis</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">occupancy</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">occupancy</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="n">axis</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">index_count</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">occupancy</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">energies</span> <span class="o">=</span> <span class="n">energies</span>
<span class="bp">self</span><span class="o">.</span><span class="n">occupancy</span> <span class="o">=</span> <span class="n">occupancy</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kpoints</span> <span class="o">=</span> <span class="n">kpoints</span>
<span class="bp">self</span><span class="o">.</span><span class="n">check_data</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">spin_channels</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">number_of_kpoints</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">number_of_bands</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">CBM</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">VBM</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">fermi_energy</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">occupancy</span><span class="p">)</span></div></div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
© Copyright 2018, Lucy Whalley.
</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>