Source code for aim2dat.elements.element_properties
"""Module to retrieve physical and chemical properties of elements."""
# Internal libraray imports
from aim2dat.elements.data import symbols, names, element_groups, val_electrons
import aim2dat.elements.atomic_radii as atomic_radii
import aim2dat.elements.electronegativity as electronegativity
from aim2dat.elements.atomic_masses import atomic_masses
def _check_element(element):
"""Check if the input element can be processed."""
if isinstance(element, str):
element = element.capitalize()
if element in names:
el_number = names.index(element) + 1
el_symbol = symbols[el_number - 1]
el_name = element
elif element in symbols:
el_number = symbols.index(element) + 1
el_symbol = element
el_name = names[el_number - 1]
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 = symbols[el_number - 1]
el_name = names[el_number - 1]
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. The following sources are
used for different radius types:
* ``'covalent'`` are from :doi:`10.1039/B801115J`.
* ``'vdw'`` are from :doi:`10.1039/C3DT50599E`.
* ``'chen_manz'`` are from :doi:`10.1039/C9RA07327B`.
* ``'vdw_charry_tkatchenko'`` are from :doi:`10.26434/chemrxiv-2024-m3rtp-v2`.
Parameters
----------
element : str or int
Atomic number, name or symbol of the element.
radius_type : str (optional)
Radius type. Valid options are ``'covalent'``, ``'vdw'``, ``'chen_manz'``,
or ``'vdw_charry_tkatchenko'``.
Returns
-------
radius : float
Atomic radius of the element.
Raises
------
ValueError
If ``radius_type`` is not supported or has the wrong format.
"""
if radius_type in dir(atomic_radii):
return getattr(atomic_radii, radius_type)[_check_element(element)[1]]
else:
raise ValueError(f"Radius type '{radius_type}' not supported.")
[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
-------
float or None
Electronegativity of the element.
"""
if scale in dir(electronegativity):
return getattr(electronegativity, scale)[_check_element(element)[1]]
else:
raise ValueError(f"Scale '{scale}' not supported.")
[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.
"""
return _check_element(element)[0]
[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.
"""
return _check_element(element)[1]
[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
-------
int
Atomic mass of the element.
"""
return atomic_masses[_check_element(element)[1]]
[docs]
def get_val_electrons(element):
"""
Return number of valence electrons 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
-------
int
Number of valence electrons of the element.
"""
return val_electrons[_check_element(element)[1]]
[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.
"""
return set(element_groups[_check_element(element)[1]])
[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 element_groups.items():
if group_label in groups:
elements.append(el)
return set(elements)