Skip to content

Commit d2060b0

Browse files
committed
Adding pourbaix dir again - RF
1 parent 1b5cd09 commit d2060b0

20 files changed

Lines changed: 2299 additions & 0 deletions

pourbaix_pymatgen/LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2017 Raul Flores
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

pourbaix_pymatgen/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# pourbaix_pymatgen
2+
Pourbaix construction and analysis using Materials Project database

pourbaix_pymatgen/data_exp_form_e.py

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
"""TEMP TEMP - 180317"""
2+
3+
def formation_e_data_dict():
4+
"""
5+
Dictionary of formation energies for transition metal species.
6+
7+
All energies are in [eV]
8+
"""
9+
#start_fold - formation_e_data_dict
10+
import ast
11+
direct_0 = '/home/flores12/01_ORR-MatStabScreen/01_virenv-pymatgen/01_data/03_formation_e/'
12+
List = open(direct_0+'data.py').read().splitlines()
13+
# Returns python list of entries_lst from read data file
14+
entries_lst = []
15+
line_cnt = 1
16+
for i in List:
17+
# print str(line_cnt)+' :'+str(i)
18+
if not i=="":
19+
if i[0]=='#':
20+
line_cnt=line_cnt+1
21+
continue
22+
else:
23+
try:
24+
entries_lst.append(ast.literal_eval(i))
25+
except:
26+
print 'data_exp_form_e.formation_e_data_dict - error with line: '+str(line_cnt)
27+
line_cnt=line_cnt+1
28+
## Turns entry lists into dictionaries
29+
cf_k = "chem_formula" # Chemical formula list key
30+
fe_k = "form_e" # Formation energy key
31+
r_k = "reference" # Literature reference key
32+
c_k = "comments" # Comments key
33+
34+
entries = []
35+
for i in entries_lst:
36+
entry_dict = {}
37+
entry_dict[cf_k] = i[0]
38+
entry_dict[fe_k] = i[1]
39+
entry_dict[r_k] = i[2]
40+
entry_dict[c_k] = i[3]
41+
entries.append(entry_dict)
42+
43+
chem_form_lst = []
44+
for entry in entries:
45+
# chem_form = entry[0]
46+
chem_form_lst.append(frozenset(entry[cf_k]))
47+
unique_entries_lst = list(list(i) for i in list(set(chem_form_lst)))
48+
49+
dict = {}
50+
for i in unique_entries_lst:
51+
dict[frozenset(i)]=[]
52+
for j in entries:
53+
if set(j[cf_k])==set(i):
54+
dict[frozenset(i)].append(j)
55+
return dict
56+
57+
#end_fold
58+
59+
def get_entry(chemical_formula_list, data_dict):
60+
"""
61+
62+
Args:
63+
chemical_formula_list:
64+
data_dict:
65+
"""
66+
#start_fold - get_entry
67+
# print chemical_formula_list
68+
key = frozenset(chemical_formula_list)
69+
70+
try:
71+
entry = data_dict[key]
72+
except KeyError:
73+
entry = None
74+
# print 'data_exp_form_e.get_entry - no experimental data available'
75+
76+
return entry
77+
78+
#end_fold
79+
80+
# form_e_data = formation_e_data_dict()
81+
# temp = get_entry(['Pt1','O2'],form_e_data)
82+
83+
def oxygen_stoich(exp_entry):
84+
"""
85+
86+
Args:
87+
exp_entry
88+
"""
89+
#start_fold - oxygen_stoich
90+
formula = exp_entry['chem_formula']
91+
for i in formula:
92+
if i[0]=='O' and i[1].isdigit()==True:
93+
num_of_digits = len(i)-1
94+
if num_of_digits==1:
95+
oxy_num = int(i[1])
96+
elif num_of_digits>1:
97+
oxy_num = int(i[1:])
98+
break
99+
return oxy_num
100+
101+
#end_fold
102+
103+
104+
#start_fold - Possible code to take "Pt2O3 and extract out the elements and stoicheometric numbers"
105+
# import re
106+
#
107+
# chem_form_lst = []
108+
# for entry in entries_lst:
109+
#
110+
# chem_form = entry[0]
111+
# form_e = entry[1]
112+
# ref = entry[2]
113+
# comments = entry[3]
114+
#
115+
# chem_form_lst.append(set(chem_form))
116+
#
117+
# ## Separating the element name from the stoicheometric factor
118+
# for element in chem_form:
119+
# elem_stoich = re.match(r"([a-z]+)([0-9]+)", element, re.I).groups()
120+
# elem = elem_stoich[0]
121+
# stoich = elem_stoich[1]
122+
#end_fold

