#!/usr/bin/env python
"""Contains common elements, such as reference energies."""
[docs]def countatoms(formula):
"""Given an atomic formula, e.g. CH2O, returns a dictionary of
atomic counts, e.g, d = {'C':1,'H':2,'O':1}.
Args:
formula (string)
"""
d = {}
starts = [] # indices of string formula that start a new element
for index, letter in enumerate(formula):
if letter.isupper():
starts.append(index)
starts.append(len(formula)) # (gives searchable range for last el.)
for index in range(len(starts) - 1):
name = ''
number = ''
for letter in formula[starts[index]:starts[index + 1]]:
if letter.isalpha():
name = name + letter
elif letter.isdigit():
number = number + letter
if len(number) == 0:
count = 1
else:
count = eval(number)
if name in d.keys():
d[name] += count
else:
d[name] = count
return d
[docs]def calculate_reference_energy(formula):
"""For a formula, such as CH2OH, counts the atoms and makes a
reference energy (eV) based on the atomic energies in
reference_energies.
Args:
formula (string)
"""
referenceenergy = 0.
counts = countatoms(formula)
for key in counts.keys():
referenceenergy += counts[key] * reference_energies[key]
return referenceenergy
# The below energies are just used for reporting of data, not
# in internal calculations.
reference_energies = {
'C': -155.456, # graphene
'H': 0.5 * (-32.0295), # 1/2 H2
'O': -469.7509 + 32.0295, # H2O-H2
}
"""For convenience, all of the surfaces which have calculations
are listed in all_surfaces."""
all_surfaces = [
'Rh-fcc211',
'Al-fcc211',
'Pd-fcc211',
'Ag-fcc211',
'Ir-fcc211',
'Pt-fcc211',
'Ni-fcc211',
'Cu-fcc211',
'Pb-fcc211',
'Au-fcc211',
'Tl-fcc211',
'Cd-fcc211', ]
[docs]def create_full_pathway():
"""Returns the full CO2 reduction pathway that I have commonly looked
at."""
from hori.pathway import Pathway
fp = Pathway(startingstep='1', startingenergy=0.)
fp.addstep('1', '5', ['-s', '-CO2', '-pe', '+a_OCHO'])
fp.addstep('5', '6', ['-a_OCHO', '-pe', '+s', '+HCOOH'])
fp.addstep('5', '11', ['-a_OCHO', '-pe', '+a_OCH2O'])
fp.addstep('11', '12', ['-a_OCH2O', '-s', '-pe', '+a_OCH3', '+a_O'])
fp.addstep('12', '14', ['-a_OCH3', '-a_O', '-pe', '+a_OCH3', '+a_OH'])
fp.addstep('14', '16', ['-a_OCH3', '-a_OH', '-pe', '+s', '+a_OCH3', '+H2O'])
fp.addstep('16', '18', ['-a_OCH3', '-pe', '+a_O', '+CH4'])
fp.addstep('18', '20', ['-a_O', '-pe', '+a_OH'])
fp.addstep('20', '21', ['-a_OH', '-pe', '+s', '+H2O'])
fp.addstep('1', '28', ['-s', '-CO2', '-pe', '+a_COOH'])
fp.addstep('28', '3', ['-a_COOH', '-pe', '+a_CO', '+H2O'])
fp.addstep('28', '4', ['-a_COOH', '-pe', '+CO', '+H2O', '+s'])
fp.addstep('28', '6', ['-a_COOH', '-pe', '+HCOOH', '+s'])
fp.addstep('28', '2', ['-a_COOH', '-s', '+a_CO', '+a_OH'])
fp.addstep('3', '22', ['-a_CO', '-pe', '+a_COH'])
fp.addstep('3', '23', ['-a_CO', '-pe', '+a_CHO'])
fp.addstep('23', '25', ['-a_CHO', '-pe', '+a_CH2O'])
fp.addstep('23', '24', ['-a_CHO', '-pe', '+a_CHOH'])
fp.addstep('22', '24', ['-a_COH', '-pe', '+a_CHOH'])
fp.addstep('25', '26', ['-a_CH2O', '-pe', '+a_CH2OH'])
fp.addstep('24', '26', ['-a_CHOH', '-pe', '+a_CH2OH'])
fp.addstep('25', '16', ['-a_CH2O', '-pe', '+a_OCH3'])
fp.addstep('26', '27', ['-a_CH2OH', '-pe', '+CH3OH', '+s'])
fp.addstep('22', '29', ['-a_COH', '-pe', '+a_C', '+H2O'])
fp.addstep('29', '30', ['-a_C', '-pe', '+a_CH'])
fp.addstep('24', '30', ['-a_CHOH', '-pe', '+H2O', '+a_CH'])
fp.addstep('30', '31', ['-a_CH', '-pe', '+a_CH2'])
fp.addstep('26', '31', ['-a_CH2OH', '-pe', '+H2O', '+a_CH2'])
fp.addstep('31', '32', ['-a_CH2', '-pe', '+a_CH3'])
fp.addstep('32', '21', ['-a_CH3', '-pe', '+CH4', '+s'])
fp.addstep('1', '33', ['-s', '-pe', '+a_H'])
fp.addstep('33', '34', ['-a_H', '-pe', '+H2', '+s'])
fp.addstep('16', '27', ['-a_OCH3', '-pe', '+s', '+CH3OH'])
fp.addstep('28', '43', ['-a_COOH', '-pe', '+a_COHOH'])
fp.addstep('43', '22', ['-a_COHOH', '-pe', '+a_COH', '+H2O'])
fp.addstep('5', '44', ['-a_OCHO', '-s', '+a_CHO', '+a_O'])
fp.addstep('44', '45', ['-a_CHO', '-a_O', '-pe', '+a_CHO', '+a_OH'])
fp.addstep('45', '23', ['-a_CHO', '-a_OH', '-pe', '+a_CHO', '+s', '+H2O'])
fp.addstep('3', '46', ['-a_CO', '-s', '+a_C', '+a_O'])
fp.addstep('46', '37', ['-a_C', '-a_O', '-pe', '+a_C', '+a_OH'])
fp.addstep('2', '3', ['-a_CO', '-a_OH', '-pe', '+H2O', '+s', '+a_CO'])
fp.addstep('22', '37', ['-a_COH', '-s', '+a_C', '+a_OH'])
fp.addstep('37', '29', ['-a_C', '-a_OH', '-pe', '+a_C', '+s', '+H2O'])
fp.addstep('23', '38', ['-a_CHO', '-s', '+a_CH', '+a_O'])
fp.addstep('38', '47', ['-a_CH', '-a_O', '-pe', '+a_CH', '+a_OH'])
fp.addstep('25', '48', ['-a_CH2O', '-s', '+a_CH2', '+a_O'])
fp.addstep('48', '39', ['-a_CH2', '-a_O', '-pe', '+a_CH2', '+a_OH'])
fp.addstep('47', '30', ['-a_CH', '-a_OH', '-pe', '+a_CH', '+s', '+H2O'])
fp.addstep('16', '49', ['-a_OCH3', '-s', '+a_O', '+a_CH3'])
fp.addstep('49', '50', ['-a_CH3', '-a_O', '-pe', '+a_CH3', '+a_OH'])
fp.addstep('39', '31', ['-a_CH2', '-a_OH', '-pe', '+a_CH2', '+s', '+H2O'])
fp.addstep('50', '32', ['-a_CH3', '-a_OH', '-pe', '+a_CH3', '+s', '+H2O'])
fp.addstep('25', '40', ['-a_CH2O', '+0.5C2H4', '+a_O'])
fp.addstep('40', '41', ['-a_O', '-pe', '+a_OH'])
fp.addstep('41', '42', ['-a_OH', '-pe', '+s', '+H2O'])
return fp
[docs]def hbond_dict():
"""Returns a dictionary of hydrogen bond stabilizations, in eV."""
OH = -0.50 # OH directly on the surface
ROH = -0.25 # a 'floppy' OH group
CO = -0.1 # carbon monoxide
d = {'COOH': ROH,
'': 0.,
'OCHO': 0.,
'CO': CO,
'CO2': 0.,
'CH2O': 0.,
'CH3O': 0.,
'CHO': CO,
'COCOH': CO + ROH,
'OCCOH': CO + ROH,
'CH2O': 0.,
'CH3O': 0.,
'OCH3': 0.,
'O': 0.,
'OH': OH,
'S': 0.,
'SH': 0.,
'H': 0.,
'COH': ROH,
'H2O': ROH,
'C': 0.,
'CC': 0.,
'CH': 0.,
'CH2': 0.,
'CH2_CH2': 0.,
'CH2_CH2_TS': 0.,
'C2H4': 0.,
'CH3': 0.,
'CHOH': ROH,
'COHOH': ROH,
'OCH2O': 0.,
'CH2OH': ROH,
'OCHCH2': 0.,
'OCH2CH': 0.,
'OHCHCH': ROH,
'OCHCHO': 0.,
'OCHCOH': CO + ROH,
'OCH2CHO': 0.,
'OCH2CH2O': 0.,
'CHO_CHO': 2 * CO,
'CH2O_CHO': CO,
'CH2O_CH2O': 0,
'OCH2CHOH': ROH,
'OCHCHOH': ROH,
'OCHCH': 0.,
'OCHCH2OH': ROH,
'OCH2CHOH': ROH,
'OHCHCHOH': 2 * ROH,
'OCHCH': 0.,
'CHOCHO_OCHCHO_TS': 2 * CO,
'CH2OCHO_OCH2CHO_TS': CO,
'CH2OCH2O_OCH2CH2O_TS': 0,
'CHOCO_TS': 2 * CO,
'COCO_OCCO_TS': 2 * CO,
'O_O': 0.,
'CO_CO': 2 * CO,
'COOH_COOH': 2 * ROH,
'COHCOH': 2 * ROH,
'OCH2CH2OH': ROH,
'OHCH2CH2': ROH,
'OCH2CH2': 0.0,
'OH_O': OH,
'OH_OH': 2 * OH,
'CHOCO': 2 * CO,
'CHO_CO': 2 * CO,
'OCCO': 2 * CO,
'O2H2HCCH2OH': 3 * ROH,
'O2H2HCCHO2H2': 4 * ROH,
'O2H2HCCH': 2 * ROH,
'O2H2HCCH2': 2 * ROH,
'OHHCCH2OH': 2 * ROH,
'OHHCCH2': 1 * ROH,
'HCCH2': 0.,
'OHH2CCH2': 1 * ROH,
'O2H2HCCHOH': 3 * ROH,
'OHHCCHOH': 2 * ROH,
'OHHCCH': ROH,
'HCCH': 0.,
'OHHCCH3': ROH,
'O2H2HCCH3': 2 * ROH,
'HCCH2OH': ROH,
'HCCH3': 0.,
'OCCHO': 2 * CO,
'OCCH2O': CO,
'OCHCH3': 0.,
'OHCHCH2': ROH,
'OHCHCH3': ROH,
'CHCH2': 0.,
'OHCH2CH': ROH,
'NNH': 0.,
'NNH2': 0.,
'NHNH': 0.,
'NHNH2': 0.,
'NH': 0.,
'N': 0.,
'N2': 0.,
'NH2': 0.,
'NH3': 0.,
'NH_H': 0.,
'NH-H': 0.,
'NH2_H': 0.,
'NH2-H': 0.,
'NH3+H+H+H': 0.,
'NH3+H+H': 0.,
'NH3+H': 0.,
}
return d
[docs]def hbond_dict_none():
"""Returns a dictionary of hydrogen bond stabilizations, in eV."""
OH = 0.0 # OH directly on the surface
ROH = 0.0 # a 'floppy' OH group
CO = 0.0 # carbon monoxide
d = {'COOH': ROH,
'CO2': 0.,
'': 0.,
'OCHO': 0.,
'CO': CO,
'CHO': CO,
'OCCOH': CO + ROH,
'COCOH': CO + ROH,
'CH2O': 0.,
'CH3O': 0.,
'OCH3': 0.,
'O': 0.,
'OH': OH,
'S': 0.,
'SH': 0.,
'H': 0.,
'COH': ROH,
'C': 0.,
'CC': 0.,
'CH': 0.,
'CH2': 0.,
'CH2_CH2': 0.,
'CH2_CH2_TS': 0.,
'C2H4': 0.,
'CH3': 0.,
'CHOH': ROH,
'COHOH': ROH,
'OCH2O': 0.,
'CH2OH': ROH,
'OCHCH2': 0.,
'OCHCHO': 0.,
'OCH2CHO': 0.,
'OCH2CH2O': 0.,
'CHO_CHO': 2 * CO,
'CH2O_CHO': CO,
'CH2O_CH2O': 0,
'CHOCHO_OCHCHO_TS': 2 * CO,
'CH2OCHO_OCH2CHO_TS': CO,
'CH2OCH2O_OCH2CH2O_TS': 0,
'CHOCO_TS': 2 * CO,
'COCO_OCCO_TS': 2 * CO,
'O_O': 0.,
'CO_CO': 2 * CO,
'COOH_COOH': 2 * ROH,
'COHCOH': 2 * ROH,
'OCH2CH2OH': ROH,
'OCH2CH2': 0.,
'OHCH2CH2': ROH,
'OH_O': OH,
'OH_OH': 2 * OH,
'CHOCO': 2 * CO,
'CHO_CO': 2 * CO,
'OCCO': 2 * CO,
'O2H2HCCH2OH': 3 * ROH,
'O2H2HCCHO2H2': 4 * ROH,
'O2H2HCCH': 2 * ROH,
'O2H2HCCH2': 2 * ROH,
'OHHCCH2OH': 2 * ROH,
'OHHCCH2': 1 * ROH,
'HCCH2': 0.,
'OHH2CCH2': 1 * ROH,
'O2H2HCCHOH': 3 * ROH,
'OHHCCHOH': 2 * ROH,
'OHHCCH': ROH,
'HCCH': 0.,
'OHHCCH3': ROH,
'O2H2HCCH3': 2 * ROH,
'HCCH2OH': ROH,
'NH3': 0.,
'HCCH3': 0.
}
return d