Source code for aiida_vasp.utils.default_symbols

"""
Utils for setting symbols on chemical elements.

Utilities for choosing appropriate element symbols for a chemical element.
"""

from __future__ import annotations

import requests
from lxml import html

VERSION = {
    'latest': {
        'version': '5.2',
        'url': 'http://cms.mpi.univie.ac.at/vasp/vasp/Recommended_PAW_potentials_DFT_calculations_using_vasp_5_2.html',
        'gw-url': 'http://cms.mpi.univie.ac.at/vasp/vasp/Recommended_GW_PAW_potentials_vasp_5_2.html',
    }
}


[docs] def get_recommendations(version_nr: str = 'latest', use_gw: bool = False) -> dict[str, str]: """ Get recommendations for a certain type of PAW. :param version_nr: VASP version number :param use_gw: get recommendations for GW instead LDA pseudopotentials :return: recommendations dict """ urlkey: str = 'gw-url' if use_gw else 'url' page = requests.get(VERSION[version_nr][urlkey], timeout=10) tree = html.fromstring(page.text) tags = tree.xpath('//table//td[1]/b') rec: dict[str, str] = {} for tag in tags: item: list[str] = tag.text.strip().split(' ') element: str = item[0] symbol: str = '_'.join([i for i in item if i]) rec[element] = symbol return rec
# pylint: disable=too-few-public-methods
[docs] class PawInfo: # pylint: disable=useless-object-inheritance """Simple class to bundle and pass around info about a PAW.""" def __init__(self, symbol: str, default_enmax: int, valency: float) -> None: self.symbol: str = symbol self.default_enmax: int = default_enmax self.valency: float = valency
[docs] def __str__(self) -> str: return self.symbol
[docs] def __repr__(self) -> str: return f'<paw: {self.symbol} at {hex(id(self))}>'
[docs] def get_all(version_nr: str = 'latest', use_gw: bool = False) -> dict[str, dict[str, PawInfo]]: """ Get recommendations for all symbols. :param version_nr: VASP version number :param use_gw: Get recommendations for GW (default: LDA) :return: recommendations dict """ urlkey = 'gw-url' if use_gw else 'url' page = requests.get(VERSION[version_nr][urlkey], timeout=10) tree = html.fromstring(page.text) tags = tree.xpath('//table/tr') syms = {} for tag in tags: row = tag.text_content().strip().split('\n') if row[1].isdigit(): symboll = [i for i in row[0].strip().split(' ') if i] element = symboll[0] symbol = '_'.join(symboll) suffix = symboll[1] if len(symboll) > 1 else '_' if suffix == 'GW': suffix = '_' if not syms.get(element): syms[element] = {} row[0] = symbol row[1] = int(row[1]) row[2] = float(row[2]) syms[element][suffix] = PawInfo(*row) return syms
if __name__ == '__main__': DEF_PAW: dict[str, str] = get_recommendations() DEF_GW: dict[str, str] = get_recommendations(use_gw=True) with open('default_paws.py', 'w', encoding='utf8') as defaults: defaults.write('lda = {\n') defaults.writelines([f'"{k}": "{v}",\n' for k, v in DEF_PAW.items()]) defaults.write('}\n\n') defaults.write('gw = {\n') defaults.writelines([f'"{k}": "{v.replace("_GW", "")}",\n' for k, v in DEF_GW.items()]) defaults.write('}\n\n')