def setUp(self): slope = 0.5 intercept = 10. # kcal/mol del_E = -1. # kcal/mol del_E_eV = del_E * c.convert_unit(initial='kcal/mol', final='eV/molecule') E_surf = -2. # kcal/mol E_surf_eV = E_surf * c.convert_unit(initial='kcal/mol', final='eV/molecule') E_gas = -3. # kcal/mol E_gas_eV = E_gas * c.convert_unit(initial='kcal/mol', final='eV/molecule') species = { 'A(g)_shomate': Shomate(name='A(g)_shomate', T_low=100., T_high=500., a=np.zeros(8)), 'A(g)_statmech': StatMech(), '*': StatMech(), 'A*': StatMech(U=del_E_eV, H=del_E_eV, **presets['constant']), 'surf': StatMech(U=E_surf_eV, H=E_surf_eV, **presets['constant']), 'gas': StatMech(U=E_gas_eV, H=E_gas_eV, **presets['constant']) } reaction_shomate = Reaction.from_string('A(g)_shomate + * = A*', species) reaction_statmech = Reaction.from_string('A(g)_statmech + * = A*', species) self.lsr_const = LSR(slope=slope, intercept=intercept, reaction=del_E, surf_species=E_surf, gas_species=E_gas) self.lsr_shomate = LSR(slope=slope, intercept=intercept, reaction=reaction_shomate, surf_species=species['surf'], gas_species=species['gas']) self.lsr_statmech = LSR(slope=slope, intercept=intercept, reaction=reaction_statmech, surf_species=species['surf'], gas_species=species['gas'])
def from_string(cls, reaction_str, species, species_delimiter='+', reaction_delimiter='=', notes=None, beta=1, is_adsorption=False, sticking_coeff=0.5, direction=None, id=None): """Create a reaction object using the reaction string Parameters ---------- reaction_str : str Reaction string. species : dict Dictionary using the names as keys. If you have a list of species, use pmutt.pmutt_list_to_dict to make a dict. species_delimiter : str, optional Delimiter that separate species. Leading and trailing spaces will be trimmed. Default is '+' reaction_delimiter : str, optional Delimiter that separate states of the reaction. Leading and trailing spaces will be trimmed. Default is '=' notes : str or dict, optional Other notes such as the source of the reaction. Default is None beta : float, optional Power to raise the temperature in the rate expression. Default is 1 is_adsorption : bool, optional If True, the reaction represents an adsorption. Default is False sticking_coeff : float, optional Sticking coefficient. Only relevant if ``is_adsorption`` is True. Default is 0.5 gas_phase : bool True if the reaction has only gas-phase species. This attribute is determined based on the reactants and products Returns ------- SurfaceReaction : :class:`~pmutt.omkm.SurfaceReaction` object """ rxn = Reaction.from_string(reaction_str=reaction_str, species=species, species_delimiter=species_delimiter, reaction_delimiter=reaction_delimiter) return cls(reactants=rxn.reactants, reactants_stoich=rxn.reactants_stoich, products=rxn.products, products_stoich=rxn.products_stoich, transition_state=rxn.transition_state, transition_state_stoich=rxn.transition_state_stoich, notes=notes, beta=beta, is_adsorption=is_adsorption, sticking_coeff=sticking_coeff, direction=direction, id=id)
def read_reactions(filename, species, species_delimiter='.', reaction_delimiter='>>', raise_error=True, raise_warning=True): """Reads reactions from RING output file. Parameters ---------- filename : str Input filename species : dict Dictionary using the names as keys. If you have a list of species, use pmutt.pmutt_list_to_dict to make a dict. species_delimiter : str, optional Delimiter that separate species. Leading and trailing spaces will be trimmed. Default is '.' reaction_delimiter : str, optional Delimiter that separate states of the reaction. Leading and trailing spaces will be trimmed. Default is '>>' raise_error : bool, optional If True, raises an error if the transition state is not located in species. Default is True raise_warning : bool, optional Only relevant if raise_error is False. Raises a warning if the transition state is not located in species. Default is True Returns ------- reactions : list of :class:`~pmutt.reaction.Reaction` objects Reactions """ rxns = [] with open(filename, 'r') as f_ptr: for line in f_ptr: # Skip lines that do not have a reaction if reaction_delimiter not in line: continue reaction_str = line.replace('\n', '') rxn = Reaction.from_string(reaction_str=reaction_str, species=species, species_delimiter=species_delimiter, reaction_delimiter=reaction_delimiter, raise_error=raise_error, raise_warning=raise_warning) rxns.append(rxn) return Reactions(reactions=rxns)
def setUp(self): self.species_dict = { 'H2O': Nasa(name='H2O', T_low=200., T_mid=1000., T_high=3500., elements={ 'H': 2, 'O': 1 }, a_low=[ 4.19864056E+00, -2.03643410E-03, 6.52040211E-06, -5.48797062E-09, 1.77197817E-12, -3.02937267E+04, -8.49032208E-01 ], a_high=[ 3.03399249E+00, 2.17691804E-03, -1.64072518E-07, -9.70419870E-11, 1.68200992E-14, -3.00042971E+04, 4.96677010E+00 ]), 'H2': Nasa(name='H2', T_low=200., T_mid=1000., T_high=3500., elements={'H': 2}, a_low=[ 2.34433112E+00, 7.98052075E-03, -1.94781510E-05, 2.01572094E-08, -7.37611761E-12, -9.17935173E+02, 6.83010238E-01 ], a_high=[ 3.33727920E+00, -4.94024731E-05, 4.99456778E-07, -1.79566394E-10, 2.00255376E-14, -9.50158922E+02, -3.20502331E+00 ]), 'O2': Nasa(name='O2', T_low=200., T_mid=1000., T_high=3500., elements={'O': 2}, a_low=[ 3.78245636E+00, -2.99673416E-03, 9.84730201E-06, -9.68129509E-09, 3.24372837E-12, -1.06394356E+03, 3.65767573E+00 ], a_high=[ 3.28253784E+00, 1.48308754E-03, -7.57966669E-07, 2.09470555E-10, -2.16717794E-14, -1.08845772E+03, 5.45323129E+00 ]), 'O': Nasa(name='O', T_low=200., T_mid=1000., T_high=3500., elements={'O': 1}, a_low=[ 3.16826710E+00, -3.27931884E-03, 6.64306396E-06, -6.12806624E-09, 2.11265971E-12, 2.91222592E+04, 2.05193346E+00 ], a_high=[ 2.56942078E+00, -8.59741137E-05, 4.19484589E-08, -1.00177799E-11, 1.22833691E-15, 2.92175791E+04, 4.78433864E+00 ]), 'H': Nasa(name='H', T_low=200., T_mid=1000., T_high=3500., elements={'H': 1}, a_low=[ 2.50000000E+00, 7.05332819E-13, -1.99591964E-15, 2.30081632E-18, -9.27732332E-22, 2.54736599E+04, -4.46682853E-01 ], a_high=[ 2.50000001E+00, -2.30842973E-11, 1.61561948E-14, -4.73515235E-18, 4.98197357E-22, 2.54736599E+04, -4.46682914E-01 ]), 'OH': Nasa(name='OH', T_low=200., T_mid=1000., T_high=3500., elements={ 'O': 1, 'H': 1 }, a_high=[ 3.09288767E+00, 5.48429716E-04, 1.26505228E-07, -8.79461556E-11, 1.17412376E-14, 3.85865700E+03, 4.47669610E+00 ], a_low=[ 3.99201543E+00, -2.40131752E-03, 4.61793841E-06, -3.88113333E-09, 1.36411470E-12, 3.61508056E+03, -1.03925458E-01 ]) } self.reactions = Reactions(reactions=[ Reaction.from_string('O+2H=H2O', self.species_dict), Reaction.from_string('O+H2=H2O', self.species_dict), Reaction.from_string('OH+H=H2O', self.species_dict), Reaction.from_string('OH+0.5H2=H2O', self.species_dict), Reaction.from_string('0.5O+2H=H2O', self.species_dict), Reaction.from_string('0.5O2+H2=H2O', self.species_dict) ]) self.reactions_dict = { 'class': "<class 'pmutt.reaction.Reactions'>", 'reactions': [{ 'class': "<class 'pmutt.reaction.Reaction'>", 'products': [{ 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 3.03399249, 0.00217691804, -1.64072518e-07, -9.7041987e-11, 1.68200992e-14, -30004.2971, 4.9667701 ], 'a_low': [ 4.19864056, -0.0020364341, 6.52040211e-06, -5.48797062e-09, 1.77197817e-12, -30293.7267, -0.849032208 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'H': 2, 'O': 1 }, 'name': 'H2O', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa' }], 'products_stoich': [1.0], 'reactants': [{ 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 2.56942078, -8.59741137e-05, 4.19484589e-08, -1.00177799e-11, 1.22833691e-15, 29217.5791, 4.78433864 ], 'a_low': [ 3.1682671, -0.00327931884, 6.64306396e-06, -6.12806624e-09, 2.11265971e-12, 29122.2592, 2.05193346 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'O': 1 }, 'name': 'O', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa' }, { 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 2.50000001, -2.30842973e-11, 1.61561948e-14, -4.73515235e-18, 4.98197357e-22, 25473.6599, -0.446682914 ], 'a_low': [ 2.5, 7.05332819e-13, -1.99591964e-15, 2.30081632e-18, -9.27732332e-22, 25473.6599, -0.446682853 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'H': 1 }, 'name': 'H', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa' }], 'reactants_stoich': [1.0, 2.0], 'transition_state': None, 'transition_state_stoich': None }, { 'class': "<class 'pmutt.reaction.Reaction'>", 'products': [{ 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 3.03399249, 0.00217691804, -1.64072518e-07, -9.7041987e-11, 1.68200992e-14, -30004.2971, 4.9667701 ], 'a_low': [ 4.19864056, -0.0020364341, 6.52040211e-06, -5.48797062e-09, 1.77197817e-12, -30293.7267, -0.849032208 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'H': 2, 'O': 1 }, 'name': 'H2O', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa' }], 'products_stoich': [1.0], 'reactants': [{ 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 2.56942078, -8.59741137e-05, 4.19484589e-08, -1.00177799e-11, 1.22833691e-15, 29217.5791, 4.78433864 ], 'a_low': [ 3.1682671, -0.00327931884, 6.64306396e-06, -6.12806624e-09, 2.11265971e-12, 29122.2592, 2.05193346 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'O': 1 }, 'name': 'O', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa' }, { 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 3.3372792, -4.94024731e-05, 4.99456778e-07, -1.79566394e-10, 2.00255376e-14, -950.158922, -3.20502331 ], 'a_low': [ 2.34433112, 0.00798052075, -1.9478151e-05, 2.01572094e-08, -7.37611761e-12, -917.935173, 0.683010238 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'H': 2 }, 'name': 'H2', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa' }], 'reactants_stoich': [1.0, 1.0], 'transition_state': None, 'transition_state_stoich': None }, { 'class': "<class 'pmutt.reaction.Reaction'>", 'products': [{ 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 3.03399249, 0.00217691804, -1.64072518e-07, -9.7041987e-11, 1.68200992e-14, -30004.2971, 4.9667701 ], 'a_low': [ 4.19864056, -0.0020364341, 6.52040211e-06, -5.48797062e-09, 1.77197817e-12, -30293.7267, -0.849032208 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'H': 2, 'O': 1 }, 'name': 'H2O', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa' }], 'products_stoich': [1.0], 'reactants': [{ 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 3.09288767, 0.000548429716, 1.26505228e-07, -8.79461556e-11, 1.17412376e-14, 3858.657, 4.4766961 ], 'a_low': [ 3.99201543, -0.00240131752, 4.61793841e-06, -3.88113333e-09, 1.3641147e-12, 3615.08056, -0.103925458 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'H': 1, 'O': 1 }, 'name': 'OH', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa', }, { 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 2.50000001, -2.30842973e-11, 1.61561948e-14, -4.73515235e-18, 4.98197357e-22, 25473.6599, -0.446682914 ], 'a_low': [ 2.5, 7.05332819e-13, -1.99591964e-15, 2.30081632e-18, -9.27732332e-22, 25473.6599, -0.446682853 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'H': 1 }, 'name': 'H', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa', }], 'reactants_stoich': [1.0, 1.0], 'transition_state': None, 'transition_state_stoich': None }, { 'class': "<class 'pmutt.reaction.Reaction'>", 'products': [{ 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 3.03399249, 0.00217691804, -1.64072518e-07, -9.7041987e-11, 1.68200992e-14, -30004.2971, 4.9667701 ], 'a_low': [ 4.19864056, -0.0020364341, 6.52040211e-06, -5.48797062e-09, 1.77197817e-12, -30293.7267, -0.849032208 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'H': 2, 'O': 1 }, 'name': 'H2O', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa', }], 'products_stoich': [1.0], 'reactants': [{ 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 3.09288767, 0.000548429716, 1.26505228e-07, -8.79461556e-11, 1.17412376e-14, 3858.657, 4.4766961 ], 'a_low': [ 3.99201543, -0.00240131752, 4.61793841e-06, -3.88113333e-09, 1.3641147e-12, 3615.08056, -0.103925458 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'H': 1, 'O': 1 }, 'name': 'OH', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa', }, { 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 3.3372792, -4.94024731e-05, 4.99456778e-07, -1.79566394e-10, 2.00255376e-14, -950.158922, -3.20502331 ], 'a_low': [ 2.34433112, 0.00798052075, -1.9478151e-05, 2.01572094e-08, -7.37611761e-12, -917.935173, 0.683010238 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'H': 2 }, 'name': 'H2', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa', }], 'reactants_stoich': [1.0, 0.5], 'transition_state': None, 'transition_state_stoich': None }, { 'class': "<class 'pmutt.reaction.Reaction'>", 'products': [{ 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 3.03399249, 0.00217691804, -1.64072518e-07, -9.7041987e-11, 1.68200992e-14, -30004.2971, 4.9667701 ], 'a_low': [ 4.19864056, -0.0020364341, 6.52040211e-06, -5.48797062e-09, 1.77197817e-12, -30293.7267, -0.849032208 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'H': 2, 'O': 1 }, 'name': 'H2O', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa', }], 'products_stoich': [1.0], 'reactants': [{ 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 2.56942078, -8.59741137e-05, 4.19484589e-08, -1.00177799e-11, 1.22833691e-15, 29217.5791, 4.78433864 ], 'a_low': [ 3.1682671, -0.00327931884, 6.64306396e-06, -6.12806624e-09, 2.11265971e-12, 29122.2592, 2.05193346 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'O': 1 }, 'name': 'O', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa', }, { 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 2.50000001, -2.30842973e-11, 1.61561948e-14, -4.73515235e-18, 4.98197357e-22, 25473.6599, -0.446682914 ], 'a_low': [ 2.5, 7.05332819e-13, -1.99591964e-15, 2.30081632e-18, -9.27732332e-22, 25473.6599, -0.446682853 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'H': 1 }, 'name': 'H', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa', }], 'reactants_stoich': [0.5, 2.0], 'transition_state': None, 'transition_state_stoich': None }, { 'class': "<class 'pmutt.reaction.Reaction'>", 'products': [{ 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 3.03399249, 0.00217691804, -1.64072518e-07, -9.7041987e-11, 1.68200992e-14, -30004.2971, 4.9667701 ], 'a_low': [ 4.19864056, -0.0020364341, 6.52040211e-06, -5.48797062e-09, 1.77197817e-12, -30293.7267, -0.849032208 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'H': 2, 'O': 1 }, 'name': 'H2O', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa', }], 'products_stoich': [1.0], 'reactants': [{ 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 3.28253784, 0.00148308754, -7.57966669e-07, 2.09470555e-10, -2.16717794e-14, -1088.45772, 5.45323129 ], 'a_low': [ 3.78245636, -0.00299673416, 9.84730201e-06, -9.68129509e-09, 3.24372837e-12, -1063.94356, 3.65767573 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'O': 2 }, 'name': 'O2', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa', }, { 'T_high': 3500.0, 'T_low': 200.0, 'T_mid': 1000.0, 'a_high': [ 3.3372792, -4.94024731e-05, 4.99456778e-07, -1.79566394e-10, 2.00255376e-14, -950.158922, -3.20502331 ], 'a_low': [ 2.34433112, 0.00798052075, -1.9478151e-05, 2.01572094e-08, -7.37611761e-12, -917.935173, 0.683010238 ], 'class': "<class 'pmutt.empirical.nasa.Nasa'>", 'elements': { 'H': 2 }, 'name': 'H2', 'notes': None, 'phase': None, 'statmech_model': None, 'misc_models': None, 'cat_site': None, 'n_sites': None, 'smiles': None, 'type': 'nasa', }], 'reactants_stoich': [0.5, 1.0], 'transition_state': None, 'transition_state_stoich': None }] } species_pathway = { 'A': StatMech(G=1., **presets['constant']), 'A_TS1': StatMech(G=3., **presets['constant']), 'A_TS2': StatMech(G=2., **presets['constant']), 'B': StatMech(G=-1., **presets['constant']), 'C': StatMech(G=2., **presets['constant']), 'C_TS': StatMech(G=2.5, **presets['constant']), 'D': StatMech(G=0., **presets['constant']), } self.rxn_pathway1 = Reactions(reactions=[ Reaction.from_string('A = A_TS1 = B', species_pathway), Reaction.from_string('B = C', species_pathway), Reaction.from_string('C = C_TS = D', species_pathway) ]) self.rxn_pathway2 = Reactions(reactions=[ Reaction.from_string('A = A_TS2 = B', species_pathway), Reaction.from_string('B = C', species_pathway), Reaction.from_string('C = C_TS = D', species_pathway) ])
rxn = Reaction(reactants=[species_dict['H2'], species_dict['O2']], reactants_stoich=[1., 0.5], products=[species_dict['H2O']], products_stoich=[1.], transition_state=species_dict['H2O_TS'], transition_state_stoich=[1.]) # (Optional) Converting a Reaction object to a string will give its stoichiometric formula print('Creating Reaction object manually: {}'.format(rxn)) # ## Initialize Reaction Using Strings # Initializing manually is cumbersome and prone to error. Instead, we can use ``.from_string()`` to initialize the reaction more easily. # In[4]: rxn = Reaction.from_string(reaction_str='H2 + 0.5O2 = H2O_TS = H2O', species=species_dict) # See that you get the same stoichiometry as before print('Creating Reaction object using default string notation: {}'.format(rxn)) # You can specify the notation for the reaction! rxn = Reaction.from_string(reaction_str='H2 ++ 0.5O2 --> H2O_TS --> H2O', species=species_dict, species_delimiter='++', reaction_delimiter='-->') # When reprinting it, it will converts it to the standard notation print('Creating Reaction object using custom string notation: {}'.format(rxn)) # ## Calculate Thermodynamic Reaction Properties # With the reaction object specified, we can now calculate reaction properties. Let us calculate the standard formation enthalpy and standard entropy.
200.123762, 196.698042, 195.736534, 75.269065, 72.94012, 70.402739, 68.651958, 65.289743, 64.556735, 63.904694, 60.051442, 58.698334, 55.589005, 52.608038, 43.883525 ], **presets['harmonic']), } # ## Create Reactions for Phase Diagram # The reactions will be initialized and put in a list. Notice that the stoichiometric coefficient of CO changes for higher coverages. If you are unfamiliar with initializing reactions, see the Reactions example. # In[2]: from pmutt.reaction import Reaction reactions = [ Reaction.from_string('Pt = Pt', species), # Clean surface Reaction.from_string('Pt + CO = CO(S) 1/16ML fcc', species), Reaction.from_string('Pt + CO = CO(S) 1/16ML br', species), Reaction.from_string('Pt + CO = CO(S) 1/16ML top', species), Reaction.from_string('Pt + 2CO = CO(S) 1/8ML', species), Reaction.from_string('Pt + 3CO = CO(S) 3/16ML', species), Reaction.from_string('Pt + 8CO = CO(S) 1/2ML', species) ] # ## Create PhaseDiagram Object # Now we have everything we need to create the ``PhaseDiagram`` object. # In[3]: from pmutt.reaction.phasediagram import PhaseDiagram
# You can also evaluate reactions properties. The most straightforward way to do this is to initialize using strings. # In[15]: from pmutt.io.thermdat import read_thermdat from pmutt import pmutt_list_to_dict from pmutt.reaction import Reaction # Get a dictionary of species thermdat_H2O_path = os.path.join(notebook_folder, 'thermdat_H2O') species_list = read_thermdat(thermdat_H2O_path) species_dict = pmutt_list_to_dict(species_list) # Initialize the reaction rxn_H2O = Reaction.from_string('H2 + 0.5O2 = H2O', species=species_dict) # Calculate reaction properties H_rxn = rxn_H2O.get_delta_H(T=298., units='kJ/mol') S_rxn = rxn_H2O.get_delta_S(T=298., units='J/mol/K') print('H_rxn(T=298) = {:.1f} kJ/mol'.format(H_rxn)) print('S_rxn(T=298) = {:.2f} J/mol/K'.format(S_rxn)) # ## Exercise # Write a script to calculate the Enthalpy of adsorption (in kcal/mol) of H2O on Cu(111) at T = 298 K. Some important details are given below. # # ### Information Required # #### H2O: # - ideal gas # - atoms: You can use "ase.build.molecule" to generate a water molecule like we did with ethane, propane, and butane.
-3.3518122405333548e-09, 7.58446718337381e-13, -191086.2004520406, 0.6858235504924011 ]), 'NH3': Shomate(name='NH3', T_low=300., T_high=1000., a=[ 18.792357134351683, 44.82725349479501, -10.05898449447048, 0.3711633831565547, 0.2969942466370908, -1791.225746924463, 203.9035662274934, 1784.714638346206 ]), } # Define the formation of water reaction rxn = Reaction.from_string('1.5H2 + 0.5N2 = NH3', species) # Calculate forward change in enthalpy H_rxn_fwd = rxn.get_delta_H(units='kcal/mol', T=300.) print('Delta H_fwd(T = 300 K) = {:.1f} kcal/mol'.format(H_rxn_fwd)) # Calculate reverse change in enthalpy H_rxn_rev = rxn.get_delta_H(units='kcal/mol', T=300., rev=True) print('Delta H_rev(T = 300 K) = {:.1f} kcal/mol'.format(H_rxn_rev)) # Calculate enthalpy of reactants H_react = rxn.get_H_state(units='kcal/mol', T=300., state='reactants') print('H_reactants(T = 300 K) = {:.1f} kcal/mol'.format(H_react)) # <a id='section_11'></a>
atoms=molecule('H2O'), potentialenergy=-14.2209, symmetrynumber=2, spin=0, references=refs, vib_wavenumbers=[3825.434, 3710.264, 1582.432], **presets['idealgas']) H2O_TS_statmech = StatMech(name='H2O', elements={ 'H': 2, 'O': 1 }, phase='G', atoms=molecule('H2O'), potentialenergy=0., symmetrynumber=2, spin=0, references=refs, vib_wavenumbers=[3825.434, 3710.264, 1582.432], **presets['idealgas']) species = { 'H2': H2_shomate, 'H2O': H2O_statmech, 'O2': O2_nasa, 'H2O_TS': H2O_TS_statmech, } rxn = Reaction.from_string('H2 + 0.5O2 = H2O_TS = H2O', species)
4.050329990684662, -0.0029677854067980108, 5.323485005316287e-06, -3.3518122405333548e-09, 7.58446718337381e-13, -191086.2004520406, 0.6858235504924011 ]), 'NH3': Shomate(name='NH3', T_low=300., T_high=1000., a=[ 18.792357134351683, 44.82725349479501, -10.05898449447048, 0.3711633831565547, 0.2969942466370908, -1791.225746924463, 203.9035662274934, 1784.714638346206 ]), } # Define the formation of ammonia reaction rxn = Reaction.from_string('1.5H2 + 0.5N2 = NH3', species) # Now we can calculate thermodynamic properties of the reaction. # In[13]: '''Forward change in enthalpy''' H_rxn_fwd = rxn.get_delta_H(units='kcal/mol', T=300.) print('Delta H_fwd(T = 300 K) = {:.1f} kcal/mol'.format(H_rxn_fwd)) '''Reverse change in entropy''' S_rxn_rev = rxn.get_delta_S(units='cal/mol/K', T=300., rev=True) print('Delta S_rev(T = 300 K) = {:.1f} cal/mol/K'.format(S_rxn_rev)) '''Gibbs energy of reactants''' G_react = rxn.get_G_state(units='kcal/mol', T=300., state='reactants') print('G_reactants(T = 300 K) = {:.1f} kcal/mol'.format(G_react))
def setUp(self): self.T = c.T0('K') # Factor to convert potential energy to dimensionless number dim_factor = c.R('eV/K')*self.T self.m = 0.5 # BEP Slope self.c = 20. # BEP Intercept in kcal/mol species = { 'H2': StatMech(name='H2', potentialenergy=2.*dim_factor, **presets['electronic']), 'O2': StatMech(name='O2', potentialenergy=4.*dim_factor, **presets['electronic']), 'H2O': StatMech(name='H2O', potentialenergy=3.*dim_factor, **presets['electronic']), 'BEP': BEP(slope=self.m, intercept=self.c, name='BEP') } self.rxn_delta_H = Reaction.from_string( reaction_str='H2 + 0.5O2 = BEP = H2O', species=species, bep_descriptor='delta_H') self.bep_delta_H = self.rxn_delta_H.transition_state[0] rxn_rev_delta_H = Reaction.from_string( reaction_str='H2 + 0.5O2 = BEP = H2O', species=species, bep_descriptor='rev_delta_H') self.bep_rev_delta_H = rxn_rev_delta_H.transition_state[0] rxn_reactants_H = Reaction.from_string( reaction_str='H2 + 0.5O2 = BEP = H2O', species=species, bep_descriptor='reactants_H') self.bep_reactants_H = rxn_reactants_H.transition_state[0] rxn_products_H = Reaction.from_string( reaction_str='H2 + 0.5O2 = BEP = H2O', species=species, bep_descriptor='products_H') self.bep_products_H = rxn_products_H.transition_state[0] self.rxn_delta_E = Reaction.from_string( reaction_str='H2 + 0.5O2 = BEP = H2O', species=species, bep_descriptor='delta_E') self.bep_delta_E = self.rxn_delta_E.transition_state[0] rxn_rev_delta_E = Reaction.from_string( reaction_str='H2 + 0.5O2 = BEP = H2O', species=species, bep_descriptor='rev_delta_E') self.bep_rev_delta_E = rxn_rev_delta_E.transition_state[0] rxn_reactants_E = Reaction.from_string( reaction_str='H2 + 0.5O2 = BEP = H2O', species=species, bep_descriptor='reactants_E') self.bep_reactants_E = rxn_reactants_E.transition_state[0] rxn_products_E = Reaction.from_string( reaction_str='H2 + 0.5O2 = BEP = H2O', species=species, bep_descriptor='products_E') self.bep_products_E = rxn_products_E.transition_state[0]
'O2': O2, } # (Optional) Print the species dictionary pprint(species) # ## Create Reactions for Phase Diagram # The reactions will be initialized and put in a list. Notice that the stiochiometric coefficient of O2 in all reactions is 1 to ensure consistency. If you are unfamiliar with initializing reactions, see the reactions example. # In[2]: from pmutt.reaction import Reaction reactions = [ Reaction.from_string(reaction_str='2Fe+O2=2FeO', species=species), Reaction.from_string(reaction_str='{}Fe+O2={}Fe2O3'.format( 4. / 3., 2. / 3.), species=species), Reaction.from_string(reaction_str='1.5Fe+O2=0.5Fe3O4', species=species) ] # ## Create PhaseDiagram Object # Now we have everything we need to create the ``PhaseDiagram`` object. # In[3]: from pmutt.reaction.phasediagram import PhaseDiagram phase_diagram = PhaseDiagram(reactions=reactions)
def from_string(cls, reaction_str, species, species_delimiter='+', reaction_delimiter='=', notes=None, A=None, beta=1, Ea=None, is_adsorption=False, sticking_coeff=0.5, direction=None, id=None, use_motz_wise=False): """Create a reaction object using the reaction string Parameters ---------- reaction_str : str Reaction string. species : dict Dictionary using the names as keys. If you have a list of species, use pmutt.pmutt_list_to_dict to make a dict. species_delimiter : str, optional Delimiter that separate species. Leading and trailing spaces will be trimmed. Default is '+' reaction_delimiter : str, optional Delimiter that separate states of the reaction. Leading and trailing spaces will be trimmed. Default is '=' notes : str or dict, optional Other notes such as the source of the reaction. Default is None A : float, optional Pre-exponential constant. If not specified, uses reaction to determine value. beta : float, optional Power to raise the temperature in the rate expression. Default is 1 if ``is_adsorption`` is False, 0 if ``is_adsorption`` is True. Ea : float, optional Activation energy. If not specified, uses reaction to determine value. is_adsorption : bool, optional If True, the reaction represents an adsorption. Default is False sticking_coeff : float, optional Sticking coefficient. Only relevant if ``is_adsorption`` is True. Default is 0.5 gas_phase : bool True if the reaction has only gas-phase species. This attribute is determined based on the reactants and products use_motz_wise : bool, optional Used when generating OpenMKM YAML file. If True, uses Motz-Wise correction to sticking coefficient. Only applicable to adsorption reactions. Default is False. Returns ------- SurfaceReaction : :class:`~pmutt.omkm.SurfaceReaction` object """ rxn = Reaction.from_string(reaction_str=reaction_str, species=species, species_delimiter=species_delimiter, reaction_delimiter=reaction_delimiter) return cls(reactants=rxn.reactants, reactants_stoich=rxn.reactants_stoich, products=rxn.products, products_stoich=rxn.products_stoich, transition_state=rxn.transition_state, transition_state_stoich=rxn.transition_state_stoich, notes=notes, A=A, beta=beta, Ea=Ea, is_adsorption=is_adsorption, sticking_coeff=sticking_coeff, direction=direction, id=id, use_motz_wise=use_motz_wise)