Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Oxidation states #191

Merged
merged 7 commits into from
Dec 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions examples/Oxidation_states/mp-540839_CsPbI3_oxi.cif
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# generated using pymatgen
data_CsPbI3
_symmetry_space_group_name_H-M 'P 1'
_cell_length_a 4.84714164
_cell_length_b 10.65044663
_cell_length_c 18.03119927
_cell_angle_alpha 90.00000000
_cell_angle_beta 90.00000000
_cell_angle_gamma 90.00000000
_symmetry_Int_Tables_number 1
_chemical_formula_structural CsPbI3
_chemical_formula_sum 'Cs4 Pb4 I12'
_cell_volume 930.84665829
_cell_formula_units_Z 4
loop_
_symmetry_equiv_pos_site_id
_symmetry_equiv_pos_as_xyz
1 'x, y, z'
loop_
_atom_type_symbol
_atom_type_oxidation_number
Cs+ 1.0
Pb2+ 2.0
I- -1.0
loop_
_atom_site_type_symbol
_atom_site_label
_atom_site_symmetry_multiplicity
_atom_site_fract_x
_atom_site_fract_y
_atom_site_fract_z
_atom_site_occupancy
Cs+ Cs0 1 0.75000000 0.58127558 0.17211973 1.0
Cs+ Cs1 1 0.25000000 0.41872442 0.82788027 1.0
Cs+ Cs2 1 0.75000000 0.08127558 0.32788027 1.0
Cs+ Cs3 1 0.25000000 0.91872442 0.67211973 1.0
Pb2+ Pb4 1 0.25000000 0.66184885 0.43921676 1.0
Pb2+ Pb5 1 0.75000000 0.33815115 0.56078324 1.0
Pb2+ Pb6 1 0.25000000 0.16184885 0.06078324 1.0
Pb2+ Pb7 1 0.75000000 0.83815115 0.93921676 1.0
I- I8 1 0.75000000 0.83721116 0.50204455 1.0
I- I9 1 0.25000000 0.16278884 0.49795545 1.0
I- I10 1 0.75000000 0.33721116 0.99795545 1.0
I- I11 1 0.25000000 0.66278884 0.00204455 1.0
I- I12 1 0.25000000 0.52927197 0.61230824 1.0
I- I13 1 0.75000000 0.47072803 0.38769176 1.0
I- I14 1 0.25000000 0.02927197 0.88769176 1.0
I- I15 1 0.75000000 0.97072803 0.11230824 1.0
I- I16 1 0.25000000 0.79631664 0.28730552 1.0
I- I17 1 0.75000000 0.20368336 0.71269448 1.0
I- I18 1 0.25000000 0.29631664 0.21269448 1.0
I- I19 1 0.75000000 0.70368336 0.78730552 1.0
172 changes: 126 additions & 46 deletions examples/Oxidation_states/oxidation_states.ipynb

Large diffs are not rendered by default.

11 changes: 9 additions & 2 deletions smact/oxidation_states.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@

from numpy import mean
from pymatgen.core import Structure
from pymatgen.core.periodic_table import Specie as pmgSpecies
from pymatgen.core.periodic_table import Species as pmgSpecies
from pymatgen.core.periodic_table import get_el_sp

from smact import Element, Species, data_directory

