Source code for aim2dat.utils.element_properties

"""Module to retrieve physical and chemical properties of elements."""

# Standard library imports
import os

# Third party library imports
from ase.data import (
    chemical_symbols,
    atomic_masses,
    atomic_numbers,
    atomic_names,
    covalent_radii,
    vdw_radii,
)

# Internal libraray imports
from aim2dat.io.yaml import load_yaml_file


_groups_data = dict(load_yaml_file(os.path.dirname(__file__) + "/data_files/element_groups.yaml"))


element_groups = []
for groups in _groups_data.values():
    element_groups += groups
element_groups = set(element_groups)


def _check_element(element):
    """Check if the input element can be processed."""
    if isinstance(element, str):
        element = element.capitalize()
        if element in atomic_names:
            el_number = atomic_names.index(element)
            el_symbol = chemical_symbols[el_number]
            el_name = element
        elif element in chemical_symbols:
            el_number = atomic_numbers[element]
            el_symbol = element
            el_name = atomic_names[el_number]
        else:
            raise ValueError(f"Element '{element}' could not be found.")
    else:
        try:
            el_number = int(element)
        except TypeError:
            raise TypeError(f"Element '{element}' needs to have the type str or int.")
        el_symbol = chemical_symbols[el_number]
        el_name = atomic_names[el_number]
    # else:
    #     raise TypeError(f"Element {element} needs to have the type str or int.")
    return el_number, el_symbol, el_name


[docs] def get_atomic_radius(element, radius_type="covalent"): """ Return the covalent or van der Waals radius of the element (imported from ase). Parameters ---------- element : str or int Atomic number, name or symbol of the element. radius_type : str (optional) Radius type. Valid options are 'covalent' or 'vdw'. Returns ------- radius : float Atomic radius of the element. """ el_number, _, _ = _check_element(element) if radius_type == "covalent": radius = covalent_radii[el_number] elif radius_type == "vdw": radius = vdw_radii[el_number] else: raise ValueError(f"Radius type '{radius_type}' not supported.") return radius
[docs] def get_electronegativity(element, scale="pauling"): """ Return the electronegativity of the element. Parameters ---------- element : str or int Atomic number, name or symbol of the element. scale : str (optional) Electronegativity scale. Supported values are ``'pauling'`` and ``'allen'``. Returns ------- electronegativity : float or None Electronegativity of the element. """ _, element, _ = _check_element(element) file_path = os.path.dirname(__file__) + "/data_files/electronegativity.yaml" en_dict = load_yaml_file(file_path) if scale in en_dict: electronegativity = en_dict[scale][element] else: raise ValueError(f"Scale '{scale}' not supported.") return electronegativity
[docs] def get_atomic_number(element): """ Return atomic number of the element from element symbol or name. Parameters ---------- element : str or int Atomic number, name or symbol of the element. Returns ------- int Atomic number of the element. """ element_number, _, _ = _check_element(element) return element_number
[docs] def get_element_symbol(element): """ Return symbol of the element from element number or name. Parameters ---------- element : str or int Atomic number, name or symbol of the element. Returns ------- str Symbol of the element. """ _, element_symbol, _ = _check_element(element) return element_symbol
[docs] def get_atomic_mass(element): """ Return atomic mass of the element from the atomic number, element symbol or name. Parameters ---------- element : str or int Atomic number, name or symbol of the element. Returns ------- element_number : int Atomic number of the element. """ element_number, _, _ = _check_element(element) return atomic_masses[element_number]
[docs] def get_element_groups(element): """ Return groups that contain the element from the atomic number, element symbol or name. Parameters ---------- element : str or int Atomic number, name or symbol of the element. Returns ------- groups : set Set of groups. """ _, element, _ = _check_element(element) return set(_groups_data[element])
[docs] def get_group(group_label): """ Return all elements in the group. Parameters ---------- group_label : str Group label. Returns ------- elements : set Set of element symbols.. """ elements = [] for el, groups in _groups_data.items(): if group_label in groups: elements.append(el) return set(elements)