From 00c9f7d50bf5fc571307b2e2b7fcb7e108656bb4 Mon Sep 17 00:00:00 2001 From: Janosh Riebesell Date: Thu, 10 Aug 2023 08:58:12 -0700 Subject: [PATCH 1/9] fix mypy --- .pre-commit-config.yaml | 2 +- pymatgen/io/lammps/data.py | 2 +- tests/io/qchem/test_outputs.py | 5 +---- tests/io/test_pwscf.py | 5 +---- tests/io/vasp/test_sets.py | 5 +---- 5 files changed, 5 insertions(+), 14 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index aaa864bea53..dbb4c40c0a3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,7 +8,7 @@ ci: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.0.282 + rev: v0.0.284 hooks: - id: ruff args: [--fix] diff --git a/pymatgen/io/lammps/data.py b/pymatgen/io/lammps/data.py index 5da719636af..357ef58fc52 100644 --- a/pymatgen/io/lammps/data.py +++ b/pymatgen/io/lammps/data.py @@ -428,7 +428,7 @@ def map_charges(q): for key, val in body_dict.items(): index = key != "PairIJ Coeffs" if hybrid and key in ["Bond Coeffs", "Angle Coeffs", "Dihedral Coeffs", "Improper Coeffs"]: - dfs = np.array_split(val, len(val.index)) + dfs: list[pd.DataFrame] = np.array_split(val, len(val.index)) df_string = "" for idx, df in enumerate(dfs): if isinstance(df.iloc[0]["coeff1"], str): diff --git a/tests/io/qchem/test_outputs.py b/tests/io/qchem/test_outputs.py index 221bc535cf5..cd3a037f167 100644 --- a/tests/io/qchem/test_outputs.py +++ b/tests/io/qchem/test_outputs.py @@ -264,10 +264,7 @@ def generate_multi_job_dict(): outputs = QCOutput.multiple_outputs_from_file( os.path.join(TEST_FILES_DIR, "molecules", file), keep_sub_files=False ) - data = [] - for sub_output in outputs: - data.append(sub_output.data) - multi_job_dict[file] = data + multi_job_dict[file] = [sub_output.data for sub_output in outputs] dumpfn(multi_job_dict, "multi_job.json") def _test_property(self, key, single_outs, multi_outs): diff --git a/tests/io/test_pwscf.py b/tests/io/test_pwscf.py index abebde611a7..70757993ae5 100644 --- a/tests/io/test_pwscf.py +++ b/tests/io/test_pwscf.py @@ -366,10 +366,7 @@ def test_read_str(self): pwin = PWInput.from_str(string) # generate list of coords - pw_sites = [] - for site in pwin.structure: - pw_sites.append(list(site.coords)) - pw_sites = np.array(pw_sites) + pw_sites = np.array([list(site.coords) for site in pwin.structure]) np.testing.assert_allclose(sites, pw_sites) diff --git a/tests/io/vasp/test_sets.py b/tests/io/vasp/test_sets.py index a1a33f78aa8..d08bc4789be 100644 --- a/tests/io/vasp/test_sets.py +++ b/tests/io/vasp/test_sets.py @@ -1031,10 +1031,7 @@ def setUp(self): c2 = [[0.5] * 3, [0.9, 0.1, 0.1]] s1 = Structure(Lattice.cubic(5), ["Si", "Si"], c1) s2 = Structure(Lattice.cubic(5), ["Si", "Si"], c2) - structs = [] - for s in s1.interpolate(s2, 3, pbc=True): - structs.append(Structure.from_sites(s.sites, to_unit_cell=True)) - self.structures = structs + self.structures = [Structure.from_sites(s.sites, to_unit_cell=True) for s in s1.interpolate(s2, 3, pbc=True)] self.vis = MITNEBSet(self.structures) warnings.simplefilter("ignore") From bd722278fdf2ed92752c4ab9a7bee619da0b4136 Mon Sep 17 00:00:00 2001 From: Shyue Ping Ong Date: Thu, 10 Aug 2023 13:00:25 -0700 Subject: [PATCH 2/9] Add test for FEFF. --- pyproject.toml | 1 + tests/io/feff/test_sets.py | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 4d8d7d90168..3fc21051e9a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -114,6 +114,7 @@ exclude_also = [ "show_plot", "if TYPE_CHECKING:", "if typing.TYPE_CHECKING:", + "except ImportError:" ] [tool.mypy] diff --git a/tests/io/feff/test_sets.py b/tests/io/feff/test_sets.py index 1fea2f563e6..96a66642ee7 100644 --- a/tests/io/feff/test_sets.py +++ b/tests/io/feff/test_sets.py @@ -7,7 +7,7 @@ import numpy as np import pytest -from pymatgen.core.structure import Molecule, Structure +from pymatgen.core.structure import Lattice, Molecule, Structure from pymatgen.io.cif import CifParser from pymatgen.io.feff.inputs import Atoms, Header, Potential, Tags from pymatgen.io.feff.sets import FEFFDictSet, MPELNESSet, MPEXAFSSet, MPXANESSet @@ -253,3 +253,22 @@ def test_post_distdiff(self): assert original_mole_shell == output_mole_shell shutil.rmtree(os.path.join(".", "feff_dist_regen")) + + def test_big_radius(self): + struct = Structure.from_spacegroup("Pm-3m", Lattice.cubic(3.033043), ["Ti", "O"], [[0, 0, 0], [0.5, 0.5, 0.5]]) + dict_set = FEFFDictSet( + absorbing_atom="Ti", + structure=struct, + radius=10.0, + config_dict={ + "S02": "0", + "COREHOLE": "regular", + "CONTROL": "1 1 1 1 1 1", + "XANES": "4 0.04 0.1", + "SCF": "7.0 0 100 0.2 3", + "FMS": "9.0 0", + "EXCHANGE": "0 0.0 0.0 2", + "RPATH": "-1", + }, + ) + assert str(dict_set) is not None From 8465e6725bd3167e8c198a694f2d44f64c4d99f8 Mon Sep 17 00:00:00 2001 From: Janosh Riebesell Date: Thu, 10 Aug 2023 14:12:24 -0700 Subject: [PATCH 3/9] `Structure/Molecule.to()` now always return same string written to file (#3236) * fix some ruff PERF401 * fix test_calculate_chgnet() for next chgnet release * always return string from Structure.to() regardless of filename kwarg * update TestIStructure.test_to_from_file_string * same for Molecule.to() * update TestIMolecule.test_to_from_file_string * improve class XYZ logic for setting self._mols --- pymatgen/core/structure.py | 65 ++++++++++---------- pymatgen/io/xyz.py | 5 +- pymatgen/util/convergence.py | 4 +- tests/analysis/test_reaction_calculator.py | 16 +++-- tests/core/test_structure.py | 71 ++++++++++++---------- tests/io/qchem/test_utils.py | 17 ++---- 6 files changed, 86 insertions(+), 92 deletions(-) diff --git a/pymatgen/core/structure.py b/pymatgen/core/structure.py index 74504675e94..83b32511b02 100644 --- a/pymatgen/core/structure.py +++ b/pymatgen/core/structure.py @@ -2637,7 +2637,7 @@ def from_dict(cls, d: dict[str, Any], fmt: Literal["abivars"] | None = None) -> charge = d.get("charge") return cls.from_sites(sites, charge=charge) - def to(self, filename: str = "", fmt: str = "", **kwargs) -> str | None: + def to(self, filename: str = "", fmt: str = "", **kwargs) -> str: """ Outputs the structure to a file or string. @@ -2655,7 +2655,8 @@ def to(self, filename: str = "", fmt: str = "", **kwargs) -> str | None: CifWriter.__init__ method for generation of symmetric cifs. Returns: - (str) if filename is None. None otherwise. + str: String representation of molecule in given format. If a filename + is provided, the same string is written to the file. """ fmt = fmt.lower() @@ -2684,11 +2685,11 @@ def to(self, filename: str = "", fmt: str = "", **kwargs) -> str | None: elif fmt == "xsf" or fnmatch(filename.lower(), "*.xsf*"): from pymatgen.io.xcrysden import XSF - string = XSF(self).to_str() + res_str = XSF(self).to_str() if filename: with zopen(filename, "wt", encoding="utf8") as file: - file.write(string) - return string + file.write(res_str) + return res_str elif ( fmt == "mcsqs" or fnmatch(filename, "*rndstr.in*") @@ -2697,24 +2698,24 @@ def to(self, filename: str = "", fmt: str = "", **kwargs) -> str | None: ): from pymatgen.io.atat import Mcsqs - string = Mcsqs(self).to_str() + res_str = Mcsqs(self).to_str() if filename: with zopen(filename, "wt", encoding="ascii") as file: - file.write(string) - return string + file.write(res_str) + return res_str elif fmt == "prismatic" or fnmatch(filename, "*prismatic*"): from pymatgen.io.prismatic import Prismatic return Prismatic(self).to_str() elif fmt == "yaml" or fnmatch(filename, "*.yaml*") or fnmatch(filename, "*.yml*"): yaml = YAML() + str_io = StringIO() + yaml.dump(self.as_dict(), str_io) + yaml_str = str_io.getvalue() if filename: with zopen(filename, "wt") as file: - yaml.dump(self.as_dict(), file) - return None - sio = StringIO() - yaml.dump(self.as_dict(), sio) - return sio.getvalue() + file.write(yaml_str) + return yaml_str # fleur support implemented in external namespace pkg https://github.com/JuDFTteam/pymatgen-io-fleur elif fmt == "fleur-inpgen" or fnmatch(filename, "*.in*"): from pymatgen.io.fleur import FleurInput @@ -2723,12 +2724,11 @@ def to(self, filename: str = "", fmt: str = "", **kwargs) -> str | None: elif fmt == "res" or fnmatch(filename, "*.res"): from pymatgen.io.res import ResIO - string = ResIO.structure_to_str(self) + res_str = ResIO.structure_to_str(self) if filename: with zopen(filename, "wt", encoding="utf8") as file: - file.write(string) - return None - return string + file.write(res_str) + return res_str else: if fmt == "": raise ValueError(f"Format not specified and could not infer from {filename=}") @@ -2736,7 +2736,6 @@ def to(self, filename: str = "", fmt: str = "", **kwargs) -> str | None: if filename: writer.write_file(filename) - return None return str(writer) @classmethod @@ -3440,7 +3439,8 @@ def to(self, filename: str = "", fmt: str = "") -> str | None: OpenBabel. Non-case sensitive. Returns: - (str) if filename is None. None otherwise. + str: String representation of molecule in given format. If a filename + is provided, the same string is written to the file. """ from pymatgen.io.babel import BabelMolAdaptor from pymatgen.io.gaussian import GaussianInput @@ -3453,25 +3453,24 @@ def to(self, filename: str = "", fmt: str = "") -> str | None: elif any(fmt == ext or fnmatch(filename.lower(), f"*.{ext}*") for ext in ["gjf", "g03", "g09", "com", "inp"]): writer = GaussianInput(self) elif fmt == "json" or fnmatch(filename, "*.json*") or fnmatch(filename, "*.mson*"): + json_str = json.dumps(self.as_dict()) if filename: - with zopen(filename, "wt", encoding="utf8") as f: - json.dump(self.as_dict(), f) - return None - else: - return json.dumps(self.as_dict()) + with zopen(filename, "wt", encoding="utf8") as file: + file.write(json_str) + return json_str elif fmt == "yaml" or fnmatch(filename, "*.yaml*"): yaml = YAML() + str_io = StringIO() + yaml.dump(self.as_dict(), str_io) + yaml_str = str_io.getvalue() if filename: - with zopen(filename, "wt", encoding="utf8") as f: - return yaml.dump(self.as_dict(), f) - else: - sio = StringIO() - yaml.dump(self.as_dict(), sio) - return sio.getvalue() + with zopen(filename, "wt", encoding="utf8") as file: + file.write(yaml_str) + return yaml_str else: - m = re.search(r"\.(pdb|mol|mdl|sdf|sd|ml2|sy2|mol2|cml|mrv)", filename.lower()) - if (not fmt) and m: - fmt = m.group(1) + match = re.search(r"\.(pdb|mol|mdl|sdf|sd|ml2|sy2|mol2|cml|mrv)", filename.lower()) + if not fmt and match: + fmt = match.group(1) writer = BabelMolAdaptor(self) return writer.write_file(filename, file_format=fmt) diff --git a/pymatgen/io/xyz.py b/pymatgen/io/xyz.py index 1b403238dd8..80e8aa17e88 100644 --- a/pymatgen/io/xyz.py +++ b/pymatgen/io/xyz.py @@ -11,6 +11,7 @@ from monty.io import zopen from pymatgen.core import Molecule, Structure +from pymatgen.core.structure import SiteCollection if TYPE_CHECKING: from git import Sequence @@ -21,7 +22,7 @@ class XYZ: Basic class for importing and exporting Molecules or Structures in XYZ format. - .. note:: + Note: Exporting periodic structures in the XYZ format will lose information about the periodicity. Essentially, only Cartesian coordinates are written in this format and no information is retained about the @@ -34,7 +35,7 @@ def __init__(self, mol: Molecule | Structure | Sequence[Molecule | Structure], c mol (Molecule | Structure): Input molecule or structure or list thereof. coord_precision: Precision to be used for coordinates. """ - self._mols = mol if isinstance(mol, list) else [mol] + self._mols = [mol] if isinstance(mol, SiteCollection) else mol self.precision = coord_precision @property diff --git a/pymatgen/util/convergence.py b/pymatgen/util/convergence.py index 4ebdfd019fc..8ee009afd92 100644 --- a/pymatgen/util/convergence.py +++ b/pymatgen/util/convergence.py @@ -141,9 +141,7 @@ def exponential(x, a, b, n): elif b > 10: b = 10 if isinstance(x, list): - y_l = [] - for x_v in x: - y_l.append(a + b * n**-x_v) + y_l = [a + b * n**-x_v for x_v in x] y = np.array(y_l) else: y = a + b * n**-x diff --git a/tests/analysis/test_reaction_calculator.py b/tests/analysis/test_reaction_calculator.py index fe2023cae05..b707b0497df 100644 --- a/tests/analysis/test_reaction_calculator.py +++ b/tests/analysis/test_reaction_calculator.py @@ -381,10 +381,10 @@ def setUp(self): entries = [] for e in d: entries.append(ComputedEntry.from_dict(e)) - rcts = list(filter(lambda e: e.composition.reduced_formula in ["Li", "O2"], entries)) + reactants = list(filter(lambda e: e.composition.reduced_formula in ["Li", "O2"], entries)) prods = list(filter(lambda e: e.composition.reduced_formula == "Li2O2", entries)) - self.rxn = ComputedReaction(rcts, prods) + self.rxn = ComputedReaction(reactants, prods) def test_calculated_reaction_energy(self): assert self.rxn.calculated_reaction_energy == approx(-5.60748821935) @@ -449,10 +449,10 @@ def test_calculated_reaction_energy_uncertainty(self): entries = [] for e in d: entries.append(ComputedEntry.from_dict(e)) - rcts = list(filter(lambda e: e.composition.reduced_formula in ["Li", "O2"], entries)) + reactants = list(filter(lambda e: e.composition.reduced_formula in ["Li", "O2"], entries)) prods = list(filter(lambda e: e.composition.reduced_formula == "Li2O2", entries)) - rxn_with_uncertainty = ComputedReaction(rcts, prods) + rxn_with_uncertainty = ComputedReaction(reactants, prods) assert rxn_with_uncertainty.calculated_reaction_energy_uncertainty == approx(0.5 * 0.0744) def test_calculated_reaction_energy_uncertainty_for_no_uncertainty(self): @@ -519,13 +519,11 @@ def test_calculated_reaction_energy_uncertainty_for_nan(self): "correction": -1.864, }, ] - entries = [] - for e in d: - entries.append(ComputedEntry.from_dict(e)) - rcts = list(filter(lambda e: e.composition.reduced_formula in ["Li", "O2"], entries)) + entries = [ComputedEntry.from_dict(e) for e in d] + reactants = list(filter(lambda e: e.composition.reduced_formula in ["Li", "O2"], entries)) prods = list(filter(lambda e: e.composition.reduced_formula == "Li2O2", entries)) - rxn_with_uncertainty = ComputedReaction(rcts, prods) + rxn_with_uncertainty = ComputedReaction(reactants, prods) assert isnan(rxn_with_uncertainty.calculated_reaction_energy_uncertainty) def test_init(self): diff --git a/tests/core/test_structure.py b/tests/core/test_structure.py index df38e89e640..b91445b03d5 100644 --- a/tests/core/test_structure.py +++ b/tests/core/test_structure.py @@ -740,21 +740,26 @@ def test_to_from_file_string(self): assert "Fd-3m" in self.struct.to(fmt="CIF", symprec=0.1) - self.struct.to(filename="POSCAR.testing") - assert os.path.isfile("POSCAR.testing") + poscar_path = f"{self.tmp_path}/POSCAR.testing" + poscar_str = self.struct.to(filename=poscar_path) + with open(poscar_path) as file: + assert file.read() == poscar_str + assert Structure.from_file(poscar_path) == self.struct + + yaml_path = f"{self.tmp_path}/Si_testing.yaml" + yaml_str = self.struct.to(filename=yaml_path) + with open(yaml_path) as file: + assert file.read() == yaml_str + assert Structure.from_file(yaml_path) == self.struct - self.struct.to(filename="Si_testing.yaml") - assert os.path.isfile("Si_testing.yaml") - struct = Structure.from_file("Si_testing.yaml") - assert struct == self.struct # Test Path support - struct = Structure.from_file(Path("Si_testing.yaml")) + struct = Structure.from_file(Path(yaml_path)) assert struct == self.struct # Test .yml extension works too. - os.replace("Si_testing.yaml", "Si_testing.yml") - struct = Structure.from_file("Si_testing.yml") - assert struct == self.struct + yml_path = yaml_path.replace(".yaml", ".yml") + os.replace(yaml_path, yml_path) + assert Structure.from_file(yml_path) == self.struct with pytest.raises(ValueError, match="Format not specified and could not infer from filename='whatever'"): self.struct.to(filename="whatever") @@ -1409,18 +1414,15 @@ def test_extract_cluster(self): coords = [ [0, 0, 0], [0, 0, 1.089000], - [1.026719, 0, -0.363000], - [-0.513360, -0.889165, -0.363000], - [-0.513360, 0.889165, -0.363000], + [1.026719, 0, -0.363], + [-0.513360, -0.889165, -0.363], + [-0.513360, 0.889165, -0.363], ] ch4 = ["C", "H", "H", "H", "H"] - species = [] - all_coords = [] - for vec in ([0, 0, 0], [4, 0, 0], [0, 4, 0], [4, 4, 0]): - species.extend(ch4) - for c in coords: - all_coords.append(np.array(c) + vec) + vectors = [[0, 0, 0], [4, 0, 0], [0, 4, 0], [4, 4, 0]] + species = [atom for vec in vectors for atom in ch4] + all_coords = [np.array(c) + vec for vec in vectors for c in coords] structure = Structure(Lattice.cubic(10), species, all_coords, coords_are_cartesian=True) @@ -1471,7 +1473,7 @@ def test_calculate_chgnet(self): calculator = struct.calculate(calculator="chgnet") assert isinstance(calculator, Calculator) preds = calculator.results - assert {*preds} == {"stress", "energy", "free_energy", "magmoms", "forces"} + assert {*preds} >= {"stress", "energy", "free_energy", "magmoms", "forces"} assert preds["energy"] == approx(-10.7400808334, abs=1e-5) assert preds["magmoms"] == approx([0.00262399, 0.00262396], abs=1e-5) assert np.linalg.norm(preds["forces"]) == approx(1.998941843e-5, abs=1e-3) @@ -1842,19 +1844,22 @@ def test_default_dict_attrs(self): def test_to_from_file_string(self): for fmt in ["xyz", "json", "g03", "yaml"]: mol = self.mol.to(fmt=fmt) - assert mol is not None - m = IMolecule.from_str(mol, fmt=fmt) - assert m == self.mol - assert isinstance(m, IMolecule) - - self.mol.to(filename="CH4_testing.xyz") - assert os.path.isfile("CH4_testing.xyz") - os.remove("CH4_testing.xyz") - self.mol.to(filename="CH4_testing.yaml") - assert os.path.isfile("CH4_testing.yaml") - mol = Molecule.from_file("CH4_testing.yaml") - assert self.mol == mol - os.remove("CH4_testing.yaml") + assert isinstance(mol, str) + mol = IMolecule.from_str(mol, fmt=fmt) + assert mol == self.mol + assert isinstance(mol, IMolecule) + + ch4_xyz_str = self.mol.to(filename=f"{self.tmp_path}/CH4_testing.xyz") + with open("CH4_testing.xyz") as xyz_file: + assert xyz_file.read() == ch4_xyz_str + ch4_mol = IMolecule.from_file(f"{self.tmp_path}/CH4_testing.xyz") + assert self.mol == ch4_mol + ch4_yaml_str = self.mol.to(filename=f"{self.tmp_path}/CH4_testing.yaml") + + with open("CH4_testing.yaml") as yaml_file: + assert yaml_file.read() == ch4_yaml_str + ch4_mol = Molecule.from_file(f"{self.tmp_path}/CH4_testing.yaml") + assert self.mol == ch4_mol class TestMolecule(PymatgenTest): diff --git a/tests/io/qchem/test_utils.py b/tests/io/qchem/test_utils.py index ec438cb3c6a..4e73d6924e2 100644 --- a/tests/io/qchem/test_utils.py +++ b/tests/io/qchem/test_utils.py @@ -35,18 +35,11 @@ def test_lower_and_check_unique(self): lower_and_check_unique(d4) def test_process_parsed_HESS(self): - data_132 = [] - with zopen(f"{test_dir}/parse_hess/132.0", mode="rb") as file: - binary = file.read() - for ii in range(int(len(binary) / 8)): - data_132.append(struct.unpack("d", binary[ii * 8 : (ii + 1) * 8])[0]) - - data_HESS = [] - with zopen( - f"{test_dir}/parse_hess/HESS", - mode="rt", - encoding="ISO-8859-1", - ) as f: + with zopen(f"{test_dir}/parse_hess/132.0", mode="rb") as f: + binary = f.read() + data_132 = [struct.unpack("d", binary[ii * 8 : (ii + 1) * 8])[0] for ii in range(int(len(binary) / 8))] + + with zopen(f"{test_dir}/parse_hess/HESS", mode="rt", encoding="ISO-8859-1") as f: data_HESS = f.readlines() processed_data_HESS = process_parsed_HESS(data_HESS) From ac14c8840c5da76e4b69ef0cd0660018f7a551e8 Mon Sep 17 00:00:00 2001 From: Janosh Riebesell Date: Thu, 10 Aug 2023 15:07:06 -0700 Subject: [PATCH 4/9] v2023.8.10 --- CHANGES.md | 73 +++++++++++++++++++++++++++++++++++++++++++++--------- setup.py | 2 +- 2 files changed, 62 insertions(+), 13 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 302d237f4fe..c0846d84939 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,9 +6,58 @@ nav_order: 4 # Changelog -## v2023.8.8 - -- Bug fix and cleanup release. +## v2023.8.10 + +- fix `estimate_nbands` function by @matthewkuner in +- Add `CifParser.get_structures(on_error='warn')` by @janosh in +- `ruff . --fix` by @janosh in +- `AseAtomsAdaptor`: Retain `tags` property when interconverting `Atoms` and `Structure`/`Molecule` by @arosen93 in +- Fix a bug in pwscf.py. The proc_val function modifies string values. by @pablogalaviz in +- Delete commented out print statements by @janosh in +- lots of `from_string` should be `classmethod` by @njzjz in +- Extend lobsterenv for coop/cobi by @naik-aakash in +- BUG: fix setting zero magmoms by @lbluque in +- Prefer `pymatviz` interactive plotly version of periodic table heatmap if available by @janosh in +- Better Composition `repr` by @janosh in +- Breaking: Return True for `Element in Composition` if `Species.symbol` matches `Element` by @janosh in +- Revert `LMAXMIX` "fix" added in #3041 by @janosh in +- Add `bader_exe_path` keyword to `BaderAnalysis` and run `bader` tests in CI by @janosh in +- Unskip and fix `packmol` tests by @janosh in +- Propagate labels through various Structure operations by @stefsmeets in +- Delete variable self assignments by @janosh in +- Improve `Structure` tests by @janosh in +- Bump pypa/cibuildwheel from 2.12.3 to 2.14.1 by @dependabot in +- Bump numpy from 1.24.3 to 1.25.2 by @dependabot in +- Bump matplotlib from 3.5.2 to 3.7.2 by @dependabot in +- Bump scipy from 1.9.0 to 1.11.1 by @dependabot in +- Test `class XYZ` edge cases by @janosh in +- Fix `EnergyAdjustment.__repr__` by @janosh in +- Markdownlint by @janosh in +- Fix codecov by @janosh in +- Update `pytest-split` durations by @janosh in +- Fix GitHub language statistics after test files migration by @janosh in +- Fix `automatic_density_by_lengths` and add tests for it by @janosh in +- Prefer `len(structure)` over `structure.num_sites` by @janosh in +- Add `PhaseDiagram` method `get_reference_energy` by @janosh in +- Fix isomorphic for molecular graphs by @rohithsrinivaas in +- Add `Structure.elements` property by @janosh in +- Add keyword `in_place: bool = True` to `SiteCollection.replace_species` by @janosh in +- list offending elements in `BVAnalyzer.get_valences` error message by @janosh in +- Add `Entry.elements` property by @janosh in +- Move `PymatgenTest.TEST_FILES_DIR` attribute into module scope by @janosh in +- f-string path construction everywhere, no need for `os.path.join(...)` by @janosh in +- speed up `bader_caller` and `chargemol_caller` by @chiang-yuan in +- Fix `ruff` PYI041 and ignore PYI024 by @janosh in +- Deprecate `get_string()` methods in favor of `get_str()` by @janosh in +- `Structure/Molecule.to()` now always return same string written to file by @janosh in + +### New Contributors + +- @matthewkuner made their first contribution in +- @pablogalaviz made their first contribution in +- @rohithsrinivaas made their first contribution in + +**Full Changelog**: ## v2023.7.20 @@ -313,7 +362,7 @@ Welcome to new contributors @naveensrinivasan, @xivh, @dgaines2, @yang-ruoxi, @c - Fix: bug in Grüneisen parameter calculation, PR #2543 by @ab5424 - Fix: allow a comment on final line of KPOINTS file, PR #2549 by @xivh - Fix: for `Composition.replace` with complex mappings, PR #2555 by @jacksund -- Fix: Implement equality method and fix __iter__ for InputSet, PR #2575 by @rkingsbury +- Fix: Implement equality method and fix **iter** for InputSet, PR #2575 by @rkingsbury - Fix: use negative charge convention for electron in "update_charge_from_potcar", PR #2577 by @jmmshn - Fix: ensure charge is applied to initial and final structures parsed from vasprun.xml, PR #2579 by @jmmshn - Chore: Set permissions for GitHub actions, PR #2547 by @naveensrinivasan @@ -650,7 +699,7 @@ you are acknowledged appropriately by filling out the linked form. ## v2021.3.4 (Yanked) -- __Backwards incompatible__: Pymatgen root imports have been removed from +- **Backwards incompatible**: Pymatgen root imports have been removed from v2021.3.4 in preparation for a change to a more modular, extensible architecture that will allow more developers to contribute. @@ -687,10 +736,10 @@ you are acknowledged appropriately by filling out the linked form. ## v2021.3.3 -- __Backwards incompatible__: pymatgen.SETTINGS have been moved to +- **Backwards incompatible**: pymatgen.SETTINGS have been moved to pymatgen.settings.SETTINGS. In general, this should not lead to many breakages since most of these settings are used within pymatgen itself. -- __Backwards incompatible__: pymatgen.loadfn and get_structure_from_mp have been +- **Backwards incompatible**: pymatgen.loadfn and get_structure_from_mp have been removed since no one was using them. - critic2_caller has been refactored. (@samblau) - Improved hash for Composition (@CompRhys) @@ -2361,7 +2410,7 @@ for more information (@dwinston) ## v2.8.0 -- __Units__. Pymatgen now has a new system of managing units, +- **Units**. Pymatgen now has a new system of managing units, defined in pymatgen.core.units. Typical energy, length, time, temperature and charge units are supported. Units subclass float, which makes the usage transparent in all functions. The value that they @@ -2371,7 +2420,7 @@ for more information (@dwinston) easy conversion. Please see :mod:`pymatgen.core.units` and the :doc:`examples ` for a demonstration of house to use units in pymatgen. -- __Minor backwards-incompatible change__. Structures are now sorted by +- **Minor backwards-incompatible change**. Structures are now sorted by default when generating VASP input files using vaspio_set. Old behavior can be obtained by setting sort_structure=False in the constructor. This is typically the desired behavior and prevents the generation of large @@ -2421,13 +2470,13 @@ for more information (@dwinston) ## v2.7.1 -- __Major backwards-incompatible change.__ With effect from v2.7.1, +- **Major backwards-incompatible change.** With effect from v2.7.1, the default Structure and Molecule classes are now _mutable_ objects. All functionality in the :mod:`pymatgen.core.structure_modifier` has been ported over to the new mutable classes. This change was implemented because the immutability of Structure and Molecule has resulted in very awkward code to make changes to them. The main cost of this change is that - Structure and Molecule can no longer be used as dict keys (__hash__ has + Structure and Molecule can no longer be used as dict keys (**hash** has been set to None). However, we believe this is a minor cost given that we have rarely seen the use of Structure or Molecule as dict keys in any case. For the rare instances where such functionality is needed, @@ -2469,7 +2518,7 @@ for more information (@dwinston) - Added a command_line caller to do Bader charge analysis using Henkelmann et al.'s algorithm. - Bug fix for POSCAR parsing when title line is an empty string. -- Added __rmul__ operator for Composition. +- Added **rmul** operator for Composition. - Vastly expanded available aliases. ## v2.6.4 diff --git a/setup.py b/setup.py index b81edcce33f..c5af474b835 100644 --- a/setup.py +++ b/setup.py @@ -28,7 +28,7 @@ include=["pymatgen.*", "pymatgen.analysis.*", "pymatgen.io.*", "pymatgen.ext.*", "cmd_line"], exclude=["pymatgen.*.tests", "pymatgen.*.*.tests", "pymatgen.*.*.*.tests"], ), - version="2023.7.20", + version="2023.08.10", python_requires=">=3.8", install_requires=[ "matplotlib>=1.5", From d9fdfefa4787c5121d76ea0e1c60927d7b320d43 Mon Sep 17 00:00:00 2001 From: Janosh Riebesell Date: Fri, 11 Aug 2023 14:07:13 -0700 Subject: [PATCH 5/9] docs/CHANGES.md add v2023.8.10 changelog --- docs/CHANGES.md | 71 +++++++++++++++++++++++++++++++++++++++------ pymatgen/io/lmto.py | 15 ++++------ pyproject.toml | 2 +- 3 files changed, 69 insertions(+), 19 deletions(-) diff --git a/docs/CHANGES.md b/docs/CHANGES.md index 1d3e7bea421..c0846d84939 100644 --- a/docs/CHANGES.md +++ b/docs/CHANGES.md @@ -6,6 +6,59 @@ nav_order: 4 # Changelog +## v2023.8.10 + +- fix `estimate_nbands` function by @matthewkuner in +- Add `CifParser.get_structures(on_error='warn')` by @janosh in +- `ruff . --fix` by @janosh in +- `AseAtomsAdaptor`: Retain `tags` property when interconverting `Atoms` and `Structure`/`Molecule` by @arosen93 in +- Fix a bug in pwscf.py. The proc_val function modifies string values. by @pablogalaviz in +- Delete commented out print statements by @janosh in +- lots of `from_string` should be `classmethod` by @njzjz in +- Extend lobsterenv for coop/cobi by @naik-aakash in +- BUG: fix setting zero magmoms by @lbluque in +- Prefer `pymatviz` interactive plotly version of periodic table heatmap if available by @janosh in +- Better Composition `repr` by @janosh in +- Breaking: Return True for `Element in Composition` if `Species.symbol` matches `Element` by @janosh in +- Revert `LMAXMIX` "fix" added in #3041 by @janosh in +- Add `bader_exe_path` keyword to `BaderAnalysis` and run `bader` tests in CI by @janosh in +- Unskip and fix `packmol` tests by @janosh in +- Propagate labels through various Structure operations by @stefsmeets in +- Delete variable self assignments by @janosh in +- Improve `Structure` tests by @janosh in +- Bump pypa/cibuildwheel from 2.12.3 to 2.14.1 by @dependabot in +- Bump numpy from 1.24.3 to 1.25.2 by @dependabot in +- Bump matplotlib from 3.5.2 to 3.7.2 by @dependabot in +- Bump scipy from 1.9.0 to 1.11.1 by @dependabot in +- Test `class XYZ` edge cases by @janosh in +- Fix `EnergyAdjustment.__repr__` by @janosh in +- Markdownlint by @janosh in +- Fix codecov by @janosh in +- Update `pytest-split` durations by @janosh in +- Fix GitHub language statistics after test files migration by @janosh in +- Fix `automatic_density_by_lengths` and add tests for it by @janosh in +- Prefer `len(structure)` over `structure.num_sites` by @janosh in +- Add `PhaseDiagram` method `get_reference_energy` by @janosh in +- Fix isomorphic for molecular graphs by @rohithsrinivaas in +- Add `Structure.elements` property by @janosh in +- Add keyword `in_place: bool = True` to `SiteCollection.replace_species` by @janosh in +- list offending elements in `BVAnalyzer.get_valences` error message by @janosh in +- Add `Entry.elements` property by @janosh in +- Move `PymatgenTest.TEST_FILES_DIR` attribute into module scope by @janosh in +- f-string path construction everywhere, no need for `os.path.join(...)` by @janosh in +- speed up `bader_caller` and `chargemol_caller` by @chiang-yuan in +- Fix `ruff` PYI041 and ignore PYI024 by @janosh in +- Deprecate `get_string()` methods in favor of `get_str()` by @janosh in +- `Structure/Molecule.to()` now always return same string written to file by @janosh in + +### New Contributors + +- @matthewkuner made their first contribution in +- @pablogalaviz made their first contribution in +- @rohithsrinivaas made their first contribution in + +**Full Changelog**: + ## v2023.7.20 - Unreadable string concat ops to f-string by @janosh in @@ -309,7 +362,7 @@ Welcome to new contributors @naveensrinivasan, @xivh, @dgaines2, @yang-ruoxi, @c - Fix: bug in Grüneisen parameter calculation, PR #2543 by @ab5424 - Fix: allow a comment on final line of KPOINTS file, PR #2549 by @xivh - Fix: for `Composition.replace` with complex mappings, PR #2555 by @jacksund -- Fix: Implement equality method and fix __iter__ for InputSet, PR #2575 by @rkingsbury +- Fix: Implement equality method and fix **iter** for InputSet, PR #2575 by @rkingsbury - Fix: use negative charge convention for electron in "update_charge_from_potcar", PR #2577 by @jmmshn - Fix: ensure charge is applied to initial and final structures parsed from vasprun.xml, PR #2579 by @jmmshn - Chore: Set permissions for GitHub actions, PR #2547 by @naveensrinivasan @@ -646,7 +699,7 @@ you are acknowledged appropriately by filling out the linked form. ## v2021.3.4 (Yanked) -- __Backwards incompatible__: Pymatgen root imports have been removed from +- **Backwards incompatible**: Pymatgen root imports have been removed from v2021.3.4 in preparation for a change to a more modular, extensible architecture that will allow more developers to contribute. @@ -683,10 +736,10 @@ you are acknowledged appropriately by filling out the linked form. ## v2021.3.3 -- __Backwards incompatible__: pymatgen.SETTINGS have been moved to +- **Backwards incompatible**: pymatgen.SETTINGS have been moved to pymatgen.settings.SETTINGS. In general, this should not lead to many breakages since most of these settings are used within pymatgen itself. -- __Backwards incompatible__: pymatgen.loadfn and get_structure_from_mp have been +- **Backwards incompatible**: pymatgen.loadfn and get_structure_from_mp have been removed since no one was using them. - critic2_caller has been refactored. (@samblau) - Improved hash for Composition (@CompRhys) @@ -2357,7 +2410,7 @@ for more information (@dwinston) ## v2.8.0 -- __Units__. Pymatgen now has a new system of managing units, +- **Units**. Pymatgen now has a new system of managing units, defined in pymatgen.core.units. Typical energy, length, time, temperature and charge units are supported. Units subclass float, which makes the usage transparent in all functions. The value that they @@ -2367,7 +2420,7 @@ for more information (@dwinston) easy conversion. Please see :mod:`pymatgen.core.units` and the :doc:`examples ` for a demonstration of house to use units in pymatgen. -- __Minor backwards-incompatible change__. Structures are now sorted by +- **Minor backwards-incompatible change**. Structures are now sorted by default when generating VASP input files using vaspio_set. Old behavior can be obtained by setting sort_structure=False in the constructor. This is typically the desired behavior and prevents the generation of large @@ -2417,13 +2470,13 @@ for more information (@dwinston) ## v2.7.1 -- __Major backwards-incompatible change.__ With effect from v2.7.1, +- **Major backwards-incompatible change.** With effect from v2.7.1, the default Structure and Molecule classes are now _mutable_ objects. All functionality in the :mod:`pymatgen.core.structure_modifier` has been ported over to the new mutable classes. This change was implemented because the immutability of Structure and Molecule has resulted in very awkward code to make changes to them. The main cost of this change is that - Structure and Molecule can no longer be used as dict keys (__hash__ has + Structure and Molecule can no longer be used as dict keys (**hash** has been set to None). However, we believe this is a minor cost given that we have rarely seen the use of Structure or Molecule as dict keys in any case. For the rare instances where such functionality is needed, @@ -2465,7 +2518,7 @@ for more information (@dwinston) - Added a command_line caller to do Bader charge analysis using Henkelmann et al.'s algorithm. - Bug fix for POSCAR parsing when title line is an empty string. -- Added __rmul__ operator for Composition. +- Added **rmul** operator for Composition. - Vastly expanded available aliases. ## v2.6.4 diff --git a/pymatgen/io/lmto.py b/pymatgen/io/lmto.py index b6c9438c4dd..f03aa9ae8f2 100644 --- a/pymatgen/io/lmto.py +++ b/pymatgen/io/lmto.py @@ -33,16 +33,13 @@ class LMTOCtrl: Currently, only HEADER, VERS and the structure can be used. """ - def __init__(self, structure: Structure, header=None, version="LMASA-47"): + def __init__(self, structure: Structure, header: str | None = None, version: str = "LMASA-47") -> None: """ Args: - structure: The structure as a pymatgen Structure object. - - header: The header for the CTRL file . - Defaults to None. - - version: The LMTO version that is used for the VERS category. - Defaults to the newest version (4.7). + structure (Structure): pymatgen object. + header (str): The header for the CTRL file. Defaults to None. + version (str): The LMTO version that is used for the VERS category. + Defaults to version (4.7). """ self.structure = structure self.header = header @@ -71,7 +68,7 @@ def get_str(self, sigfigs=8) -> str: the minimal CTRL file necessary to execute lmhart.run. """ ctrl_dict = self.as_dict() - lines = [] if "HEADER" not in ctrl_dict else ["HEADER".ljust(10) + self.header] + lines = [] if "HEADER" not in ctrl_dict else [f"{'HEADER':<10}{self.header}"] if "VERS" in ctrl_dict: lines.append("VERS".ljust(10) + self.version) diff --git a/pyproject.toml b/pyproject.toml index b84f2a16046..e10f017bc22 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -107,6 +107,7 @@ exclude_also = [ "@deprecated", "@np.deprecate", "def __repr__", + "except ImportError:", "if 0:", "if TYPE_CHECKING:", "if __name__ == .__main__.:", @@ -117,7 +118,6 @@ exclude_also = [ "raise AssertionError", "raise NotImplementedError", "show_plot", - "except ImportError:" ] [tool.mypy] From 182ccbf83c7e60e7e68cb12106ce6ea94b821eab Mon Sep 17 00:00:00 2001 From: Janosh Riebesell Date: Sun, 13 Aug 2023 15:05:43 -0700 Subject: [PATCH 6/9] clean up pymatgen/analysis/vesta_cutoffs.yaml --- .pre-commit-config.yaml | 1 - pymatgen/analysis/vesta_cutoffs.yaml | 2742 +++++++++----------------- 2 files changed, 914 insertions(+), 1829 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index dbb4c40c0a3..1ead8aca031 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -17,7 +17,6 @@ repos: rev: v4.4.0 hooks: - id: check-yaml - exclude: pymatgen/analysis/vesta_cutoffs.yaml - id: end-of-file-fixer - id: trailing-whitespace diff --git a/pymatgen/analysis/vesta_cutoffs.yaml b/pymatgen/analysis/vesta_cutoffs.yaml index 536639a9a54..98c60c7f8d6 100644 --- a/pymatgen/analysis/vesta_cutoffs.yaml +++ b/pymatgen/analysis/vesta_cutoffs.yaml @@ -1,1828 +1,914 @@ -? !!python/tuple [Ac, Br] -: 3.22726 -? !!python/tuple [Ac, Cl] -: 3.08646 -? !!python/tuple [Ac, F] -: 2.58646 -? !!python/tuple [Ac, O] -: 2.7326 -? !!python/tuple [Ag, As] -: 2.45642 -? !!python/tuple [Ag, Br] -: 2.37642 -? !!python/tuple [Ag, Cl] -: 3.05939 -? !!python/tuple [Ag, F] -: 2.76939 -? !!python/tuple [Ag, H] -: 1.65642 -? !!python/tuple [Ag, I] -: 2.53642 -? !!python/tuple [Ag, N] -: 2.00642 -? !!python/tuple [Ag, O] -: 2.81139 -? !!python/tuple [Ag, P] -: 2.37642 -? !!python/tuple [Ag, S] -: 3.08839 -? !!python/tuple [Ag, Se] -: 2.41642 -? !!python/tuple [Ag, Te] -: 2.66642 -? !!python/tuple [Al, As] -: 2.75646 -? !!python/tuple [Al, Br] -: 2.65646 -? !!python/tuple [Al, Cl] -: 2.48846 -? !!python/tuple [Al, F] -: 2.00146 -? !!python/tuple [Al, H] -: 1.90646 -? !!python/tuple [Al, I] -: 2.86646 -? !!python/tuple [Al, N] -: 2.24646 -? !!python/tuple [Al, O] -: 2.1074 -? !!python/tuple [Al, P] -: 2.69646 -? !!python/tuple [Al, S] -: 2.66646 -? !!python/tuple [Al, Se] -: 2.72646 -? !!python/tuple [Al, Te] -: 2.93646 -? !!python/tuple [Am, Br] -: 3.22944 -? !!python/tuple [Am, Cl] -: 3.08945 -? !!python/tuple [Am, F] -: 2.61945 -? !!python/tuple [Am, O] -: 2.71649 -? !!python/tuple [As, Br] -: 2.80646 -? !!python/tuple [As, C] -: 2.38646 -? !!python/tuple [As, Cl] -: 2.61646 -? !!python/tuple [As, F] -: 2.15646 -? !!python/tuple [As, I] -: 3.03646 -? !!python/tuple [As, O] -: 2.24546 -? !!python/tuple [As, S] -: 2.84649 -? !!python/tuple [As, Se] -: 2.98649 -? !!python/tuple [As, Te] -: 3.10646 -? !!python/tuple [Au, As] -: 2.26998 -? !!python/tuple [Au, Br] -: 2.77646 -? !!python/tuple [Au, Cl] -: 2.88295 -? !!python/tuple [Au, F] -: 2.34646 -? !!python/tuple [Au, H] -: 1.41998 -? !!python/tuple [Au, I] -: 3.21295 -? !!python/tuple [Au, N] -: 2.3826 -? !!python/tuple [Au, O] -: 2.34646 -? !!python/tuple [Au, P] -: 2.18998 -? !!python/tuple [Au, S] -: 2.8326 -? !!python/tuple [Au, Se] -: 2.22998 -? !!python/tuple [Au, Te] -: 2.45998 -? !!python/tuple [B, As] -: 2.42646 -? !!python/tuple [B, B] -: 1.85846 -? !!python/tuple [B, Br] -: 2.33646 -? !!python/tuple [B, Cl] -: 2.19646 -? !!python/tuple [B, F] -: 1.76646 -? !!python/tuple [B, H] -: 1.59646 -? !!python/tuple [B, I] -: 2.55646 -? !!python/tuple [B, N] -: 1.93846 -? !!python/tuple [B, O] -: 1.82746 -? !!python/tuple [B, P] -: 2.37646 -? !!python/tuple [B, S] -: 2.27646 -? !!python/tuple [B, Se] -: 2.40646 -? !!python/tuple [B, Te] -: 2.65646 -? !!python/tuple [Ba, As] -: 3.69 -? !!python/tuple [Ba, Br] -: 3.74295 -? !!python/tuple [Ba, Cl] -: 3.55295 -? !!python/tuple [Ba, F] -: 3.05095 -? !!python/tuple [Ba, H] -: 3.08295 -? !!python/tuple [Ba, I] -: 3.99295 -? !!python/tuple [Ba, N] -: 3.33295 -? !!python/tuple [Ba, O] -: 3.14795 -? !!python/tuple [Ba, P] -: 3.48295 -? !!python/tuple [Ba, S] -: 3.66195 -? !!python/tuple [Ba, Se] -: 3.74295 -? !!python/tuple [Ba, Te] -: 3.94295 -? !!python/tuple [Be, As] -: 2.60649 -? !!python/tuple [Be, Br] -: 2.50649 -? !!python/tuple [Be, Cl] -: 2.36649 -? !!python/tuple [Be, F] -: 1.88749 -? !!python/tuple [Be, H] -: 1.71649 -? !!python/tuple [Be, I] -: 2.70649 -? !!python/tuple [Be, N] -: 2.10649 -? !!python/tuple [Be, O] -: 1.98749 -? !!python/tuple [Be, P] -: 2.55649 -? !!python/tuple [Be, S] -: 2.43649 -? !!python/tuple [Be, Se] -: 2.57649 -? !!python/tuple [Be, Te] -: 2.81649 -? !!python/tuple [Bi, As] -: 2.87642 -? !!python/tuple [Bi, Br] -: 3.17993 -? !!python/tuple [Bi, Cl] -: 3.04291 -? !!python/tuple [Bi, F] -: 2.55291 -? !!python/tuple [Bi, H] -: 2.12642 -? !!python/tuple [Bi, I] -: 3.38291 -? !!python/tuple [Bi, N] -: 2.56329 -? !!python/tuple [Bi, O] -: 2.6608 -? !!python/tuple [Bi, P] -: 2.78642 -? !!python/tuple [Bi, S] -: 3.13291 -? !!python/tuple [Bi, Se] -: 3.24329 -? !!python/tuple [Bi, Te] -: 3.02642 -? !!python/tuple [Bk, Br] -: 3.15233 -? !!python/tuple [Bk, Cl] -: 3.02291 -? !!python/tuple [Bk, F] -: 2.54233 -? !!python/tuple [Bk, O] -: 2.64329 -? !!python/tuple [Br, Cl] -: 2.33296 -? !!python/tuple [Br, F] -: 2.20646 -? !!python/tuple [Br, O] -: 2.35646 -? !!python/tuple [C, Br] -: 2.26002 -? !!python/tuple [C, C] -: 1.89002 -? !!python/tuple [C, Cl] -: 2.11002 -? !!python/tuple [C, F] -: 1.76002 -? !!python/tuple [C, H] -: 1.2 -? !!python/tuple [C, I] -: 2.16998 -? !!python/tuple [C, N] -: 1.79202 -? !!python/tuple [C, O] -: 1.97249 -? !!python/tuple [C, P] -: 1.93998 -? !!python/tuple [C, S] -: 2.15002 -? !!python/tuple [C, Se] -: 2.01998 -? !!python/tuple [C, Te] -: 2.25998 -? !!python/tuple [Ca, As] -: 3.48295 -? !!python/tuple [Ca, Br] -: 3.36995 -? !!python/tuple [Ca, Cl] -: 3.23295 -? !!python/tuple [Ca, F] -: 2.70495 -? !!python/tuple [Ca, H] -: 2.69295 -? !!python/tuple [Ca, I] -: 3.58295 -? !!python/tuple [Ca, N] -: 3.00295 -? !!python/tuple [Ca, O] -: 2.83062 -? !!python/tuple [Ca, P] -: 3.41295 -? !!python/tuple [Ca, S] -: 3.31295 -? !!python/tuple [Ca, Se] -: 3.42295 -? !!python/tuple [Ca, Te] -: 3.62295 -? !!python/tuple [Cd, As] -: 3.29295 -? !!python/tuple [Cd, Br] -: 3.21295 -? !!python/tuple [Cd, Cl] -: 3.09295 -? !!python/tuple [Cd, F] -: 2.67395 -? !!python/tuple [Cd, H] -: 2.52295 -? !!python/tuple [Cd, I] -: 3.46295 -? !!python/tuple [Cd, N] -: 2.82295 -? !!python/tuple [Cd, O] -: 2.76695 -? !!python/tuple [Cd, P] -: 3.20295 -? !!python/tuple [Cd, S] -: 3.16695 -? !!python/tuple [Cd, Se] -: 3.26295 -? !!python/tuple [Cd, Te] -: 3.45295 -? !!python/tuple [Ce, As] -: 3.08644 -? !!python/tuple [Ce, Br] -: 3.40452 -? !!python/tuple [Ce, Cl] -: 3.25293 -? !!python/tuple [Ce, F] -: 2.75452 -? !!python/tuple [Ce, H] -: 2.34644 -? !!python/tuple [Ce, I] -: 3.62452 -? !!python/tuple [Ce, N] -: 2.78549 -? !!python/tuple [Ce, O] -: 2.86393 -? !!python/tuple [Ce, P] -: 3.00644 -? !!python/tuple [Ce, S] -: 3.36293 -? !!python/tuple [Ce, Se] -: 3.04644 -? !!python/tuple [Ce, Te] -: 3.22644 -? !!python/tuple [Cf, Br] -: 3.14233 -? !!python/tuple [Cf, Cl] -: 3.01291 -? !!python/tuple [Cf, F] -: 2.53233 -? !!python/tuple [Cf, O] -: 2.63291 -? !!python/tuple [Cl, Cl] -: 2.14296 -? !!python/tuple [Cl, F] -: 2.14646 -? !!python/tuple [Cl, O] -: 2.16646 -? !!python/tuple [Cm, Cl] -: 3.18291 -? !!python/tuple [Cm, F] -: 2.68291 -? !!python/tuple [Cm, O] -: 2.79291 -? !!python/tuple [Co, As] -: 2.43642 -? !!python/tuple [Co, Br] -: 2.33642 -? !!python/tuple [Co, C] -: 2.19691 -? !!python/tuple [Co, Cl] -: 2.74593 -? !!python/tuple [Co, F] -: 2.35293 -? !!python/tuple [Co, H] -: 1.9278 -? !!python/tuple [Co, I] -: 2.52878 -? !!python/tuple [Co, N] -: 2.36293 -? !!python/tuple [Co, O] -: 2.40493 -? !!python/tuple [Co, P] -: 2.36642 -? !!python/tuple [Co, S] -: 2.65293 -? !!python/tuple [Co, Se] -: 2.39642 -? !!python/tuple [Co, Te] -: 2.61642 -? !!python/tuple [Cr, As] -: 2.49642 -? !!python/tuple [Cr, Br] -: 2.97293 -? !!python/tuple [Cr, Cl] -: 2.80293 -? !!python/tuple [Cr, F] -: 2.45293 -? !!python/tuple [Cr, H] -: 1.67642 -? !!python/tuple [Cr, I] -: 3.19293 -? !!python/tuple [Cr, N] -: 2.5152 -? !!python/tuple [Cr, O] -: 2.44293 -? !!python/tuple [Cr, P] -: 2.42642 -? !!python/tuple [Cr, S] -: 2.72491 -? !!python/tuple [Cr, Se] -: 2.44642 -? !!python/tuple [Cr, Te] -: 2.67642 -? !!python/tuple [Cs, As] -: 4.15942 -? !!python/tuple [Cs, Br] -: 4.06942 -? !!python/tuple [Cs, Cl] -: 3.91042 -? !!python/tuple [Cs, F] -: 3.49942 -? !!python/tuple [Cs, H] -: 3.55942 -? !!python/tuple [Cs, I] -: 4.40942 -? !!python/tuple [Cs, N] -: 3.94942 -? !!python/tuple [Cs, O] -: 3.53642 -? !!python/tuple [Cs, P] -: 3.64194 -? !!python/tuple [Cs, S] -: 4.24942 -? !!python/tuple [Cs, Se] -: 4.21655 -? !!python/tuple [Cs, Te] -: 4.4631 -? !!python/tuple [Cu, As] -: 2.71895 -? !!python/tuple [Cu, Br] -: 2.89295 -? !!python/tuple [Cu, C] -: 2.32649 -? !!python/tuple [Cu, Cl] -: 2.75295 -? !!python/tuple [Cu, F] -: 2.46295 -? !!python/tuple [Cu, H] -: 1.81649 -? !!python/tuple [Cu, I] -: 3.01795 -? !!python/tuple [Cu, N] -: 2.49295 -? !!python/tuple [Cu, O] -: 2.47295 -? !!python/tuple [Cu, P] -: 2.65649 -? !!python/tuple [Cu, S] -: 2.76095 -? !!python/tuple [Cu, Se] -: 2.76295 -? !!python/tuple [Cu, Te] -: 2.87649 -? !!python/tuple [D, Cl] -: 1.5 -? !!python/tuple [D, F] -: 1.1 -? !!python/tuple [D, N] -: 1.2 -? !!python/tuple [D, O] -: 2.1 -? !!python/tuple [Dy, As] -: 3.14 -? !!python/tuple [Dy, Br] -: 3.16945 -? !!python/tuple [Dy, Cl] -: 3.01945 -? !!python/tuple [Dy, F] -: 2.52944 -? !!python/tuple [Dy, H] -: 2.09 -? !!python/tuple [Dy, I] -: 3.39945 -? !!python/tuple [Dy, N] -: 2.38 -? !!python/tuple [Dy, O] -: 2.65651 -? !!python/tuple [Dy, P] -: 2.77 -? !!python/tuple [Dy, S] -: 2.823 -? !!python/tuple [Dy, Se] -: 2.81 -? !!python/tuple [Dy, Te] -: 3.22 -? !!python/tuple [Er, As] -: 3.18 -? !!python/tuple [Er, Br] -: 3.14945 -? !!python/tuple [Er, Cl] -: 2.99944 -? !!python/tuple [Er, F] -: 2.51049 -? !!python/tuple [Er, H] -: 2.06 -? !!python/tuple [Er, I] -: 3.38945 -? !!python/tuple [Er, N] -: 2.36 -? !!python/tuple [Er, O] -: 2.63651 -? !!python/tuple [Er, P] -: 2.75 -? !!python/tuple [Er, S] -: 3.27651 -? !!python/tuple [Er, Se] -: 3.18649 -? !!python/tuple [Er, Te] -: 3.22 -? !!python/tuple [Es, O] -: 2.70139 -? !!python/tuple [Eu, As] -: 2.93898 -? !!python/tuple [Eu, Br] -: 3.46549 -? !!python/tuple [Eu, Cl] -: 3.32549 -? !!python/tuple [Eu, F] -: 2.83549 -? !!python/tuple [Eu, H] -: 2.18898 -? !!python/tuple [Eu, I] -: 3.69549 -? !!python/tuple [Eu, N] -: 2.95549 -? !!python/tuple [Eu, O] -: 2.94249 -? !!python/tuple [Eu, P] -: 2.85898 -? !!python/tuple [Eu, S] -: 3.37949 -? !!python/tuple [Eu, Se] -: 2.89898 -? !!python/tuple [Eu, Te] -: 3.08898 -? !!python/tuple [Fe, As] -: 2.50642 -? !!python/tuple [Fe, Br] -: 2.8952 -? !!python/tuple [Fe, C] -: 2.25191 -? !!python/tuple [Fe, Cl] -: 2.86293 -? !!python/tuple [Fe, F] -: 2.36293 -? !!python/tuple [Fe, H] -: 1.68642 -? !!python/tuple [Fe, I] -: 3.1552 -? !!python/tuple [Fe, N] -: 2.48193 -? !!python/tuple [Fe, O] -: 2.44693 -? !!python/tuple [Fe, P] -: 2.42642 -? !!python/tuple [Fe, S] -: 2.83793 -? !!python/tuple [Fe, Se] -: 2.43642 -? !!python/tuple [Fe, Te] -: 2.68642 -? !!python/tuple [Ga, As] -: 2.38998 -? !!python/tuple [Ga, Br] -: 2.6426 -? !!python/tuple [Ga, Cl] -: 2.52646 -? !!python/tuple [Ga, F] -: 2.14646 -? !!python/tuple [Ga, H] -: 1.55998 -? !!python/tuple [Ga, I] -: 2.91646 -? !!python/tuple [Ga, N] -: 1.96 -? !!python/tuple [Ga, O] -: 2.18646 -? !!python/tuple [Ga, P] -: 2.46998 -? !!python/tuple [Ga, S] -: 2.61946 -? !!python/tuple [Ga, Se] -: 3.41295 -? !!python/tuple [Ga, Te] -: 2.58998 -? !!python/tuple [Gd, As] -: 3.18 -? !!python/tuple [Gd, Br] -: 3.19945 -? !!python/tuple [Gd, Cl] -: 3.06349 -? !!python/tuple [Gd, F] -: 3.15651 -? !!python/tuple [Gd, H] -: 2.13 -? !!python/tuple [Gd, I] -: 3.41945 -? !!python/tuple [Gd, N] -: 2.42 -? !!python/tuple [Gd, O] -: 2.76651 -? !!python/tuple [Gd, P] -: 2.81 -? !!python/tuple [Gd, S] -: 3.13649 -? !!python/tuple [Gd, Se] -: 2.85 -? !!python/tuple [Gd, Te] -: 3.24 -? !!python/tuple [Ge, As] -: 2.47998 -? !!python/tuple [Ge, Br] -: 2.34998 -? !!python/tuple [Ge, Cl] -: 2.49002 -? !!python/tuple [Ge, F] -: 2.01002 -? !!python/tuple [Ge, Ge] -: 2.6 -? !!python/tuple [Ge, H] -: 1.59998 -? !!python/tuple [Ge, I] -: 2.54998 -? !!python/tuple [Ge, N] -: 1.92998 -? !!python/tuple [Ge, O] -: 2.09802 -? !!python/tuple [Ge, P] -: 2.36998 -? !!python/tuple [Ge, S] -: 2.56702 -? !!python/tuple [Ge, Se] -: 2.70002 -? !!python/tuple [Ge, Te] -: 2.60998 -? !!python/tuple [H, Cl] -: 1.5 -? !!python/tuple [H, F] -: 1.1 -? !!python/tuple [H, N] -: 1.2 -? !!python/tuple [H, O] -: 2.1 -? !!python/tuple [Hf, As] -: 2.71642 -? !!python/tuple [Hf, Br] -: 2.62642 -? !!python/tuple [Hf, Cl] -: 2.75646 -? !!python/tuple [Hf, F] -: 3.18291 -? !!python/tuple [Hf, H] -: 1.93642 -? !!python/tuple [Hf, I] -: 2.83642 -? !!python/tuple [Hf, N] -: 2.24642 -? !!python/tuple [Hf, O] -: 2.37946 -? !!python/tuple [Hf, P] -: 2.63642 -? !!python/tuple [Hf, S] -: 2.64642 -? !!python/tuple [Hf, Se] -: 2.67642 -? !!python/tuple [Hf, Te] -: 2.87642 -? !!python/tuple [Hg, As] -: 2.65642 -? !!python/tuple [Hg, Br] -: 3.09293 -? !!python/tuple [Hg, Cl] -: 3.24939 -? !!python/tuple [Hg, F] -: 2.88293 -? !!python/tuple [Hg, H] -: 1.86642 -? !!python/tuple [Hg, Hg] -: 3.1952 -? !!python/tuple [Hg, I] -: 3.33293 -? !!python/tuple [Hg, N] -: 2.17642 -? !!python/tuple [Hg, O] -: 2.86939 -? !!python/tuple [Hg, P] -: 2.57642 -? !!python/tuple [Hg, S] -: 3.42093 -? !!python/tuple [Hg, Se] -: 2.82642 -? !!python/tuple [Hg, Te] -: 2.76642 -? !!python/tuple [Ho, As] -: 2.87898 -? !!python/tuple [Ho, Br] -: 3.20159 -? !!python/tuple [Ho, Cl] -: 3.05159 -? !!python/tuple [Ho, F] -: 2.56159 -? !!python/tuple [Ho, H] -: 2.11898 -? !!python/tuple [Ho, I] -: 3.44159 -? !!python/tuple [Ho, N] -: 2.41898 -? !!python/tuple [Ho, O] -: 2.67047 -? !!python/tuple [Ho, P] -: 2.79898 -? !!python/tuple [Ho, S] -: 3.13547 -? !!python/tuple [Ho, Se] -: 2.84898 -? !!python/tuple [Ho, Te] -: 3.03898 -? !!python/tuple [I, Cl] -: 3.33295 -? !!python/tuple [I, F] -: 3.18295 -? !!python/tuple [I, I] -: 2.4 -? !!python/tuple [I, O] -: 2.47646 -? !!python/tuple [In, As] -: 2.66642 -? !!python/tuple [In, Br] -: 3.05329 -? !!python/tuple [In, Cl] -: 3.52939 -? !!python/tuple [In, Co] -: 3.13629 -? !!python/tuple [In, F] -: 2.35491 -? !!python/tuple [In, H] -: 1.87642 -? !!python/tuple [In, I] -: 3.19291 -? !!python/tuple [In, Mn] -: 3.14729 -? !!python/tuple [In, N] -: 2.18642 -? !!python/tuple [In, O] -: 2.46491 -? !!python/tuple [In, P] -: 2.68642 -? !!python/tuple [In, S] -: 2.93291 -? !!python/tuple [In, Se] -: 2.62642 -? !!python/tuple [In, Te] -: 2.84642 -? !!python/tuple [Ir, As] -: 2.58998 -? !!python/tuple [Ir, Br] -: 2.49998 -? !!python/tuple [Ir, Cl] -: 2.56746 -? !!python/tuple [Ir, F] -: 2.15002 -? !!python/tuple [Ir, H] -: 1.80998 -? !!python/tuple [Ir, I] -: 2.70998 -? !!python/tuple [Ir, N] -: 2.10998 -? !!python/tuple [Ir, O] -: 2.27746 -? !!python/tuple [Ir, P] -: 2.50998 -? !!python/tuple [Ir, S] -: 2.42998 -? !!python/tuple [Ir, Se] -: 2.55998 -? !!python/tuple [Ir, Te] -: 2.75998 -? !!python/tuple [K, As] -: 3.94942 -? !!python/tuple [K, Br] -: 3.8513 -? !!python/tuple [K, Cl] -: 3.65976 -? !!python/tuple [K, F] -: 3.11142 -? !!python/tuple [K, H] -: 3.21942 -? !!python/tuple [K, I] -: 4.11717 -? !!python/tuple [K, N] -: 3.41942 -? !!python/tuple [K, O] -: 3.25142 -? !!python/tuple [K, P] -: 3.44942 -? !!python/tuple [K, S] -: 3.79285 -? !!python/tuple [K, Se] -: 4.00186 -? !!python/tuple [K, Te] -: 4.23284 -? !!python/tuple [Kr, F] -: 2.67549 -? !!python/tuple [La, As] -: 3.51293 -? !!python/tuple [La, Br] -: 3.43293 -? !!python/tuple [La, Cl] -: 3.33452 -? !!python/tuple [La, F] -: 2.79293 -? !!python/tuple [La, H] -: 2.77293 -? !!python/tuple [La, I] -: 3.64293 -? !!python/tuple [La, N] -: 3.05293 -? !!python/tuple [La, O] -: 2.90983 -? !!python/tuple [La, P] -: 3.32293 -? !!python/tuple [La, S] -: 3.35593 -? !!python/tuple [La, Se] -: 3.45293 -? !!python/tuple [La, Te] -: 3.65293 -? !!python/tuple [Li, Br] -: 3.11654 -? !!python/tuple [Li, Cl] -: 2.91814 -? !!python/tuple [Li, F] -: 2.34276 -? !!python/tuple [Li, I] -: 3.37676 -? !!python/tuple [Li, N] -: 2.66213 -? !!python/tuple [Li, O] -: 2.60087 -? !!python/tuple [Li, S] -: 3.02481 -? !!python/tuple [Li, Se] -: 3.2433 -? !!python/tuple [Li, Te] -: 3.42496 -? !!python/tuple [Lu, As] -: 3.19649 -? !!python/tuple [Lu, Br] -: 3.11945 -? !!python/tuple [Lu, Cl] -: 2.96944 -? !!python/tuple [Lu, F] -: 2.48249 -? !!python/tuple [Lu, H] -: 2.42649 -? !!python/tuple [Lu, I] -: 3.36945 -? !!python/tuple [Lu, N] -: 2.71649 -? !!python/tuple [Lu, O] -: 2.57749 -? !!python/tuple [Lu, P] -: 3.11649 -? !!python/tuple [Lu, S] -: 3.03649 -? !!python/tuple [Lu, Se] -: 3.16649 -? !!python/tuple [Lu, Te] -: 3.35649 -? !!python/tuple [Mg, As] -: 3.09293 -? !!python/tuple [Mg, Br] -: 2.99293 -? !!python/tuple [Mg, Cl] -: 2.79293 -? !!python/tuple [Mg, F] -: 2.29093 -? !!python/tuple [Mg, H] -: 2.24293 -? !!python/tuple [Mg, I] -: 3.17293 -? !!python/tuple [Mg, N] -: 2.56293 -? !!python/tuple [Mg, O] -: 2.41824 -? !!python/tuple [Mg, P] -: 3.00293 -? !!python/tuple [Mg, S] -: 2.89293 -? !!python/tuple [Mg, Se] -: 3.03293 -? !!python/tuple [Mg, Te] -: 3.24293 -? !!python/tuple [Mn, As] -: 2.51642 -? !!python/tuple [Mn, Br] -: 3.05293 -? !!python/tuple [Mn, Cl] -: 2.84593 -? !!python/tuple [Mn, F] -: 2.41093 -? !!python/tuple [Mn, H] -: 1.70642 -? !!python/tuple [Mn, I] -: 3.23293 -? !!python/tuple [Mn, N] -: 2.56193 -? !!python/tuple [Mn, O] -: 2.51652 -? !!python/tuple [Mn, P] -: 2.39642 -? !!python/tuple [Mn, S] -: 2.93293 -? !!python/tuple [Mn, Se] -: 2.47642 -? !!python/tuple [Mn, Te] -: 2.70642 -? !!python/tuple [Mo, As] -: 2.62701 -? !!python/tuple [Mo, Br] -: 2.8535 -? !!python/tuple [Mo, Cl] -: 2.80447 -? !!python/tuple [Mo, F] -: 2.2998 -? !!python/tuple [Mo, H] -: 1.83701 -? !!python/tuple [Mo, I] -: 2.74701 -? !!python/tuple [Mo, N] -: 2.4735 -? !!python/tuple [Mo, O] -: 2.3475 -? !!python/tuple [Mo, P] -: 2.54701 -? !!python/tuple [Mo, S] -: 2.80067 -? !!python/tuple [Mo, Se] -: 2.59701 -? !!python/tuple [Mo, Te] -: 2.79701 -? !!python/tuple [N, Cl] -: 2.20646 -? !!python/tuple [N, F] -: 1.82646 -? !!python/tuple [N, N] -: 1.8826 -? !!python/tuple [N, O] -: 1.81746 -? !!python/tuple [NH, Cl] -: 3.48195 -? !!python/tuple [NH, F] -: 2.99195 -? !!python/tuple [NH, O] -: 3.08895 -? !!python/tuple [Na, As] -: 3.64942 -? !!python/tuple [Na, Br] -: 3.57715 -? !!python/tuple [Na, Cl] -: 3.39412 -? !!python/tuple [Na, F] -: 2.80398 -? !!python/tuple [Na, H] -: 2.79942 -? !!python/tuple [Na, I] -: 3.88251 -? !!python/tuple [Na, N] -: 3.12942 -? !!python/tuple [Na, O] -: 2.95693 -? !!python/tuple [Na, P] -: 3.47942 -? !!python/tuple [Na, S] -: 3.57685 -? !!python/tuple [Na, Se] -: 3.71593 -? !!python/tuple [Na, Te] -: 3.95459 -? !!python/tuple [Nb, As] -: 2.69642 -? !!python/tuple [Nb, Br] -: 3.07646 -? !!python/tuple [Nb, Cl] -: 2.76291 -? !!python/tuple [Nb, F] -: 2.35646 -? !!python/tuple [Nb, H] -: 1.90642 -? !!python/tuple [Nb, I] -: 3.1439 -? !!python/tuple [Nb, N] -: 2.46046 -? !!python/tuple [Nb, O] -: 2.45329 -? !!python/tuple [Nb, P] -: 2.61642 -? !!python/tuple [Nb, S] -: 2.74 -? !!python/tuple [Nb, Se] -: 2.66642 -? !!python/tuple [Nb, Te] -: 2.85642 -? !!python/tuple [Nd, Br] -: 3.37293 -? !!python/tuple [Nd, Cl] -: 3.22493 -? !!python/tuple [Nd, F] -: 2.73452 -? !!python/tuple [Nd, I] -: 3.59452 -? !!python/tuple [Nd, N] -: 3.01293 -? !!python/tuple [Nd, O] -: 2.8587 -? !!python/tuple [Nd, S] -: 3.42712 -? !!python/tuple [Nd, Se] -: 3.42293 -? !!python/tuple [Nd, Te] -: 3.60293 -? !!python/tuple [Ni, As] -: 2.28998 -? !!python/tuple [Ni, Br] -: 2.80649 -? !!python/tuple [Ni, Cl] -: 2.62649 -? !!python/tuple [Ni, F] -: 2.20249 -? !!python/tuple [Ni, H] -: 1.44998 -? !!python/tuple [Ni, I] -: 3.00649 -? !!python/tuple [Ni, N] -: 2.30649 -? !!python/tuple [Ni, O] -: 2.28149 -? !!python/tuple [Ni, P] -: 2.31998 -? !!python/tuple [Ni, S] -: 2.58649 -? !!python/tuple [Ni, Se] -: 2.18998 -? !!python/tuple [Ni, Te] -: 2.47998 -? !!python/tuple [Np, Br] -: 3.21233 -? !!python/tuple [Np, Cl] -: 3.07233 -? !!python/tuple [Np, F] -: 2.59233 -? !!python/tuple [Np, I] -: 3.44233 -? !!python/tuple [Np, O] -: 2.63646 -? !!python/tuple [Np, S] -: 3.2 -? !!python/tuple [O, D] -: 1.2 -? !!python/tuple [O, H] -: 1.2 -? !!python/tuple [O, O] -: 1.7 -? !!python/tuple [Os, Br] -: 2.72002 -? !!python/tuple [Os, Cl] -: 2.54002 -? !!python/tuple [Os, F] -: 2.07746 -? !!python/tuple [Os, O] -: 2.23 -? !!python/tuple [Os, S] -: 2.56002 -? !!python/tuple [P, As] -: 2.29998 -? !!python/tuple [P, Br] -: 2.44293 -? !!python/tuple [P, Cl] -: 2.28746 -? !!python/tuple [P, F] -: 2.01002 -? !!python/tuple [P, H] -: 1.45998 -? !!python/tuple [P, I] -: 2.44998 -? !!python/tuple [P, N] -: 1.97146 -? !!python/tuple [P, O] -: 2.08646 -? !!python/tuple [P, P] -: 2.48381 -? !!python/tuple [P, S] -: 2.57646 -? !!python/tuple [P, Se] -: 2.69646 -? !!python/tuple [Pa, Br] -: 3.18437 -? !!python/tuple [Pa, Cl] -: 3.01437 -? !!python/tuple [Pa, F] -: 2.54437 -? !!python/tuple [Pa, O] -: 2.63383 -? !!python/tuple [Pb, As] -: 3.02644 -? !!python/tuple [Pb, Br] -: 3.62451 -? !!python/tuple [Pb, Cl] -: 3.39295 -? !!python/tuple [Pb, F] -: 2.92045 -? !!python/tuple [Pb, H] -: 2.27644 -? !!python/tuple [Pb, I] -: 3.69562 -? !!python/tuple [Pb, N] -: 3.0967 -? !!python/tuple [Pb, O] -: 3.04096 -? !!python/tuple [Pb, P] -: 2.94644 -? !!python/tuple [Pb, S] -: 3.40395 -? !!python/tuple [Pb, Se] -: 3.55295 -? !!python/tuple [Pb, Te] -: 3.14644 -? !!python/tuple [Pd, As] -: 2.34998 -? !!python/tuple [Pd, Br] -: 2.80649 -? !!python/tuple [Pd, C] -: 2.33649 -? !!python/tuple [Pd, Cl] -: 2.65649 -? !!python/tuple [Pd, F] -: 2.34649 -? !!python/tuple [Pd, H] -: 1.51998 -? !!python/tuple [Pd, I] -: 2.96649 -? !!python/tuple [Pd, N] -: 2.40451 -? !!python/tuple [Pd, O] -: 2.39849 -? !!python/tuple [Pd, P] -: 2.46998 -? !!python/tuple [Pd, S] -: 2.69649 -? !!python/tuple [Pd, Se] -: 2.26998 -? !!python/tuple [Pd, Te] -: 2.52998 -? !!python/tuple [Pm, Br] -: 3.18233 -? !!python/tuple [Pm, Cl] -: 3.41233 -? !!python/tuple [Pm, F] -: 2.55233 -? !!python/tuple [Po, F] -: 2.83646 -? !!python/tuple [Po, O] -: 2.64646 -? !!python/tuple [Pr, As] -: 3.35649 -? !!python/tuple [Pr, Br] -: 3.27649 -? !!python/tuple [Pr, Cl] -: 3.12749 -? !!python/tuple [Pr, F] -: 2.62945 -? !!python/tuple [Pr, H] -: 2.62649 -? !!python/tuple [Pr, I] -: 3.49649 -? !!python/tuple [Pr, N] -: 2.90649 -? !!python/tuple [Pr, O] -: 2.74449 -? !!python/tuple [Pr, P] -: 3.28649 -? !!python/tuple [Pr, S] -: 3.20649 -? !!python/tuple [Pr, Se] -: 3.32649 -? !!python/tuple [Pr, Te] -: 3.50649 -? !!python/tuple [Pt, As] -: 2.30998 -? !!python/tuple [Pt, Br] -: 2.94191 -? !!python/tuple [Pt, C] -: 2.36649 -? !!python/tuple [Pt, Cl] -: 2.75646 -? !!python/tuple [Pt, F] -: 2.54002 -? !!python/tuple [Pt, H] -: 1.44998 -? !!python/tuple [Pt, I] -: 2.41998 -? !!python/tuple [Pt, N] -: 2.41649 -? !!python/tuple [Pt, O] -: 2.40649 -? !!python/tuple [Pt, P] -: 2.23998 -? !!python/tuple [Pt, S] -: 2.76649 -? !!python/tuple [Pt, Se] -: 2.23998 -? !!python/tuple [Pt, Te] -: 2.49998 -? !!python/tuple [Pu, Br] -: 3.19233 -? !!python/tuple [Pu, Cl] -: 3.05233 -? !!python/tuple [Pu, F] -: 2.58233 -? !!python/tuple [Pu, I] -: 3.43233 -? !!python/tuple [Pu, O] -: 2.68329 -? !!python/tuple [Pu, S] -: 3.3 -? !!python/tuple [Rb, As] -: 4.04645 -? !!python/tuple [Rb, Br] -: 4.05498 -? !!python/tuple [Rb, Cl] -: 3.86664 -? !!python/tuple [Rb, F] -: 3.37645 -? !!python/tuple [Rb, H] -: 3.43645 -? !!python/tuple [Rb, I] -: 4.33462 -? !!python/tuple [Rb, N] -: 3.79645 -? !!python/tuple [Rb, O] -: 3.43945 -? !!python/tuple [Rb, P] -: 3.50645 -? !!python/tuple [Rb, S] -: 3.97645 -? !!python/tuple [Rb, Se] -: 4.13773 -? !!python/tuple [Rb, Te] -: 4.28802 -? !!python/tuple [Re, As] -: 2.61998 -? !!python/tuple [Re, Br] -: 2.70002 -? !!python/tuple [Re, Cl] -: 3.44712 -? !!python/tuple [Re, F] -: 2.16002 -? !!python/tuple [Re, H] -: 1.79998 -? !!python/tuple [Re, I] -: 2.65998 -? !!python/tuple [Re, N] -: 2.10998 -? !!python/tuple [Re, O] -: 2.3426 -? !!python/tuple [Re, P] -: 2.50998 -? !!python/tuple [Re, S] -: 2.61998 -? !!python/tuple [Re, Se] -: 2.54998 -? !!python/tuple [Re, Te] -: 2.74998 -? !!python/tuple [Rh, As] -: 2.41998 -? !!python/tuple [Rh, Br] -: 2.7126 -? !!python/tuple [Rh, Cl] -: 2.62646 -? !!python/tuple [Rh, F] -: 2.16646 -? !!python/tuple [Rh, H] -: 1.59998 -? !!python/tuple [Rh, I] -: 2.52998 -? !!python/tuple [Rh, N] -: 2.2626 -? !!python/tuple [Rh, O] -: 2.24946 -? !!python/tuple [Rh, P] -: 2.43998 -? !!python/tuple [Rh, S] -: 2.19998 -? !!python/tuple [Rh, Se] -: 2.37998 -? !!python/tuple [Rh, Te] -: 2.59998 -? !!python/tuple [Ru, As] -: 2.40998 -? !!python/tuple [Ru, Br] -: 2.30998 -? !!python/tuple [Ru, Cl] -: 2.70646 -? !!python/tuple [Ru, F] -: 2.57646 -? !!python/tuple [Ru, H] -: 1.65998 -? !!python/tuple [Ru, I] -: 2.52998 -? !!python/tuple [Ru, N] -: 2.2626 -? !!python/tuple [Ru, O] -: 2.22646 -? !!python/tuple [Ru, P] -: 2.33998 -? !!python/tuple [Ru, S] -: 2.6426 -? !!python/tuple [Ru, Se] -: 2.69451 -? !!python/tuple [Ru, Te] -: 2.58998 -? !!python/tuple [S, Br] -: 2.21998 -? !!python/tuple [S, Cl] -: 2.37002 -? !!python/tuple [S, F] -: 1.95002 -? !!python/tuple [S, H] -: 1.42998 -? !!python/tuple [S, I] -: 2.40998 -? !!python/tuple [S, N] -: 2.28849 -? !!python/tuple [S, O] -: 1.8 -? !!python/tuple [S, S] -: 2.2 -? !!python/tuple [Sb, As] -: 2.64998 -? !!python/tuple [Sb, Br] -: 2.96646 -? !!python/tuple [Sb, Cl] -: 2.80646 -? !!python/tuple [Sb, F] -: 2.35646 -? !!python/tuple [Sb, H] -: 2.81998 -? !!python/tuple [Sb, I] -: 3.21646 -? !!python/tuple [Sb, N] -: 2.56446 -? !!python/tuple [Sb, O] -: 2.45237 -? !!python/tuple [Sb, P] -: 2.56998 -? !!python/tuple [Sb, S] -: 3.05 -? !!python/tuple [Sb, Se] -: 3.05646 -? !!python/tuple [Sb, Te] -: 2.82998 -? !!python/tuple [Sc, As] -: 3.04291 -? !!python/tuple [Sc, Br] -: 2.94291 -? !!python/tuple [Sc, Cl] -: 2.92291 -? !!python/tuple [Sc, F] -: 2.32291 -? !!python/tuple [Sc, H] -: 2.24291 -? !!python/tuple [Sc, I] -: 3.15291 -? !!python/tuple [Sc, N] -: 2.54291 -? !!python/tuple [Sc, O] -: 2.42029 -? !!python/tuple [Sc, P] -: 2.96291 -? !!python/tuple [Sc, S] -: 2.88391 -? !!python/tuple [Sc, Se] -: 3.00291 -? !!python/tuple [Sc, Te] -: 3.20291 -? !!python/tuple [Se, Br] -: 2.78002 -? !!python/tuple [Se, Cl] -: 2.57002 -? !!python/tuple [Se, F] -: 2.08002 -? !!python/tuple [Se, H] -: 1.58998 -? !!python/tuple [Se, I] -: 2.58998 -? !!python/tuple [Se, N] -: 2.1 -? !!python/tuple [Se, O] -: 2.16102 -? !!python/tuple [Se, S] -: 2.81649 -? !!python/tuple [Se, Se] -: 2.93649 -? !!python/tuple [Si, As] -: 2.66002 -? !!python/tuple [Si, Br] -: 2.55002 -? !!python/tuple [Si, C] -: 2.23302 -? !!python/tuple [Si, Cl] -: 2.38002 -? !!python/tuple [Si, F] -: 1.93002 -? !!python/tuple [Si, H] -: 1.82002 -? !!python/tuple [Si, I] -: 2.76002 -? !!python/tuple [Si, N] -: 2.12002 -? !!python/tuple [Si, O] -: 1.99002 -? !!python/tuple [Si, P] -: 2.58002 -? !!python/tuple [Si, S] -: 2.47602 -? !!python/tuple [Si, Se] -: 2.61002 -? !!python/tuple [Si, Si] -: 2.6 -? !!python/tuple [Si, Te] -: 2.84002 -? !!python/tuple [Sm, As] -: 3.30649 -? !!python/tuple [Sm, Br] -: 3.26649 -? !!python/tuple [Sm, Cl] -: 3.08749 -? !!python/tuple [Sm, F] -: 2.60649 -? !!python/tuple [Sm, H] -: 2.56649 -? !!python/tuple [Sm, I] -: 3.44649 -? !!python/tuple [Sm, N] -: 3.02351 -? !!python/tuple [Sm, O] -: 2.88251 -? !!python/tuple [Sm, P] -: 3.23649 -? !!python/tuple [Sm, S] -: 3.15649 -? !!python/tuple [Sm, Se] -: 3.27649 -? !!python/tuple [Sm, Te] -: 3.46649 -? !!python/tuple [Sn, As] -: 2.77642 -? !!python/tuple [Sn, Br] -: 3.2152 -? !!python/tuple [Sn, Cl] -: 3.13111 -? !!python/tuple [Sn, F] -: 2.63793 -? !!python/tuple [Sn, H] -: 2.00642 -? !!python/tuple [Sn, I] -: 3.52293 -? !!python/tuple [Sn, N] -: 2.7152 -? !!python/tuple [Sn, O] -: 2.82146 -? !!python/tuple [Sn, P] -: 2.60642 -? !!python/tuple [Sn, S] -: 3.15293 -? !!python/tuple [Sn, Se] -: 2.96646 -? !!python/tuple [Sn, Te] -: 2.91642 -? !!python/tuple [Sr, As] -: 3.62295 -? !!python/tuple [Sr, Br] -: 3.54295 -? !!python/tuple [Sr, Cl] -: 3.37295 -? !!python/tuple [Sr, F] -: 2.88195 -? !!python/tuple [Sr, H] -: 2.87295 -? !!python/tuple [Sr, I] -: 3.74295 -? !!python/tuple [Sr, N] -: 3.09295 -? !!python/tuple [Sr, O] -: 2.98095 -? !!python/tuple [Sr, P] -: 3.43295 -? !!python/tuple [Sr, S] -: 3.51295 -? !!python/tuple [Sr, Se] -: 3.58295 -? !!python/tuple [Sr, Te] -: 3.73295 -? !!python/tuple [Ta, As] -: 2.70642 -? !!python/tuple [Ta, Br] -: 2.60642 -? !!python/tuple [Ta, Cl] -: 2.6739 -? !!python/tuple [Ta, F] -: 2.2539 -? !!python/tuple [Ta, H] -: 1.91642 -? !!python/tuple [Ta, I] -: 2.81642 -? !!python/tuple [Ta, N] -: 2.16642 -? !!python/tuple [Ta, O] -: 2.74646 -? !!python/tuple [Ta, P] -: 2.62642 -? !!python/tuple [Ta, S] -: 2.8439 -? !!python/tuple [Ta, Se] -: 2.66642 -? !!python/tuple [Ta, Te] -: 2.85642 -? !!python/tuple [Tb, As] -: 3.26649 -? !!python/tuple [Tb, Br] -: 3.18649 -? !!python/tuple [Tb, Cl] -: 3.04349 -? !!python/tuple [Tb, F] -: 2.54249 -? !!python/tuple [Tb, H] -: 2.51649 -? !!python/tuple [Tb, I] -: 3.40945 -? !!python/tuple [Tb, N] -: 2.80649 -? !!python/tuple [Tb, O] -: 2.65549 -? !!python/tuple [Tb, P] -: 3.19649 -? !!python/tuple [Tb, S] -: 3.11649 -? !!python/tuple [Tb, Se] -: 3.23649 -? !!python/tuple [Tb, Te] -: 3.42649 -? !!python/tuple [Tc, Cl] -: 2.56002 -? !!python/tuple [Tc, F] -: 2.24219 -? !!python/tuple [Tc, O] -: 2.22446 -? !!python/tuple [Te, Br] -: 2.90002 -? !!python/tuple [Te, Cl] -: 2.73906 -? !!python/tuple [Te, F] -: 2.22002 -? !!python/tuple [Te, H] -: 1.87998 -? !!python/tuple [Te, I] -: 3.13702 -? !!python/tuple [Te, N] -: 2.16998 -? !!python/tuple [Te, O] -: 2.3334 -? !!python/tuple [Te, P] -: 2.56998 -? !!python/tuple [Te, S] -: 2.79002 -? !!python/tuple [Te, Se] -: 2.57998 -? !!python/tuple [Te, Te] -: 2.80998 -? !!python/tuple [Th, As] -: 3.40649 -? !!python/tuple [Th, Br] -: 3.31945 -? !!python/tuple [Th, Cl] -: 3.15945 -? !!python/tuple [Th, F] -: 2.68945 -? !!python/tuple [Th, H] -: 2.67649 -? !!python/tuple [Th, I] -: 3.56649 -? !!python/tuple [Th, N] -: 2.94649 -? !!python/tuple [Th, O] -: 2.77349 -? !!python/tuple [Th, P] -: 3.33649 -? !!python/tuple [Th, S] -: 3.24649 -? !!python/tuple [Th, Se] -: 3.36649 -? !!python/tuple [Th, Te] -: 3.54649 -? !!python/tuple [Ti, As] -: 2.87642 -? !!python/tuple [Ti, Br] -: 3.20293 -? !!python/tuple [Ti, Cl] -: 3.02293 -? !!python/tuple [Ti, F] -: 2.86293 -? !!python/tuple [Ti, H] -: 1.76642 -? !!python/tuple [Ti, I] -: 3.08291 -? !!python/tuple [Ti, N] -: 2.08642 -? !!python/tuple [Ti, O] -: 2.35391 -? !!python/tuple [Ti, P] -: 2.51642 -? !!python/tuple [Ti, S] -: 2.74646 -? !!python/tuple [Ti, Se] -: 2.53642 -? !!python/tuple [Ti, Te] -: 2.95642 -? !!python/tuple [Tl, As] -: 3.09644 -? !!python/tuple [Tl, Br] -: 3.80942 -? !!python/tuple [Tl, Cl] -: 3.72942 -? !!python/tuple [Tl, F] -: 3.26942 -? !!python/tuple [Tl, H] -: 2.35644 -? !!python/tuple [Tl, I] -: 3.94142 -? !!python/tuple [Tl, N] -: 2.59644 -? !!python/tuple [Tl, O] -: 3.36945 -? !!python/tuple [Tl, P] -: 3.01644 -? !!python/tuple [Tl, S] -: 3.66442 -? !!python/tuple [Tl, Se] -: 3.00644 -? !!python/tuple [Tl, Te] -: 3.23644 -? !!python/tuple [Tm, As] -: 3.22649 -? !!python/tuple [Tm, Br] -: 3.13945 -? !!python/tuple [Tm, Cl] -: 2.98944 -? !!python/tuple [Tm, F] -: 2.51649 -? !!python/tuple [Tm, H] -: 2.45649 -? !!python/tuple [Tm, I] -: 3.37945 -? !!python/tuple [Tm, N] -: 2.74649 -? !!python/tuple [Tm, O] -: 2.60649 -? !!python/tuple [Tm, P] -: 3.13649 -? !!python/tuple [Tm, S] -: 3.05649 -? !!python/tuple [Tm, Se] -: 3.18649 -? !!python/tuple [Tm, Te] -: 3.37649 -? !!python/tuple [U, As] -: 3.02644 -? !!python/tuple [U, Br] -: 3.39452 -? !!python/tuple [U, Cl] -: 3.24452 -? !!python/tuple [U, F] -: 2.80293 -? !!python/tuple [U, H] -: 2.27644 -? !!python/tuple [U, I] -: 3.62452 -? !!python/tuple [U, N] -: 2.78649 -? !!python/tuple [U, O] -: 2.94295 -? !!python/tuple [U, P] -: 2.94644 -? !!python/tuple [U, S] -: 3.25293 -? !!python/tuple [U, Se] -: 3.00644 -? !!python/tuple [U, Te] -: 3.16644 -? !!python/tuple [V, As] -: 2.54642 -? !!python/tuple [V, Br] -: 2.87329 -? !!python/tuple [V, Cl] -: 3.15293 -? !!python/tuple [V, F] -: 2.87293 -? !!python/tuple [V, H] -: 1.73642 -? !!python/tuple [V, I] -: 2.66642 -? !!python/tuple [V, N] -: 2.38329 -? !!python/tuple [V, O] -: 2.84939 -? !!python/tuple [V, P] -: 2.46642 -? !!python/tuple [V, S] -: 2.82293 -? !!python/tuple [V, Se] -: 2.48642 -? !!python/tuple [V, Te] -: 2.72642 -? !!python/tuple [W, As] -: 2.58998 -? !!python/tuple [W, Br] -: 2.49998 -? !!python/tuple [W, Cl] -: 2.47 -? !!python/tuple [W, F] -: 2.03 -? !!python/tuple [W, H] -: 1.80998 -? !!python/tuple [W, I] -: 2.70998 -? !!python/tuple [W, N] -: 2.10998 -? !!python/tuple [W, O] -: 2.20102 -? !!python/tuple [W, P] -: 2.50998 -? !!python/tuple [W, S] -: 2.43998 -? !!python/tuple [W, Se] -: 2.55998 -? !!python/tuple [W, Te] -: 2.75998 -? !!python/tuple [Xe, F] -: 2.62649 -? !!python/tuple [Xe, O] -: 2.63451 -? !!python/tuple [Y, As] -: 3.24649 -? !!python/tuple [Y, Br] -: 3.15649 -? !!python/tuple [Y, Cl] -: 3.00649 -? !!python/tuple [Y, F] -: 2.51049 -? !!python/tuple [Y, H] -: 2.46649 -? !!python/tuple [Y, I] -: 3.37649 -? !!python/tuple [Y, N] -: 2.77649 -? !!python/tuple [Y, O] -: 2.62549 -? !!python/tuple [Y, P] -: 3.17649 -? !!python/tuple [Y, S] -: 3.08649 -? !!python/tuple [Y, Se] -: 3.21649 -? !!python/tuple [Y, Te] -: 3.40649 -? !!python/tuple [Yb, As] -: 3.19649 -? !!python/tuple [Yb, Br] -: 3.12945 -? !!python/tuple [Yb, Cl] -: 2.98249 -? !!python/tuple [Yb, F] -: 2.50649 -? !!python/tuple [Yb, H] -: 2.42649 -? !!python/tuple [Yb, I] -: 3.37945 -? !!python/tuple [Yb, N] -: 2.84851 -? !!python/tuple [Yb, O] -: 2.74551 -? !!python/tuple [Yb, P] -: 3.13649 -? !!python/tuple [Yb, S] -: 3.03649 -? !!python/tuple [Yb, Se] -: 3.16649 -? !!python/tuple [Yb, Te] -: 3.36649 -? !!python/tuple [Zn, As] -: 2.95293 -? !!python/tuple [Zn, Br] -: 2.86293 -? !!python/tuple [Zn, Cl] -: 2.72293 -? !!python/tuple [Zn, F] -: 2.38293 -? !!python/tuple [Zn, H] -: 2.13293 -? !!python/tuple [Zn, I] -: 3.07293 -? !!python/tuple [Zn, N] -: 2.43293 -? !!python/tuple [Zn, O] -: 2.41693 -? !!python/tuple [Zn, P] -: 2.86293 -? !!python/tuple [Zn, S] -: 2.80293 -? !!python/tuple [Zn, Se] -: 2.93293 -? !!python/tuple [Zn, Te] -: 3.16293 -? !!python/tuple [Zr, As] -: 3.07004 -? !!python/tuple [Zr, Br] -: 2.98004 -? !!python/tuple [Zr, Cl] -: 3.33651 -? !!python/tuple [Zr, F] -: 2.99651 -? !!python/tuple [Zr, H] -: 2.29004 -? !!python/tuple [Zr, I] -: 3.19004 -? !!python/tuple [Zr, N] -: 2.65004 -? !!python/tuple [Zr, O] -: 3.09651 -? !!python/tuple [Zr, P] -: 3.02004 -? !!python/tuple [Zr, S] -: 2.91004 -? !!python/tuple [Zr, Se] -: 3.03004 -? !!python/tuple [Zr, Te] -: 3.17004 +[Ac, Br]: 3.22726 +[Ac, Cl]: 3.08646 +[Ac, F]: 2.58646 +[Ac, O]: 2.7326 +[Ag, As]: 2.45642 +[Ag, Br]: 2.37642 +[Ag, Cl]: 3.05939 +[Ag, F]: 2.76939 +[Ag, H]: 1.65642 +[Ag, I]: 2.53642 +[Ag, N]: 2.00642 +[Ag, O]: 2.81139 +[Ag, P]: 2.37642 +[Ag, S]: 3.08839 +[Ag, Se]: 2.41642 +[Ag, Te]: 2.66642 +[Al, As]: 2.75646 +[Al, Br]: 2.65646 +[Al, Cl]: 2.48846 +[Al, F]: 2.00146 +[Al, H]: 1.90646 +[Al, I]: 2.86646 +[Al, N]: 2.24646 +[Al, O]: 2.1074 +[Al, P]: 2.69646 +[Al, S]: 2.66646 +[Al, Se]: 2.72646 +[Al, Te]: 2.93646 +[Am, Br]: 3.22944 +[Am, Cl]: 3.08945 +[Am, F]: 2.61945 +[Am, O]: 2.71649 +[As, Br]: 2.80646 +[As, C]: 2.38646 +[As, Cl]: 2.61646 +[As, F]: 2.15646 +[As, I]: 3.03646 +[As, O]: 2.24546 +[As, S]: 2.84649 +[As, Se]: 2.98649 +[As, Te]: 3.10646 +[Au, As]: 2.26998 +[Au, Br]: 2.77646 +[Au, Cl]: 2.88295 +[Au, F]: 2.34646 +[Au, H]: 1.41998 +[Au, I]: 3.21295 +[Au, N]: 2.3826 +[Au, O]: 2.34646 +[Au, P]: 2.18998 +[Au, S]: 2.8326 +[Au, Se]: 2.22998 +[Au, Te]: 2.45998 +[B, As]: 2.42646 +[B, B]: 1.85846 +[B, Br]: 2.33646 +[B, Cl]: 2.19646 +[B, F]: 1.76646 +[B, H]: 1.59646 +[B, I]: 2.55646 +[B, N]: 1.93846 +[B, O]: 1.82746 +[B, P]: 2.37646 +[B, S]: 2.27646 +[B, Se]: 2.40646 +[B, Te]: 2.65646 +[Ba, As]: 3.69 +[Ba, Br]: 3.74295 +[Ba, Cl]: 3.55295 +[Ba, F]: 3.05095 +[Ba, H]: 3.08295 +[Ba, I]: 3.99295 +[Ba, N]: 3.33295 +[Ba, O]: 3.14795 +[Ba, P]: 3.48295 +[Ba, S]: 3.66195 +[Ba, Se]: 3.74295 +[Ba, Te]: 3.94295 +[Be, As]: 2.60649 +[Be, Br]: 2.50649 +[Be, Cl]: 2.36649 +[Be, F]: 1.88749 +[Be, H]: 1.71649 +[Be, I]: 2.70649 +[Be, N]: 2.10649 +[Be, O]: 1.98749 +[Be, P]: 2.55649 +[Be, S]: 2.43649 +[Be, Se]: 2.57649 +[Be, Te]: 2.81649 +[Bi, As]: 2.87642 +[Bi, Br]: 3.17993 +[Bi, Cl]: 3.04291 +[Bi, F]: 2.55291 +[Bi, H]: 2.12642 +[Bi, I]: 3.38291 +[Bi, N]: 2.56329 +[Bi, O]: 2.6608 +[Bi, P]: 2.78642 +[Bi, S]: 3.13291 +[Bi, Se]: 3.24329 +[Bi, Te]: 3.02642 +[Bk, Br]: 3.15233 +[Bk, Cl]: 3.02291 +[Bk, F]: 2.54233 +[Bk, O]: 2.64329 +[Br, Cl]: 2.33296 +[Br, F]: 2.20646 +[Br, O]: 2.35646 +[C, Br]: 2.26002 +[C, C]: 1.89002 +[C, Cl]: 2.11002 +[C, F]: 1.76002 +[C, H]: 1.2 +[C, I]: 2.16998 +[C, N]: 1.79202 +[C, O]: 1.97249 +[C, P]: 1.93998 +[C, S]: 2.15002 +[C, Se]: 2.01998 +[C, Te]: 2.25998 +[Ca, As]: 3.48295 +[Ca, Br]: 3.36995 +[Ca, Cl]: 3.23295 +[Ca, F]: 2.70495 +[Ca, H]: 2.69295 +[Ca, I]: 3.58295 +[Ca, N]: 3.00295 +[Ca, O]: 2.83062 +[Ca, P]: 3.41295 +[Ca, S]: 3.31295 +[Ca, Se]: 3.42295 +[Ca, Te]: 3.62295 +[Cd, As]: 3.29295 +[Cd, Br]: 3.21295 +[Cd, Cl]: 3.09295 +[Cd, F]: 2.67395 +[Cd, H]: 2.52295 +[Cd, I]: 3.46295 +[Cd, N]: 2.82295 +[Cd, O]: 2.76695 +[Cd, P]: 3.20295 +[Cd, S]: 3.16695 +[Cd, Se]: 3.26295 +[Cd, Te]: 3.45295 +[Ce, As]: 3.08644 +[Ce, Br]: 3.40452 +[Ce, Cl]: 3.25293 +[Ce, F]: 2.75452 +[Ce, H]: 2.34644 +[Ce, I]: 3.62452 +[Ce, N]: 2.78549 +[Ce, O]: 2.86393 +[Ce, P]: 3.00644 +[Ce, S]: 3.36293 +[Ce, Se]: 3.04644 +[Ce, Te]: 3.22644 +[Cf, Br]: 3.14233 +[Cf, Cl]: 3.01291 +[Cf, F]: 2.53233 +[Cf, O]: 2.63291 +[Cl, Cl]: 2.14296 +[Cl, F]: 2.14646 +[Cl, O]: 2.16646 +[Cm, Cl]: 3.18291 +[Cm, F]: 2.68291 +[Cm, O]: 2.79291 +[Co, As]: 2.43642 +[Co, Br]: 2.33642 +[Co, C]: 2.19691 +[Co, Cl]: 2.74593 +[Co, F]: 2.35293 +[Co, H]: 1.9278 +[Co, I]: 2.52878 +[Co, N]: 2.36293 +[Co, O]: 2.40493 +[Co, P]: 2.36642 +[Co, S]: 2.65293 +[Co, Se]: 2.39642 +[Co, Te]: 2.61642 +[Cr, As]: 2.49642 +[Cr, Br]: 2.97293 +[Cr, Cl]: 2.80293 +[Cr, F]: 2.45293 +[Cr, H]: 1.67642 +[Cr, I]: 3.19293 +[Cr, N]: 2.5152 +[Cr, O]: 2.44293 +[Cr, P]: 2.42642 +[Cr, S]: 2.72491 +[Cr, Se]: 2.44642 +[Cr, Te]: 2.67642 +[Cs, As]: 4.15942 +[Cs, Br]: 4.06942 +[Cs, Cl]: 3.91042 +[Cs, F]: 3.49942 +[Cs, H]: 3.55942 +[Cs, I]: 4.40942 +[Cs, N]: 3.94942 +[Cs, O]: 3.53642 +[Cs, P]: 3.64194 +[Cs, S]: 4.24942 +[Cs, Se]: 4.21655 +[Cs, Te]: 4.4631 +[Cu, As]: 2.71895 +[Cu, Br]: 2.89295 +[Cu, C]: 2.32649 +[Cu, Cl]: 2.75295 +[Cu, F]: 2.46295 +[Cu, H]: 1.81649 +[Cu, I]: 3.01795 +[Cu, N]: 2.49295 +[Cu, O]: 2.47295 +[Cu, P]: 2.65649 +[Cu, S]: 2.76095 +[Cu, Se]: 2.76295 +[Cu, Te]: 2.87649 +[D, Cl]: 1.5 +[D, F]: 1.1 +[D, N]: 1.2 +[D, O]: 2.1 +[Dy, As]: 3.14 +[Dy, Br]: 3.16945 +[Dy, Cl]: 3.01945 +[Dy, F]: 2.52944 +[Dy, H]: 2.09 +[Dy, I]: 3.39945 +[Dy, N]: 2.38 +[Dy, O]: 2.65651 +[Dy, P]: 2.77 +[Dy, S]: 2.823 +[Dy, Se]: 2.81 +[Dy, Te]: 3.22 +[Er, As]: 3.18 +[Er, Br]: 3.14945 +[Er, Cl]: 2.99944 +[Er, F]: 2.51049 +[Er, H]: 2.06 +[Er, I]: 3.38945 +[Er, N]: 2.36 +[Er, O]: 2.63651 +[Er, P]: 2.75 +[Er, S]: 3.27651 +[Er, Se]: 3.18649 +[Er, Te]: 3.22 +[Es, O]: 2.70139 +[Eu, As]: 2.93898 +[Eu, Br]: 3.46549 +[Eu, Cl]: 3.32549 +[Eu, F]: 2.83549 +[Eu, H]: 2.18898 +[Eu, I]: 3.69549 +[Eu, N]: 2.95549 +[Eu, O]: 2.94249 +[Eu, P]: 2.85898 +[Eu, S]: 3.37949 +[Eu, Se]: 2.89898 +[Eu, Te]: 3.08898 +[Fe, As]: 2.50642 +[Fe, Br]: 2.8952 +[Fe, C]: 2.25191 +[Fe, Cl]: 2.86293 +[Fe, F]: 2.36293 +[Fe, H]: 1.68642 +[Fe, I]: 3.1552 +[Fe, N]: 2.48193 +[Fe, O]: 2.44693 +[Fe, P]: 2.42642 +[Fe, S]: 2.83793 +[Fe, Se]: 2.43642 +[Fe, Te]: 2.68642 +[Ga, As]: 2.38998 +[Ga, Br]: 2.6426 +[Ga, Cl]: 2.52646 +[Ga, F]: 2.14646 +[Ga, H]: 1.55998 +[Ga, I]: 2.91646 +[Ga, N]: 1.96 +[Ga, O]: 2.18646 +[Ga, P]: 2.46998 +[Ga, S]: 2.61946 +[Ga, Se]: 3.41295 +[Ga, Te]: 2.58998 +[Gd, As]: 3.18 +[Gd, Br]: 3.19945 +[Gd, Cl]: 3.06349 +[Gd, F]: 3.15651 +[Gd, H]: 2.13 +[Gd, I]: 3.41945 +[Gd, N]: 2.42 +[Gd, O]: 2.76651 +[Gd, P]: 2.81 +[Gd, S]: 3.13649 +[Gd, Se]: 2.85 +[Gd, Te]: 3.24 +[Ge, As]: 2.47998 +[Ge, Br]: 2.34998 +[Ge, Cl]: 2.49002 +[Ge, F]: 2.01002 +[Ge, Ge]: 2.6 +[Ge, H]: 1.59998 +[Ge, I]: 2.54998 +[Ge, N]: 1.92998 +[Ge, O]: 2.09802 +[Ge, P]: 2.36998 +[Ge, S]: 2.56702 +[Ge, Se]: 2.70002 +[Ge, Te]: 2.60998 +[H, Cl]: 1.5 +[H, F]: 1.1 +[H, N]: 1.2 +[H, O]: 2.1 +[Hf, As]: 2.71642 +[Hf, Br]: 2.62642 +[Hf, Cl]: 2.75646 +[Hf, F]: 3.18291 +[Hf, H]: 1.93642 +[Hf, I]: 2.83642 +[Hf, N]: 2.24642 +[Hf, O]: 2.37946 +[Hf, P]: 2.63642 +[Hf, S]: 2.64642 +[Hf, Se]: 2.67642 +[Hf, Te]: 2.87642 +[Hg, As]: 2.65642 +[Hg, Br]: 3.09293 +[Hg, Cl]: 3.24939 +[Hg, F]: 2.88293 +[Hg, H]: 1.86642 +[Hg, Hg]: 3.1952 +[Hg, I]: 3.33293 +[Hg, N]: 2.17642 +[Hg, O]: 2.86939 +[Hg, P]: 2.57642 +[Hg, S]: 3.42093 +[Hg, Se]: 2.82642 +[Hg, Te]: 2.76642 +[Ho, As]: 2.87898 +[Ho, Br]: 3.20159 +[Ho, Cl]: 3.05159 +[Ho, F]: 2.56159 +[Ho, H]: 2.11898 +[Ho, I]: 3.44159 +[Ho, N]: 2.41898 +[Ho, O]: 2.67047 +[Ho, P]: 2.79898 +[Ho, S]: 3.13547 +[Ho, Se]: 2.84898 +[Ho, Te]: 3.03898 +[I, Cl]: 3.33295 +[I, F]: 3.18295 +[I, I]: 2.4 +[I, O]: 2.47646 +[In, As]: 2.66642 +[In, Br]: 3.05329 +[In, Cl]: 3.52939 +[In, Co]: 3.13629 +[In, F]: 2.35491 +[In, H]: 1.87642 +[In, I]: 3.19291 +[In, Mn]: 3.14729 +[In, N]: 2.18642 +[In, O]: 2.46491 +[In, P]: 2.68642 +[In, S]: 2.93291 +[In, Se]: 2.62642 +[In, Te]: 2.84642 +[Ir, As]: 2.58998 +[Ir, Br]: 2.49998 +[Ir, Cl]: 2.56746 +[Ir, F]: 2.15002 +[Ir, H]: 1.80998 +[Ir, I]: 2.70998 +[Ir, N]: 2.10998 +[Ir, O]: 2.27746 +[Ir, P]: 2.50998 +[Ir, S]: 2.42998 +[Ir, Se]: 2.55998 +[Ir, Te]: 2.75998 +[K, As]: 3.94942 +[K, Br]: 3.8513 +[K, Cl]: 3.65976 +[K, F]: 3.11142 +[K, H]: 3.21942 +[K, I]: 4.11717 +[K, N]: 3.41942 +[K, O]: 3.25142 +[K, P]: 3.44942 +[K, S]: 3.79285 +[K, Se]: 4.00186 +[K, Te]: 4.23284 +[Kr, F]: 2.67549 +[La, As]: 3.51293 +[La, Br]: 3.43293 +[La, Cl]: 3.33452 +[La, F]: 2.79293 +[La, H]: 2.77293 +[La, I]: 3.64293 +[La, N]: 3.05293 +[La, O]: 2.90983 +[La, P]: 3.32293 +[La, S]: 3.35593 +[La, Se]: 3.45293 +[La, Te]: 3.65293 +[Li, Br]: 3.11654 +[Li, Cl]: 2.91814 +[Li, F]: 2.34276 +[Li, I]: 3.37676 +[Li, N]: 2.66213 +[Li, O]: 2.60087 +[Li, S]: 3.02481 +[Li, Se]: 3.2433 +[Li, Te]: 3.42496 +[Lu, As]: 3.19649 +[Lu, Br]: 3.11945 +[Lu, Cl]: 2.96944 +[Lu, F]: 2.48249 +[Lu, H]: 2.42649 +[Lu, I]: 3.36945 +[Lu, N]: 2.71649 +[Lu, O]: 2.57749 +[Lu, P]: 3.11649 +[Lu, S]: 3.03649 +[Lu, Se]: 3.16649 +[Lu, Te]: 3.35649 +[Mg, As]: 3.09293 +[Mg, Br]: 2.99293 +[Mg, Cl]: 2.79293 +[Mg, F]: 2.29093 +[Mg, H]: 2.24293 +[Mg, I]: 3.17293 +[Mg, N]: 2.56293 +[Mg, O]: 2.41824 +[Mg, P]: 3.00293 +[Mg, S]: 2.89293 +[Mg, Se]: 3.03293 +[Mg, Te]: 3.24293 +[Mn, As]: 2.51642 +[Mn, Br]: 3.05293 +[Mn, Cl]: 2.84593 +[Mn, F]: 2.41093 +[Mn, H]: 1.70642 +[Mn, I]: 3.23293 +[Mn, N]: 2.56193 +[Mn, O]: 2.51652 +[Mn, P]: 2.39642 +[Mn, S]: 2.93293 +[Mn, Se]: 2.47642 +[Mn, Te]: 2.70642 +[Mo, As]: 2.62701 +[Mo, Br]: 2.8535 +[Mo, Cl]: 2.80447 +[Mo, F]: 2.2998 +[Mo, H]: 1.83701 +[Mo, I]: 2.74701 +[Mo, N]: 2.4735 +[Mo, O]: 2.3475 +[Mo, P]: 2.54701 +[Mo, S]: 2.80067 +[Mo, Se]: 2.59701 +[Mo, Te]: 2.79701 +[N, Cl]: 2.20646 +[N, F]: 1.82646 +[N, N]: 1.8826 +[N, O]: 1.81746 +[NH, Cl]: 3.48195 +[NH, F]: 2.99195 +[NH, O]: 3.08895 +[Na, As]: 3.64942 +[Na, Br]: 3.57715 +[Na, Cl]: 3.39412 +[Na, F]: 2.80398 +[Na, H]: 2.79942 +[Na, I]: 3.88251 +[Na, N]: 3.12942 +[Na, O]: 2.95693 +[Na, P]: 3.47942 +[Na, S]: 3.57685 +[Na, Se]: 3.71593 +[Na, Te]: 3.95459 +[Nb, As]: 2.69642 +[Nb, Br]: 3.07646 +[Nb, Cl]: 2.76291 +[Nb, F]: 2.35646 +[Nb, H]: 1.90642 +[Nb, I]: 3.1439 +[Nb, N]: 2.46046 +[Nb, O]: 2.45329 +[Nb, P]: 2.61642 +[Nb, S]: 2.74 +[Nb, Se]: 2.66642 +[Nb, Te]: 2.85642 +[Nd, Br]: 3.37293 +[Nd, Cl]: 3.22493 +[Nd, F]: 2.73452 +[Nd, I]: 3.59452 +[Nd, N]: 3.01293 +[Nd, O]: 2.8587 +[Nd, S]: 3.42712 +[Nd, Se]: 3.42293 +[Nd, Te]: 3.60293 +[Ni, As]: 2.28998 +[Ni, Br]: 2.80649 +[Ni, Cl]: 2.62649 +[Ni, F]: 2.20249 +[Ni, H]: 1.44998 +[Ni, I]: 3.00649 +[Ni, N]: 2.30649 +[Ni, O]: 2.28149 +[Ni, P]: 2.31998 +[Ni, S]: 2.58649 +[Ni, Se]: 2.18998 +[Ni, Te]: 2.47998 +[Np, Br]: 3.21233 +[Np, Cl]: 3.07233 +[Np, F]: 2.59233 +[Np, I]: 3.44233 +[Np, O]: 2.63646 +[Np, S]: 3.2 +[O, D]: 1.2 +[O, H]: 1.2 +[O, O]: 1.7 +[Os, Br]: 2.72002 +[Os, Cl]: 2.54002 +[Os, F]: 2.07746 +[Os, O]: 2.23 +[Os, S]: 2.56002 +[P, As]: 2.29998 +[P, Br]: 2.44293 +[P, Cl]: 2.28746 +[P, F]: 2.01002 +[P, H]: 1.45998 +[P, I]: 2.44998 +[P, N]: 1.97146 +[P, O]: 2.08646 +[P, P]: 2.48381 +[P, S]: 2.57646 +[P, Se]: 2.69646 +[Pa, Br]: 3.18437 +[Pa, Cl]: 3.01437 +[Pa, F]: 2.54437 +[Pa, O]: 2.63383 +[Pb, As]: 3.02644 +[Pb, Br]: 3.62451 +[Pb, Cl]: 3.39295 +[Pb, F]: 2.92045 +[Pb, H]: 2.27644 +[Pb, I]: 3.69562 +[Pb, N]: 3.0967 +[Pb, O]: 3.04096 +[Pb, P]: 2.94644 +[Pb, S]: 3.40395 +[Pb, Se]: 3.55295 +[Pb, Te]: 3.14644 +[Pd, As]: 2.34998 +[Pd, Br]: 2.80649 +[Pd, C]: 2.33649 +[Pd, Cl]: 2.65649 +[Pd, F]: 2.34649 +[Pd, H]: 1.51998 +[Pd, I]: 2.96649 +[Pd, N]: 2.40451 +[Pd, O]: 2.39849 +[Pd, P]: 2.46998 +[Pd, S]: 2.69649 +[Pd, Se]: 2.26998 +[Pd, Te]: 2.52998 +[Pm, Br]: 3.18233 +[Pm, Cl]: 3.41233 +[Pm, F]: 2.55233 +[Po, F]: 2.83646 +[Po, O]: 2.64646 +[Pr, As]: 3.35649 +[Pr, Br]: 3.27649 +[Pr, Cl]: 3.12749 +[Pr, F]: 2.62945 +[Pr, H]: 2.62649 +[Pr, I]: 3.49649 +[Pr, N]: 2.90649 +[Pr, O]: 2.74449 +[Pr, P]: 3.28649 +[Pr, S]: 3.20649 +[Pr, Se]: 3.32649 +[Pr, Te]: 3.50649 +[Pt, As]: 2.30998 +[Pt, Br]: 2.94191 +[Pt, C]: 2.36649 +[Pt, Cl]: 2.75646 +[Pt, F]: 2.54002 +[Pt, H]: 1.44998 +[Pt, I]: 2.41998 +[Pt, N]: 2.41649 +[Pt, O]: 2.40649 +[Pt, P]: 2.23998 +[Pt, S]: 2.76649 +[Pt, Se]: 2.23998 +[Pt, Te]: 2.49998 +[Pu, Br]: 3.19233 +[Pu, Cl]: 3.05233 +[Pu, F]: 2.58233 +[Pu, I]: 3.43233 +[Pu, O]: 2.68329 +[Pu, S]: 3.3 +[Rb, As]: 4.04645 +[Rb, Br]: 4.05498 +[Rb, Cl]: 3.86664 +[Rb, F]: 3.37645 +[Rb, H]: 3.43645 +[Rb, I]: 4.33462 +[Rb, N]: 3.79645 +[Rb, O]: 3.43945 +[Rb, P]: 3.50645 +[Rb, S]: 3.97645 +[Rb, Se]: 4.13773 +[Rb, Te]: 4.28802 +[Re, As]: 2.61998 +[Re, Br]: 2.70002 +[Re, Cl]: 3.44712 +[Re, F]: 2.16002 +[Re, H]: 1.79998 +[Re, I]: 2.65998 +[Re, N]: 2.10998 +[Re, O]: 2.3426 +[Re, P]: 2.50998 +[Re, S]: 2.61998 +[Re, Se]: 2.54998 +[Re, Te]: 2.74998 +[Rh, As]: 2.41998 +[Rh, Br]: 2.7126 +[Rh, Cl]: 2.62646 +[Rh, F]: 2.16646 +[Rh, H]: 1.59998 +[Rh, I]: 2.52998 +[Rh, N]: 2.2626 +[Rh, O]: 2.24946 +[Rh, P]: 2.43998 +[Rh, S]: 2.19998 +[Rh, Se]: 2.37998 +[Rh, Te]: 2.59998 +[Ru, As]: 2.40998 +[Ru, Br]: 2.30998 +[Ru, Cl]: 2.70646 +[Ru, F]: 2.57646 +[Ru, H]: 1.65998 +[Ru, I]: 2.52998 +[Ru, N]: 2.2626 +[Ru, O]: 2.22646 +[Ru, P]: 2.33998 +[Ru, S]: 2.6426 +[Ru, Se]: 2.69451 +[Ru, Te]: 2.58998 +[S, Br]: 2.21998 +[S, Cl]: 2.37002 +[S, F]: 1.95002 +[S, H]: 1.42998 +[S, I]: 2.40998 +[S, N]: 2.28849 +[S, O]: 1.8 +[S, S]: 2.2 +[Sb, As]: 2.64998 +[Sb, Br]: 2.96646 +[Sb, Cl]: 2.80646 +[Sb, F]: 2.35646 +[Sb, H]: 2.81998 +[Sb, I]: 3.21646 +[Sb, N]: 2.56446 +[Sb, O]: 2.45237 +[Sb, P]: 2.56998 +[Sb, S]: 3.05 +[Sb, Se]: 3.05646 +[Sb, Te]: 2.82998 +[Sc, As]: 3.04291 +[Sc, Br]: 2.94291 +[Sc, Cl]: 2.92291 +[Sc, F]: 2.32291 +[Sc, H]: 2.24291 +[Sc, I]: 3.15291 +[Sc, N]: 2.54291 +[Sc, O]: 2.42029 +[Sc, P]: 2.96291 +[Sc, S]: 2.88391 +[Sc, Se]: 3.00291 +[Sc, Te]: 3.20291 +[Se, Br]: 2.78002 +[Se, Cl]: 2.57002 +[Se, F]: 2.08002 +[Se, H]: 1.58998 +[Se, I]: 2.58998 +[Se, N]: 2.1 +[Se, O]: 2.16102 +[Se, S]: 2.81649 +[Se, Se]: 2.93649 +[Si, As]: 2.66002 +[Si, Br]: 2.55002 +[Si, C]: 2.23302 +[Si, Cl]: 2.38002 +[Si, F]: 1.93002 +[Si, H]: 1.82002 +[Si, I]: 2.76002 +[Si, N]: 2.12002 +[Si, O]: 1.99002 +[Si, P]: 2.58002 +[Si, S]: 2.47602 +[Si, Se]: 2.61002 +[Si, Si]: 2.6 +[Si, Te]: 2.84002 +[Sm, As]: 3.30649 +[Sm, Br]: 3.26649 +[Sm, Cl]: 3.08749 +[Sm, F]: 2.60649 +[Sm, H]: 2.56649 +[Sm, I]: 3.44649 +[Sm, N]: 3.02351 +[Sm, O]: 2.88251 +[Sm, P]: 3.23649 +[Sm, S]: 3.15649 +[Sm, Se]: 3.27649 +[Sm, Te]: 3.46649 +[Sn, As]: 2.77642 +[Sn, Br]: 3.2152 +[Sn, Cl]: 3.13111 +[Sn, F]: 2.63793 +[Sn, H]: 2.00642 +[Sn, I]: 3.52293 +[Sn, N]: 2.7152 +[Sn, O]: 2.82146 +[Sn, P]: 2.60642 +[Sn, S]: 3.15293 +[Sn, Se]: 2.96646 +[Sn, Te]: 2.91642 +[Sr, As]: 3.62295 +[Sr, Br]: 3.54295 +[Sr, Cl]: 3.37295 +[Sr, F]: 2.88195 +[Sr, H]: 2.87295 +[Sr, I]: 3.74295 +[Sr, N]: 3.09295 +[Sr, O]: 2.98095 +[Sr, P]: 3.43295 +[Sr, S]: 3.51295 +[Sr, Se]: 3.58295 +[Sr, Te]: 3.73295 +[Ta, As]: 2.70642 +[Ta, Br]: 2.60642 +[Ta, Cl]: 2.6739 +[Ta, F]: 2.2539 +[Ta, H]: 1.91642 +[Ta, I]: 2.81642 +[Ta, N]: 2.16642 +[Ta, O]: 2.74646 +[Ta, P]: 2.62642 +[Ta, S]: 2.8439 +[Ta, Se]: 2.66642 +[Ta, Te]: 2.85642 +[Tb, As]: 3.26649 +[Tb, Br]: 3.18649 +[Tb, Cl]: 3.04349 +[Tb, F]: 2.54249 +[Tb, H]: 2.51649 +[Tb, I]: 3.40945 +[Tb, N]: 2.80649 +[Tb, O]: 2.65549 +[Tb, P]: 3.19649 +[Tb, S]: 3.11649 +[Tb, Se]: 3.23649 +[Tb, Te]: 3.42649 +[Tc, Cl]: 2.56002 +[Tc, F]: 2.24219 +[Tc, O]: 2.22446 +[Te, Br]: 2.90002 +[Te, Cl]: 2.73906 +[Te, F]: 2.22002 +[Te, H]: 1.87998 +[Te, I]: 3.13702 +[Te, N]: 2.16998 +[Te, O]: 2.3334 +[Te, P]: 2.56998 +[Te, S]: 2.79002 +[Te, Se]: 2.57998 +[Te, Te]: 2.80998 +[Th, As]: 3.40649 +[Th, Br]: 3.31945 +[Th, Cl]: 3.15945 +[Th, F]: 2.68945 +[Th, H]: 2.67649 +[Th, I]: 3.56649 +[Th, N]: 2.94649 +[Th, O]: 2.77349 +[Th, P]: 3.33649 +[Th, S]: 3.24649 +[Th, Se]: 3.36649 +[Th, Te]: 3.54649 +[Ti, As]: 2.87642 +[Ti, Br]: 3.20293 +[Ti, Cl]: 3.02293 +[Ti, F]: 2.86293 +[Ti, H]: 1.76642 +[Ti, I]: 3.08291 +[Ti, N]: 2.08642 +[Ti, O]: 2.35391 +[Ti, P]: 2.51642 +[Ti, S]: 2.74646 +[Ti, Se]: 2.53642 +[Ti, Te]: 2.95642 +[Tl, As]: 3.09644 +[Tl, Br]: 3.80942 +[Tl, Cl]: 3.72942 +[Tl, F]: 3.26942 +[Tl, H]: 2.35644 +[Tl, I]: 3.94142 +[Tl, N]: 2.59644 +[Tl, O]: 3.36945 +[Tl, P]: 3.01644 +[Tl, S]: 3.66442 +[Tl, Se]: 3.00644 +[Tl, Te]: 3.23644 +[Tm, As]: 3.22649 +[Tm, Br]: 3.13945 +[Tm, Cl]: 2.98944 +[Tm, F]: 2.51649 +[Tm, H]: 2.45649 +[Tm, I]: 3.37945 +[Tm, N]: 2.74649 +[Tm, O]: 2.60649 +[Tm, P]: 3.13649 +[Tm, S]: 3.05649 +[Tm, Se]: 3.18649 +[Tm, Te]: 3.37649 +[U, As]: 3.02644 +[U, Br]: 3.39452 +[U, Cl]: 3.24452 +[U, F]: 2.80293 +[U, H]: 2.27644 +[U, I]: 3.62452 +[U, N]: 2.78649 +[U, O]: 2.94295 +[U, P]: 2.94644 +[U, S]: 3.25293 +[U, Se]: 3.00644 +[U, Te]: 3.16644 +[V, As]: 2.54642 +[V, Br]: 2.87329 +[V, Cl]: 3.15293 +[V, F]: 2.87293 +[V, H]: 1.73642 +[V, I]: 2.66642 +[V, N]: 2.38329 +[V, O]: 2.84939 +[V, P]: 2.46642 +[V, S]: 2.82293 +[V, Se]: 2.48642 +[V, Te]: 2.72642 +[W, As]: 2.58998 +[W, Br]: 2.49998 +[W, Cl]: 2.47 +[W, F]: 2.03 +[W, H]: 1.80998 +[W, I]: 2.70998 +[W, N]: 2.10998 +[W, O]: 2.20102 +[W, P]: 2.50998 +[W, S]: 2.43998 +[W, Se]: 2.55998 +[W, Te]: 2.75998 +[Xe, F]: 2.62649 +[Xe, O]: 2.63451 +[Y, As]: 3.24649 +[Y, Br]: 3.15649 +[Y, Cl]: 3.00649 +[Y, F]: 2.51049 +[Y, H]: 2.46649 +[Y, I]: 3.37649 +[Y, N]: 2.77649 +[Y, O]: 2.62549 +[Y, P]: 3.17649 +[Y, S]: 3.08649 +[Y, Se]: 3.21649 +[Y, Te]: 3.40649 +[Yb, As]: 3.19649 +[Yb, Br]: 3.12945 +[Yb, Cl]: 2.98249 +[Yb, F]: 2.50649 +[Yb, H]: 2.42649 +[Yb, I]: 3.37945 +[Yb, N]: 2.84851 +[Yb, O]: 2.74551 +[Yb, P]: 3.13649 +[Yb, S]: 3.03649 +[Yb, Se]: 3.16649 +[Yb, Te]: 3.36649 +[Zn, As]: 2.95293 +[Zn, Br]: 2.86293 +[Zn, Cl]: 2.72293 +[Zn, F]: 2.38293 +[Zn, H]: 2.13293 +[Zn, I]: 3.07293 +[Zn, N]: 2.43293 +[Zn, O]: 2.41693 +[Zn, P]: 2.86293 +[Zn, S]: 2.80293 +[Zn, Se]: 2.93293 +[Zn, Te]: 3.16293 +[Zr, As]: 3.07004 +[Zr, Br]: 2.98004 +[Zr, Cl]: 3.33651 +[Zr, F]: 2.99651 +[Zr, H]: 2.29004 +[Zr, I]: 3.19004 +[Zr, N]: 2.65004 +[Zr, O]: 3.09651 +[Zr, P]: 3.02004 +[Zr, S]: 2.91004 +[Zr, Se]: 3.03004 +[Zr, Te]: 3.17004 From 54e2b650888f6ae8b9c72b5ebedce3084cfe722f Mon Sep 17 00:00:00 2001 From: Janosh Riebesell Date: Sun, 13 Aug 2023 17:14:06 -0700 Subject: [PATCH 7/9] Add `Lattice` property `params_dict` (#3239) * add Lattice property params_dict * use new prop in Lattice.as_dict * test keys in TestLattice.test_to_from_dict * add TestLattice.test_parameters * improve Lattice test_mapping_symmetry --- pymatgen/core/lattice.py | 45 ++++++++++++++++++++------------------ pymatgen/io/lammps/data.py | 4 ++-- tests/core/test_lattice.py | 37 ++++++++++++++++++++----------- 3 files changed, 50 insertions(+), 36 deletions(-) diff --git a/pymatgen/core/lattice.py b/pymatgen/core/lattice.py index 8fa689d4399..4ead45469ce 100644 --- a/pymatgen/core/lattice.py +++ b/pymatgen/core/lattice.py @@ -59,9 +59,9 @@ def __init__(self, matrix: ArrayLike, pbc: tuple[bool, bool, bool] = (True, True pbc: a tuple defining the periodic boundary conditions along the three axis of the lattice. If None periodic in all directions. """ - m = np.array(matrix, dtype=np.float64).reshape((3, 3)) - m.setflags(write=False) - self._matrix: np.ndarray = m + mat = np.array(matrix, dtype=np.float64).reshape((3, 3)) + mat.setflags(write=False) + self._matrix: np.ndarray = mat self._inv_matrix: np.ndarray | None = None self._diags = None self._lll_matrix_mappings: dict[float, tuple[np.ndarray, np.ndarray]] = {} @@ -84,13 +84,13 @@ def angles(self) -> Vector3D: :return: The angles (alpha, beta, gamma) of the lattice. """ - m = self._matrix + mat = self._matrix lengths = self.lengths angles = np.zeros(3) - for i in range(3): - j = (i + 1) % 3 - k = (i + 2) % 3 - angles[i] = abs_cap(np.dot(m[j], m[k]) / (lengths[j] * lengths[k])) + for dim in range(3): + j = (dim + 1) % 3 + k = (dim + 2) % 3 + angles[dim] = abs_cap(np.dot(mat[j], mat[k]) / (lengths[j] * lengths[k])) angles = np.arccos(angles) * 180.0 / pi return tuple(angles.tolist()) # type: ignore @@ -99,9 +99,8 @@ def is_orthogonal(self) -> bool: """Whether all angles are 90 degrees.""" return all(abs(a - 90) < 1e-5 for a in self.angles) - def __format__(self, fmt_spec: str = ""): - """ - Support format printing. + def __format__(self, fmt_spec: str = "") -> str: + """Support format printing. Supported fmt_spec (str) are: 1. "l" for a list format that can be easily copied and pasted, e.g., @@ -114,17 +113,17 @@ def __format__(self, fmt_spec: str = ""): 0.000 10.000 0.000 0.000 0.000 10.000 """ - m = self._matrix.tolist() + matrix = self._matrix.tolist() if fmt_spec.endswith("l"): fmt = "[[{}, {}, {}], [{}, {}, {}], [{}, {}, {}]]" fmt_spec = fmt_spec[:-1] elif fmt_spec.endswith("p"): fmt = "{{{}, {}, {}, {}, {}, {}}}" fmt_spec = fmt_spec[:-1] - m = (self.lengths, self.angles) + matrix = (self.lengths, self.angles) else: fmt = "{} {} {}\n{} {} {}\n{} {} {}" - return fmt.format(*(format(c, fmt_spec) for row in m for c in row)) + return fmt.format(*(format(c, fmt_spec) for row in matrix for c in row)) def copy(self): """Deep copy of self.""" @@ -443,9 +442,14 @@ def volume(self) -> float: @property def parameters(self) -> tuple[float, float, float, float, float, float]: - """Returns: (a, b, c, alpha, beta, gamma).""" + """Returns (a, b, c, alpha, beta, gamma).""" return (*self.lengths, *self.angles) + @property + def params_dict(self) -> dict[str, float]: + """Dictionary of lattice parameters.""" + return dict(zip("a b c alpha beta gamma".split(), self.parameters)) + @property def reciprocal_lattice(self) -> Lattice: """ @@ -934,12 +938,11 @@ def __str__(self): return "\n".join(" ".join([f"{i:.6f}" for i in row]) for row in self._matrix) def as_dict(self, verbosity: int = 0) -> dict: - """ - Json-serialization dict representation of the Lattice. + """MSONable dict representation of the Lattice. Args: - verbosity (int): Verbosity level. Default of 0 only includes the - matrix representation. Set to 1 for more details. + verbosity (int): Default of 0 only includes the matrix representation. + Set to 1 to include the lattice parameters. """ dct = { "@module": type(self).__module__, @@ -948,8 +951,8 @@ def as_dict(self, verbosity: int = 0) -> dict: "pbc": self._pbc, } if verbosity > 0: - keys = ["a", "b", "c", "alpha", "beta", "gamma", "volume"] - dct.update(dict(zip(keys, [*self.parameters, self.volume]))) + dct.update(self.params_dict) + dct["volume"] = self.volume return dct diff --git a/pymatgen/io/lammps/data.py b/pymatgen/io/lammps/data.py index 357ef58fc52..ceada3ba526 100644 --- a/pymatgen/io/lammps/data.py +++ b/pymatgen/io/lammps/data.py @@ -144,8 +144,8 @@ def __repr__(self): @property def volume(self): """Volume of simulation box.""" - m = self._matrix - return np.dot(np.cross(m[0], m[1]), m[2]) + matrix = self._matrix + return np.dot(np.cross(matrix[0], matrix[1]), matrix[2]) @np.deprecate(message="Use get_str instead") def get_string(self, *args, **kwargs) -> str: diff --git a/tests/core/test_lattice.py b/tests/core/test_lattice.py index 43a8dbb350e..5df2f3d4095 100644 --- a/tests/core/test_lattice.py +++ b/tests/core/test_lattice.py @@ -278,25 +278,36 @@ def test_find_all_mappings(self): def test_mapping_symmetry(self): latt = Lattice.cubic(1) l2 = Lattice.orthorhombic(1.1001, 1, 1) - assert latt.find_mapping(l2, ltol=0.1) is None + assert latt.find_mapping(l2, ltol=0.1) == l2.find_mapping(latt, ltol=0.1) assert l2.find_mapping(latt, ltol=0.1) is None l2 = Lattice.orthorhombic(1.0999, 1, 1) - assert l2.find_mapping(latt, ltol=0.1) is not None + map = l2.find_mapping(latt, ltol=0.1) + assert isinstance(map, tuple) + assert len(map) == 3 assert latt.find_mapping(l2, ltol=0.1) is not None def test_to_from_dict(self): - d = self.tetragonal.as_dict() - t = Lattice.from_dict(d) - for i in range(3): - assert t.abc[i] == self.tetragonal.abc[i] - assert t.angles[i] == self.tetragonal.angles[i] + dct = self.tetragonal.as_dict() + expected_keys = {"matrix", "@class", "pbc", "@module"} + assert {*dct} == expected_keys + tetragonal = Lattice.from_dict(dct) + assert tetragonal.abc == self.tetragonal.abc + assert tetragonal.angles == self.tetragonal.angles + # Make sure old style dicts work. - d = self.tetragonal.as_dict(verbosity=1) - del d["matrix"] - t = Lattice.from_dict(d) - for i in range(3): - assert t.abc[i] == self.tetragonal.abc[i] - assert t.angles[i] == self.tetragonal.angles[i] + dct = self.tetragonal.as_dict(verbosity=1) + assert {*dct} == expected_keys | {"a", "b", "c", "alpha", "beta", "gamma", "volume"} + del dct["matrix"] + tetragonal = Lattice.from_dict(dct) + assert tetragonal.abc == self.tetragonal.abc + assert tetragonal.angles == self.tetragonal.angles + + def test_parameters(self): + params_dict = self.tetragonal.params_dict + assert params_dict == {"a": 10, "b": 10, "c": 20, "alpha": 90, "beta": 90, "gamma": 90} + params = self.tetragonal.parameters + assert params == (10, 10, 20, 90, 90, 90) + assert tuple(params_dict.values()) == params def test_scale(self): new_volume = 10 From d0947264660a5695d53d61a73befcb3e6dc33929 Mon Sep 17 00:00:00 2001 From: JiQi535 <54908836+JiQi535@users.noreply.github.com> Date: Mon, 14 Aug 2023 12:38:53 -0400 Subject: [PATCH 8/9] Generate SupercellTransformation from minimum boundary distance (#3238) * correct documentation for SupercellTransformation * Generate SupercellTransformation with minimum boundary distance * pre-commit auto-fixes * add test for from_boundary_distance method of SupercellTransformation * pre-commit auto-fixes * add type hints for from_boundary_distance() and document default min_boundary_dist * refactor from_boundary_distance for readability * refactor test_from_boundary_distance * add max_atoms * test for more structures with a range of min_boundary_dist; test max_atoms * pre-commit auto-fixes * change err type to RuntimeError, only suggest allow_rotation=True if not already * bit more code clean up and fix mypy --------- Co-authored-by: Ji Qi Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Janosh Riebesell --- pymatgen/core/structure.py | 2 +- .../standard_transformations.py | 53 +++++++++++++++++- .../test_standard_transformations.py | 54 +++++++++++++++++++ 3 files changed, 107 insertions(+), 2 deletions(-) diff --git a/pymatgen/core/structure.py b/pymatgen/core/structure.py index 83b32511b02..c4339f6a54e 100644 --- a/pymatgen/core/structure.py +++ b/pymatgen/core/structure.py @@ -4133,7 +4133,7 @@ def get_rand_vec(): for idx in range(len(self._sites)): self.translate_sites([idx], get_rand_vec(), frac_coords=False) - def make_supercell(self, scaling_matrix: ArrayLike, to_unit_cell: bool = True, in_place: bool = True) -> None: + def make_supercell(self, scaling_matrix: ArrayLike, to_unit_cell: bool = True, in_place: bool = True) -> Structure: """ Create a supercell. diff --git a/pymatgen/transformations/standard_transformations.py b/pymatgen/transformations/standard_transformations.py index 06c2c4b15da..5cbc985c57a 100644 --- a/pymatgen/transformations/standard_transformations.py +++ b/pymatgen/transformations/standard_transformations.py @@ -11,6 +11,7 @@ from fractions import Fraction from typing import TYPE_CHECKING +import numpy as np from numpy import around from pymatgen.analysis.bond_valence import BVAnalyzer @@ -209,7 +210,7 @@ def is_one_to_many(self) -> bool: class SupercellTransformation(AbstractTransformation): - """The RotationTransformation applies a rotation to a structure.""" + """The SupercellTransformation replicates an unitcell to a supercell.""" def __init__(self, scaling_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1))): """ @@ -240,6 +241,56 @@ def from_scaling_factors(scale_a=1, scale_b=1, scale_c=1): """ return SupercellTransformation([[scale_a, 0, 0], [0, scale_b, 0], [0, 0, scale_c]]) + @staticmethod + def from_boundary_distance( + structure: Structure, min_boundary_dist: float = 6, allow_rotation: bool = False, max_atoms: int | None = None + ) -> SupercellTransformation: + """ + Get a SupercellTransformation according to the desired minimum distance between periodic + boundaries of the resulting supercell. + + Args: + structure (Structure): Input structure. + min_boundary_dist (float): Desired minimum distance between all periodic boundaries. Defaults to 6. + allow_rotation (bool): Whether allowing lattice angles to change. Only useful when + at least two of the three lattice vectors are required to expand. Defaults to False. + If True, a SupercellTransformation satisfying min_boundary_dist but with smaller + number of atoms than the SupercellTransformation with unchanged lattice angles + can possibly be found. If such a SupercellTransformation cannot be found easily, + the SupercellTransformation with unchanged lattice angles will be returned. + max_atoms (int): Maximum number of atoms allowed in the supercell. Defaults to infinity. + + Returns: + SupercellTransformation. + """ + min_expand = np.int8(min_boundary_dist / np.array([structure.lattice.d_hkl(plane) for plane in np.eye(3)])) + max_atoms = max_atoms or np.Inf + + # Try to find a scaling_matrix satisfying the required boundary distance with smaller cell. + if allow_rotation and sum(min_expand != 0) > 1: + min1, min2, min3 = map(int, min_expand) # map(int) just for mypy's sake + scaling_matrix = [ + [min1 if min1 else 1, 1 if min1 and min2 else 0, 1 if min1 and min3 else 0], + [-1 if min2 and min1 else 0, min2 if min2 else 1, 1 if min2 and min3 else 0], + [-1 if min3 and min1 else 0, -1 if min3 and min2 else 0, min3 if min3 else 1], + ] + struct_scaled = structure.make_supercell(scaling_matrix, in_place=False) + min_expand_scaled = np.int8( + min_boundary_dist / np.array([struct_scaled.lattice.d_hkl(plane) for plane in np.eye(3)]) + ) + if np.count_nonzero(min_expand_scaled) == 0 and len(struct_scaled) <= max_atoms: + return SupercellTransformation(scaling_matrix) + + scaling_matrix = np.eye(3) + np.diag(min_expand) + struct_scaled = structure.make_supercell(scaling_matrix, in_place=False) + if len(struct_scaled) <= max_atoms: + return SupercellTransformation(scaling_matrix) + + msg = f"{max_atoms=} exceeded while trying to solve for supercell. You can try lowering {min_boundary_dist=}" + if not allow_rotation: + msg += " or set allow_rotation=True" + raise RuntimeError(msg) + def apply_transformation(self, structure): """ Apply the transformation. diff --git a/tests/transformations/test_standard_transformations.py b/tests/transformations/test_standard_transformations.py index 7754d0c53ba..de735558d40 100644 --- a/tests/transformations/test_standard_transformations.py +++ b/tests/transformations/test_standard_transformations.py @@ -7,6 +7,7 @@ import warnings from shutil import which +import numpy as np import pytest from monty.json import MontyDecoder from pytest import approx @@ -158,6 +159,59 @@ def test_from_scaling_factors(self): struct = trafo.apply_transformation(self.struct) assert len(struct) == 4 * functools.reduce(lambda a, b: a * b, scale_factors) + def test_from_boundary_distance(self): + struct_cubic = Structure.from_spacegroup("Pm-3m", [[4, 0, 0], [0, 4, 0], [0, 0, 4]], ["H"], [[0, 0, 0]]) + trafo_allow_rotate_true = SupercellTransformation.from_boundary_distance( + structure=struct_cubic, min_boundary_dist=9, allow_rotation=True + ) + trafo_allow_rotate_false = SupercellTransformation.from_boundary_distance( + structure=struct_cubic, min_boundary_dist=9, allow_rotation=False + ) + struct_super_allow_rotate_true = trafo_allow_rotate_true.apply_transformation(struct_cubic.copy()) + struct_super_allow_rotate_false = trafo_allow_rotate_false.apply_transformation(struct_cubic.copy()) + min_expand_allow_rotate_true = np.int8( + 9 / np.array([struct_super_allow_rotate_true.lattice.d_hkl(plane) for plane in np.eye(3)]) + ) + min_expand_allow_rotate_false = np.int8( + 9 / np.array([struct_super_allow_rotate_false.lattice.d_hkl(plane) for plane in np.eye(3)]) + ) + assert len(struct_super_allow_rotate_true) == 14 + assert len(struct_super_allow_rotate_false) == 27 + assert np.count_nonzero(min_expand_allow_rotate_true) == 0 + assert np.count_nonzero(min_expand_allow_rotate_false) == 0 + + for struct in [struct_cubic, self.struct]: + for min_boundary_dist in range(5, 16, 2): + trafo_allow_rotate_true = SupercellTransformation.from_boundary_distance( + structure=struct, min_boundary_dist=min_boundary_dist, allow_rotation=True + ) + trafo_allow_rotate_false = SupercellTransformation.from_boundary_distance( + structure=struct, min_boundary_dist=min_boundary_dist, allow_rotation=False + ) + struct_super_allow_rotate_true = trafo_allow_rotate_true.apply_transformation(struct.copy()) + struct_super_allow_rotate_false = trafo_allow_rotate_false.apply_transformation(struct.copy()) + min_expand_allow_rotate_true = np.int8( + min_boundary_dist + / np.array([struct_super_allow_rotate_true.lattice.d_hkl(plane) for plane in np.eye(3)]) + ) + min_expand_allow_rotate_false = np.int8( + min_boundary_dist + / np.array([struct_super_allow_rotate_false.lattice.d_hkl(plane) for plane in np.eye(3)]) + ) + assert len(struct_super_allow_rotate_true) <= len(struct_super_allow_rotate_false) + assert np.count_nonzero(min_expand_allow_rotate_true) == 0 + assert np.count_nonzero(min_expand_allow_rotate_false) == 0 + + max_atoms, min_boundary_dist = 10, 9 + with pytest.raises( + RuntimeError, + match=f"{max_atoms=} exceeded while trying to solve for supercell. " + f"You can try lowering {min_boundary_dist=}", + ): + SupercellTransformation.from_boundary_distance( + structure=struct_cubic, min_boundary_dist=min_boundary_dist, allow_rotation=False, max_atoms=max_atoms + ) + class TestOxidationStateDecorationTransformation(unittest.TestCase): def test_apply_transformation(self): From fd33f04af16a93e286058fa0c81c9218bece814d Mon Sep 17 00:00:00 2001 From: Janosh Riebesell Date: Mon, 14 Aug 2023 15:16:03 -0700 Subject: [PATCH 9/9] fix mypy in SupercellTransformation.from_boundary_distance --- pymatgen/analysis/elasticity/elastic.py | 14 +++++++------- .../transformations/standard_transformations.py | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pymatgen/analysis/elasticity/elastic.py b/pymatgen/analysis/elasticity/elastic.py index 472a20d2f8b..4eee805ab83 100644 --- a/pymatgen/analysis/elasticity/elastic.py +++ b/pymatgen/analysis/elasticity/elastic.py @@ -164,24 +164,24 @@ def compliance_tensor(self): return ComplianceTensor.from_voigt(s_voigt) @property - def k_voigt(self): + def k_voigt(self) -> float: """Returns the K_v bulk modulus.""" return self.voigt[:3, :3].mean() @property - def g_voigt(self): + def g_voigt(self) -> float: """Returns the G_v shear modulus.""" return ( 2 * self.voigt[:3, :3].trace() - np.triu(self.voigt[:3, :3]).sum() + 3 * self.voigt[3:, 3:].trace() ) / 15.0 @property - def k_reuss(self): + def k_reuss(self) -> float: """Returns the K_r bulk modulus.""" return 1 / self.compliance_tensor.voigt[:3, :3].sum() @property - def g_reuss(self): + def g_reuss(self) -> float: """Returns the G_r shear modulus.""" return 15 / ( 8 * self.compliance_tensor.voigt[:3, :3].trace() @@ -190,17 +190,17 @@ def g_reuss(self): ) @property - def k_vrh(self): + def k_vrh(self) -> float: """Returns the K_vrh (Voigt-Reuss-Hill) average bulk modulus.""" return 0.5 * (self.k_voigt + self.k_reuss) @property - def g_vrh(self): + def g_vrh(self) -> float: """Returns the G_vrh (Voigt-Reuss-Hill) average shear modulus.""" return 0.5 * (self.g_voigt + self.g_reuss) @property - def y_mod(self): + def y_mod(self) -> float: """ Calculates Young's modulus (in SI units) using the Voigt-Reuss-Hill averages of bulk and shear moduli. diff --git a/pymatgen/transformations/standard_transformations.py b/pymatgen/transformations/standard_transformations.py index 5cbc985c57a..4cfb1c5bef2 100644 --- a/pymatgen/transformations/standard_transformations.py +++ b/pymatgen/transformations/standard_transformations.py @@ -243,7 +243,7 @@ def from_scaling_factors(scale_a=1, scale_b=1, scale_c=1): @staticmethod def from_boundary_distance( - structure: Structure, min_boundary_dist: float = 6, allow_rotation: bool = False, max_atoms: int | None = None + structure: Structure, min_boundary_dist: float = 6, allow_rotation: bool = False, max_atoms: float = -1 ) -> SupercellTransformation: """ Get a SupercellTransformation according to the desired minimum distance between periodic @@ -264,11 +264,11 @@ def from_boundary_distance( SupercellTransformation. """ min_expand = np.int8(min_boundary_dist / np.array([structure.lattice.d_hkl(plane) for plane in np.eye(3)])) - max_atoms = max_atoms or np.Inf + max_atoms = max_atoms if max_atoms > 0 else float("inf") # Try to find a scaling_matrix satisfying the required boundary distance with smaller cell. if allow_rotation and sum(min_expand != 0) > 1: - min1, min2, min3 = map(int, min_expand) # map(int) just for mypy's sake + min1, min2, min3 = map(int, min_expand) # type: ignore # map(int) just for mypy's sake scaling_matrix = [ [min1 if min1 else 1, 1 if min1 and min2 else 0, 1 if min1 and min3 else 0], [-1 if min2 and min1 else 0, min2 if min2 else 1, 1 if min2 and min3 else 0], @@ -278,10 +278,10 @@ def from_boundary_distance( min_expand_scaled = np.int8( min_boundary_dist / np.array([struct_scaled.lattice.d_hkl(plane) for plane in np.eye(3)]) ) - if np.count_nonzero(min_expand_scaled) == 0 and len(struct_scaled) <= max_atoms: + if sum(min_expand_scaled != 0) == 0 and len(struct_scaled) <= max_atoms: return SupercellTransformation(scaling_matrix) - scaling_matrix = np.eye(3) + np.diag(min_expand) + scaling_matrix = np.eye(3) + np.diag(min_expand) # type: ignore[assignment] struct_scaled = structure.make_supercell(scaling_matrix, in_place=False) if len(struct_scaled) <= max_atoms: return SupercellTransformation(scaling_matrix)