pourbaix_pymatgen/element_list.py

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
from pymatgen.core.periodic_table import Element # Call elements by atomic #
2+
class ElementList(object):
3+
"""
4+
Class for creating element lists and ranges
5+
By default the first list created is in order of atomic number
6+
Args:
7+
N/A
8+
"""
9+
#start_fold - ElementList
10+
def __init__(self, atom_num_lst=[[]]):
11+
self.atom_num_lst = atom_num_lst
12+
if not atom_num_lst==[[]]:
13+
self.list = self.mk_lst_atnum()
14+
self.trans_met = self.mk_lst_trans_met()
15+
16+
def mk_lst_atnum(self):
17+
"""
18+
Makes list of elements from the atom_num_lst input
19+
"""
20+
elem_rnge=[]
21+
for i in self.atom_num_lst:
22+
el_strt=i[0]
23+
el_end=i[1]
24+
rnge_sect=range(el_strt,el_end+1)
25+
elem_rnge.extend(rnge_sect)
26+
elements=[]
27+
for i in elem_rnge:
28+
element=Element.from_Z(i) # Indice -> pymatgen element object
29+
elements.append(element)
30+
return elements
31+
print elements
32+
33+
def mk_lst_trans_met(self):
34+
"""
35+
Produces list of transition metals in order of atomic number
36+
"""
37+
elem_rnge_I = [[21,30],[39,44],[46,48],[74,76],[78,80]]
38+
elem_rnge=[]
39+
for i in elem_rnge_I:
40+
el_strt=i[0]
41+
el_end=i[1]
42+
rnge_sect=range(el_strt,el_end+1)
43+
elem_rnge.extend(rnge_sect)
44+
elements=[]
45+
for i in elem_rnge:
46+
element=Element.from_Z(i) # Indice -> pymatgen element object
47+
elements.append(element)
48+
return elements
49+
50+
#end_fold
51+
52+
class ElemList_mod(object):
53+
"""
54+
"""
55+
#start_fold - ElemList_mod
56+
def __init__(self,elem_lst):
57+
self.elem_lst = elem_lst
58+
@property
59+
def sort(self,srt_type='group_num'):
60+
"""
61+
Sorts element entries
62+
Args:
63+
srt_type
64+
DEFAULT: group_num, sorts by group number with lowest group number first, and
65+
lowest period first
66+
"""
67+
if srt_type == 'group_num':
68+
elem_lst = self.elem_lst
69+
elem_lst_sorted = elem_lst[:] # Maintains the original unaffected
70+
elem_lst_sorted.sort(key=lambda x: x.group)
71+
return elem_lst_sorted
72+
73+
#start_fold - d-band filling
74+
if srt_type == 'd-band': #COMBAK
75+
tmp = 7
76+
77+
78+
79+
80+
#end_fold
81+
82+
def remove(self,element):
83+
"""
84+
Removes element from element list
85+
Args:
86+
List of element objects
87+
If only 1 element just 1 element number or chemical symbol
88+
name "or" atomic number of the element to be removed
89+
"""
90+
elem_lst_0 = self.elem_lst
91+
if type(element)==type([]):
92+
for elem in element:
93+
if type(elem)==type('string'):
94+
# Find the occurance of input 'elem' in the list and returns it
95+
elem_0 = next((x for x in elem_lst_0 if x.name == elem), None)
96+
elem_lst_0 = [x for x in elem_lst_0 if not x.name == elem]
97+
elif type(elem)==type(2):
98+
elem_0 = next((x for x in elem_lst_0 if x.number == elem), None)
99+
elem_lst_0 = [x for x in elem_lst_0 if not x.number == elem]
100+
return elem_lst_0
101+
if type(element)==type('string'):
102+
# Find the occurance of input 'elem' in the list and returns it
103+
elem_0 = next((x for x in self.elem_lst if x.name == element), None)
104+
elem_lst_new = [x for x in self.elem_lst if not x.name == element]
105+
return elem_lst_new
106+
107+
elif type(element)==type(2):
108+
elem_0 = next((x for x in self.elem_lst if x.number == element), None)
109+
elem_lst_new = [x for x in self.elem_lst if not x.number == element]
110+
return elem_lst_new
111+
#end_fold
112+
113+
def elem_str_mke(elem_lst):
114+
"""
115+
116+
Args:
117+
elem_lst:
118+
"""
119+
#start_fold - elem_str_mke
120+
elem_str=[]
121+
for i in elem_lst:
122+
elem_str.append(i.symbol)
123+
return elem_str
124+
125+
#end_fold

0 commit comments

Comments
 (0)