Skip to content

Commit ad16c47

Browse files
committed
added ElectrodeReactor to input.py
1 parent 3117b33 commit ad16c47

1 file changed

Lines changed: 105 additions & 0 deletions

File tree

rmgpy/rmg/input.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
from rmgpy.solver.mbSampled import MBSampledReactor
4545
from rmgpy.solver.simple import SimpleReactor
4646
from rmgpy.solver.surface import SurfaceReactor
47+
from rmgpy.solver.electrode import ElectrodeReactor
4748
from rmgpy.util import as_list
4849
from rmgpy.data.surface import MetalDatabase
4950

@@ -521,6 +522,109 @@ def surface_reactor(temperature,
521522
rmg.reaction_systems.append(system)
522523
system.log_initial_conditions(number=len(rmg.reaction_systems))
523524

525+
# Reaction systems
526+
def electrode_reactor(potential,
527+
temperature,
528+
initialPressure,
529+
initialGasMoleFractions,
530+
initialSurfaceCoverages,
531+
surfaceVolumeRatio,
532+
nSims=4,
533+
terminationConversion=None,
534+
terminationTime=None,
535+
terminationRateRatio=None,
536+
sensitivity=None,
537+
sensitivityThreshold=1e-3):
538+
logging.debug('Found electrodeReactor reaction system')
539+
540+
for value in list(initialGasMoleFractions.values()):
541+
if value < 0:
542+
raise InputError('Initial mole fractions cannot be negative.')
543+
total_initial_moles = sum(initialGasMoleFractions.values())
544+
if total_initial_moles != 1:
545+
logging.warning('Initial gas mole fractions do not sum to one; renormalizing.')
546+
logging.debug('')
547+
logging.debug('Original composition:')
548+
for spec, molfrac in initialGasMoleFractions.items():
549+
logging.debug("{0} = {1}".format(spec, molfrac))
550+
for spec in initialGasMoleFractions:
551+
initialGasMoleFractions[spec] /= total_initial_moles
552+
logging.info('')
553+
logging.debug('Normalized mole fractions:')
554+
for spec, molfrac in initialGasMoleFractions.items():
555+
logging.debug("{0} = {1}".format(spec, molfrac))
556+
557+
if not isinstance(potential, list):
558+
potential = Quantity(potential)
559+
else:
560+
if len(potential) != 2:
561+
raise InputError('potential ranges can either be in the form of (number,units) or a list with 2 entries '
562+
'of the same format')
563+
potential = [Quantity(v) for v in potential]
564+
565+
if not isinstance(temperature, list):
566+
T = Quantity(temperature)
567+
else:
568+
if len(temperature) != 2:
569+
raise InputError('Temperature ranges can either be in the form of (number,units) or a list with 2 entries '
570+
'of the same format')
571+
T = [Quantity(t) for t in temperature]
572+
573+
if not isinstance(initialPressure, list):
574+
P_initial = Quantity(initialPressure)
575+
else:
576+
if len(initialPressure) != 2:
577+
raise InputError('Initial pressure ranges can either be in the form ''of (number,units) or a list with '
578+
'2 entries of the same format')
579+
P_initial = [Quantity(p) for p in initialPressure]
580+
581+
if not isinstance(temperature, list) and not isinstance(initialPressure, list):
582+
nSims = 1
583+
if any([isinstance(x, list) for x in initialGasMoleFractions.values()]) or \
584+
any([isinstance(x, list) for x in initialSurfaceCoverages.values()]):
585+
raise NotImplementedError("Can't do ranges on species concentrations for surface reactors yet.")
586+
587+
termination = []
588+
if terminationConversion is not None:
589+
for spec, conv in terminationConversion.items():
590+
termination.append(TerminationConversion(species_dict[spec], conv))
591+
if terminationTime is not None:
592+
termination.append(TerminationTime(Quantity(terminationTime)))
593+
if terminationRateRatio is not None:
594+
termination.append(TerminationRateRatio(terminationRateRatio))
595+
if len(termination) == 0:
596+
raise InputError('No termination conditions specified for reaction system #{0}.'.format(len(rmg.reaction_systems) + 2))
597+
598+
sensitive_species = []
599+
if sensitivity:
600+
for spec in sensitivity:
601+
sensitive_species.append(species_dict[spec])
602+
if not isinstance(T, list):
603+
sensitivityTemperature = T
604+
if not isinstance(initialPressure, list):
605+
sensitivityPressure = initialPressure
606+
sens_conditions = None
607+
if sensitivity:
608+
raise NotImplementedError("Can't currently do sensitivity with surface reactors.")
609+
# The problem is inside base.pyx it reads the dictionary 'sensConditions'
610+
# and guesses whether they're all concentrations (liquid reactor) or
611+
# mole fractions (simple reactor). In fact, some may be surface coverages.
612+
613+
system = ElectrodeReactor(potential=potential,
614+
T=T,
615+
P_initial=P_initial,
616+
initial_gas_mole_fractions=initialGasMoleFractions,
617+
initial_surface_coverages=initialSurfaceCoverages,
618+
surface_volume_ratio=surfaceVolumeRatio,
619+
surface_site_density=rmg.surface_site_density,
620+
n_sims=nSims,
621+
termination=termination,
622+
sensitive_species=sensitive_species,
623+
sensitivity_threshold=sensitivityThreshold,
624+
sens_conditions=sens_conditions)
625+
rmg.reaction_systems.append(system)
626+
system.log_initial_conditions(number=len(rmg.reaction_systems))
627+
524628

525629
# Reaction systems
526630
def mb_sampled_reactor(temperature,
@@ -967,6 +1071,7 @@ def read_input_file(path, rmg0):
9671071
'simpleReactor': simple_reactor,
9681072
'liquidReactor': liquid_reactor,
9691073
'surfaceReactor': surface_reactor,
1074+
'electrodeReactor': electrode_reactor,
9701075
'mbsampledReactor': mb_sampled_reactor,
9711076
'simulator': simulator,
9721077
'solvation': solvation,

0 commit comments

Comments
 (0)