Expand Down Expand Up @@ -146,7 +147,13 @@ def compound_probability(
if not all(isinstance(i, pmgSpecies) for i in species):
raise TypeError("Structure must have oxidation states.")
else:
structure = [Species(i.symbol, i.oxi_state) for i in structure]
structure = [
Species(
get_el_sp(i.species_string).symbol,
get_el_sp(i.species_string).oxi_state,
)
for i in structure
]
else:
raise TypeError(
"Input requires a list of SMACT or Pymatgen Species or a Structure."
Expand Down
8 changes: 4 additions & 4 deletions smact/properties.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from typing import List, Optional, Union

from numpy import product, sqrt
import numpy as np

import smact

Expand Down Expand Up @@ -70,10 +70,10 @@ def band_gap_Harrison(
V1_bar = (V1_An + V1_Cat) / 2
V2 = 2.16 * hbarsq_over_m / (d**2)
V3 = (Cat.eig - An.eig) / 2
alpha_m = (1.11 * V1_bar) / sqrt(V2**2 + V3**2)
alpha_m = (1.11 * V1_bar) / np.sqrt(V2**2 + V3**2)

# Calculate Band gap [(3-43) Harrison 1980 ]
Band_gap = (3.60 / 3.0) * (sqrt(V2**2 + V3**2)) * (1 - alpha_m)
Band_gap = (3.60 / 3.0) * (np.sqrt(V2**2 + V3**2)) * (1 - alpha_m)
if verbose:
print("V1_bar = ", V1_bar)
print("V2 = ", V2)
Expand Down Expand Up @@ -150,7 +150,7 @@ def compound_electroneg(
elementlist[i] = [elementlist[i] ** stoichslist[i]]

# Calculate geometric mean (n-th root of product)
prod = product(elementlist)
prod = np.prod(elementlist)
compelectroneg = (prod) ** (1.0 / (sum(stoichslist)))

if verbose:
Expand Down
1 change: 1 addition & 0 deletions smact/tests/files/mp-540839_CsPbI3_oxi.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0, "lattice": {"matrix": [[4.84714164, -0.0, 0.0], [0.0, 10.65044663, 0.0], [0.0, 0.0, 18.03119927]], "pbc": [true, true, true], "a": 4.84714164, "b": 10.65044663, "c": 18.03119927, "alpha": 90.0, "beta": 90.0, "gamma": 90.0, "volume": 930.846658290349}, "properties": {}, "sites": [{"species": [{"element": "Cs", "oxidation_state": 1, "spin": null, "occu": 1.0}], "abc": [0.75, 0.58127558, 0.17211973], "xyz": [3.63535623, 6.190844542112295, 3.103525149928597], "properties": {"magmom": -0.0}, "label": "Cs"}, {"species": [{"element": "Cs", "oxidation_state": 1, "spin": null, "occu": 1.0}], "abc": [0.25, 0.41872442, 0.82788027], "xyz": [1.21178541, 4.4596020878877045, 14.927674120071401], "properties": {"magmom": -0.0}, "label": "Cs"}, {"species": [{"element": "Cs", "oxidation_state": 1, "spin": null, "occu": 1.0}], "abc": [0.75, 0.08127558, 0.32788027], "xyz": [3.63535623, 0.8656212271122954, 5.912074485071402], "properties": {"magmom": -0.0}, "label": "Cs"}, {"species": [{"element": "Cs", "oxidation_state": 1, "spin": null, "occu": 1.0}], "abc": [0.25, 0.91872442, 0.67211973], "xyz": [1.21178541, 9.784825402887703, 12.119124784928596], "properties": {"magmom": -0.0}, "label": "Cs"}, {"species": [{"element": "Pb", "oxidation_state": 2, "spin": null, "occu": 1.0}], "abc": [0.25, 0.66184885, 0.43921676], "xyz": [1.21178541, 7.0489858540518755, 7.919604922283765], "properties": {"magmom": 0.0}, "label": "Pb"}, {"species": [{"element": "Pb", "oxidation_state": 2, "spin": null, "occu": 1.0}], "abc": [0.75, 0.33815115, 0.56078324], "xyz": [3.63535623, 3.6014607759481243, 10.111594347716235], "properties": {"magmom": 0.0}, "label": "Pb"}, {"species": [{"element": "Pb", "oxidation_state": 2, "spin": null, "occu": 1.0}], "abc": [0.25, 0.16184885, 0.06078324], "xyz": [1.21178541, 1.7237625390518754, 1.0959947127162348], "properties": {"magmom": 0.0}, "label": "Pb"}, {"species": [{"element": "Pb", "oxidation_state": 2, "spin": null, "occu": 1.0}], "abc": [0.75, 0.83815115, 0.93921676], "xyz": [3.63535623, 8.926684090948124, 16.935204557283765], "properties": {"magmom": 0.0}, "label": "Pb"}, {"species": [{"element": "I", "oxidation_state": -1, "spin": null, "occu": 1.0}], "abc": [0.75, 0.83721116, 0.50204455], "xyz": [3.63535623, 8.91667277762039, 9.052465323467478], "properties": {"magmom": -0.0}, "label": "I"}, {"species": [{"element": "I", "oxidation_state": -1, "spin": null, "occu": 1.0}], "abc": [0.25, 0.16278884, 0.49795545], "xyz": [1.21178541, 1.733773852379609, 8.978733946532522], "properties": {"magmom": -0.0}, "label": "I"}, {"species": [{"element": "I", "oxidation_state": -1, "spin": null, "occu": 1.0}], "abc": [0.75, 0.33721116, 0.99795545], "xyz": [3.63535623, 3.5914494626203908, 17.99433358153252], "properties": {"magmom": -0.0}, "label": "I"}, {"species": [{"element": "I", "oxidation_state": -1, "spin": null, "occu": 1.0}], "abc": [0.25, 0.66278884, 0.00204455], "xyz": [1.21178541, 7.0589971673796095, 0.036865688467478494], "properties": {"magmom": -0.0}, "label": "I"}, {"species": [{"element": "I", "oxidation_state": -1, "spin": null, "occu": 1.0}], "abc": [0.25, 0.52927197, 0.61230824], "xyz": [1.21178541, 5.6369828692399615, 11.040651890102982], "properties": {"magmom": -0.0}, "label": "I"}, {"species": [{"element": "I", "oxidation_state": -1, "spin": null, "occu": 1.0}], "abc": [0.75, 0.47072803, 0.38769176], "xyz": [3.63535623, 5.013463760760039, 6.990547379897015], "properties": {"magmom": -0.0}, "label": "I"}, {"species": [{"element": "I", "oxidation_state": -1, "spin": null, "occu": 1.0}], "abc": [0.25, 0.02927197, 0.88769176], "xyz": [1.21178541, 0.3117595542399611, 16.006147014897014], "properties": {"magmom": -0.0}, "label": "I"}, {"species": [{"element": "I", "oxidation_state": -1, "spin": null, "occu": 1.0}], "abc": [0.75, 0.97072803, 0.11230824], "xyz": [3.63535623, 10.338687075760038, 2.0250522551029846], "properties": {"magmom": -0.0}, "label": "I"}, {"species": [{"element": "I", "oxidation_state": -1, "spin": null, "occu": 1.0}], "abc": [0.25, 0.79631664, 0.28730552], "xyz": [1.21178541, 8.481127874900922, 5.180463082490969], "properties": {"magmom": -0.0}, "label": "I"}, {"species": [{"element": "I", "oxidation_state": -1, "spin": null, "occu": 1.0}], "abc": [0.75, 0.20368336, 0.71269448], "xyz": [3.63535623, 2.1693187550990767, 12.850736187509028], "properties": {"magmom": -0.0}, "label": "I"}, {"species": [{"element": "I", "oxidation_state": -1, "spin": null, "occu": 1.0}], "abc": [0.25, 0.29631664, 0.21269448], "xyz": [1.21178541, 3.1559045599009234, 3.835136552509029], "properties": {"magmom": -0.0}, "label": "I"}, {"species": [{"element": "I", "oxidation_state": -1, "spin": null, "occu": 1.0}], "abc": [0.75, 0.70368336, 0.78730552], "xyz": [3.63535623, 7.494542070099076, 14.19606271749097], "properties": {"magmom": -0.0}, "label": "I"}]}
9 changes: 8 additions & 1 deletion smact/tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import os
import unittest

from pymatgen.core import Structure
from pymatgen.core.periodic_table import Specie

import smact
Expand All @@ -17,6 +18,7 @@

files_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "files")
TEST_OX_STATES = os.path.join(files_dir, "test_oxidation_states.txt")
TEST_STRUCT = os.path.join(files_dir, "mp-540839_CsPbI3_oxi.json")


class TestSequenceFunctions(unittest.TestCase):
Expand Down Expand Up @@ -417,7 +419,7 @@ def test_lattice_parameters(self):
self.assertAlmostEqual(wurtz[0], 5.13076)
self.assertAlmostEqual(wurtz[2], 8.3838)

# ---------- Lattice parameters -----------
# ---------- smact.oxidation_states module -----------
def test_oxidation_states(self):
ox = smact.oxidation_states.Oxidation_state_probability_finder()
self.assertAlmostEqual(
Expand All @@ -429,3 +431,8 @@ def test_oxidation_states(self):
0.74280230326,
)
self.assertEqual(len(ox.get_included_species()), 173)

def test_compound_probability_structure(self):
structure = Structure.from_file(TEST_STRUCT)
ox = smact.oxidation_states.Oxidation_state_probability_finder()
self.assertEqual(ox.compound_probability(structure), 1.0)