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 lxml import html
import requests
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='latest', use_gw=False):
"""
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 = '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 = {}
for tag in tags:
item = tag.text.strip().split(' ')
element = item[0]
symbol = '_'.join([i for i in item if i])
rec[element] = symbol
return rec
# pylint: disable=too-few-public-methods
[docs]
class PawInfo(object): # pylint: disable=useless-object-inheritance
"""Simple class to bundle and pass around info about a PAW."""
def __init__(self, symbol, default_enmax, valency):
self.symbol = symbol
self.default_enmax = default_enmax
self.valency = valency
def __str__(self):
return self.symbol
def __repr__(self):
return f'<paw: {self.symbol} at {hex(id(self))}>'
[docs]
def get_all(version_nr='latest', use_gw=False):
"""
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 = get_recommendations()
DEF_GW = 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')