-
Notifications
You must be signed in to change notification settings - Fork 227
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adapt solver/reactor object syntax to deal with variable condition re…
…actors Also adaption of conversion calculations and return type for simulate so that the time and conversion can be put into the RMG_Memory objects. Addition of sensConditions for specifying the conditions under, which to do sensitivity analysis.
- Loading branch information
1 parent
0fc6f86
commit 031b93c
Showing
6 changed files
with
146 additions
and
84 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -188,7 +188,7 @@ cdef class ReactionSystem(DASx): | |
|
||
cpdef initializeModel(self, list coreSpecies, list coreReactions, list edgeSpecies, list edgeReactions, list surfaceSpecies=None, | ||
list surfaceReactions=None, list pdepNetworks=None, atol=1e-16, rtol=1e-8, sensitivity=False, | ||
sens_atol=1e-6, sens_rtol=1e-4, filterReactions=False): | ||
sens_atol=1e-6, sens_rtol=1e-4, filterReactions=False, dict conditions=None): | ||
""" | ||
Initialize a simulation of the reaction system using the provided | ||
kinetic model. You will probably want to create your own version of this | ||
|
@@ -200,7 +200,21 @@ cdef class ReactionSystem(DASx): | |
if surfaceReactions is None: | ||
surfaceReactions = [] | ||
|
||
|
||
if conditions: | ||
isConc = hasattr(self,'initialConcentrations') | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
mjohnson541
Author
Contributor
|
||
keys = conditions.keys() | ||
if 'T' in keys and hasattr(self,'T'): | ||
self.T = Quantity(conditions['T'],'K') | ||
if 'P' in keys and hasattr(self,'P'): | ||
self.P = Quantity(conditions['P'],'Pa') | ||
for k in keys: | ||
if isConc: | ||
if k in self.initialConcentrations.keys(): | ||
self.initialConcentrations[k] = conditions[k] #already in SI units | ||
else: | ||
if k in self.initialMoleFractions.keys(): | ||
self.initialMoleFractions[k] = conditions[k] | ||
|
||
self.numCoreSpecies = len(coreSpecies) | ||
self.numCoreReactions = len(coreReactions) | ||
self.numEdgeSpecies = len(edgeSpecies) | ||
|
@@ -520,7 +534,7 @@ cdef class ReactionSystem(DASx): | |
cpdef simulate(self, list coreSpecies, list coreReactions, list edgeSpecies, | ||
list edgeReactions,list surfaceSpecies, list surfaceReactions, | ||
list pdepNetworks=None, bool prune=False, bool sensitivity=False, list sensWorksheet=None, object modelSettings=None, | ||
object simulatorSettings=None): | ||
object simulatorSettings=None, dict conditions=None): | ||
""" | ||
Simulate the reaction system with the provided reaction model, | ||
consisting of lists of core species, core reactions, edge species, and | ||
|
@@ -549,7 +563,7 @@ cdef class ReactionSystem(DASx): | |
cdef bint terminated | ||
cdef object maxSpecies, maxNetwork | ||
cdef int i, j, k | ||
cdef numpy.float64_t maxSurfaceDifLnAccumNum, maxSurfaceSpeciesRate | ||
cdef numpy.float64_t maxSurfaceDifLnAccumNum, maxSurfaceSpeciesRate, conversion | ||
cdef int maxSurfaceAccumReactionIndex, maxSurfaceSpeciesIndex | ||
cdef object maxSurfaceAccumReaction, maxSurfaceSpecies | ||
cdef numpy.ndarray[numpy.float64_t,ndim=1] surfaceSpeciesProduction, surfaceSpeciesConsumption | ||
|
@@ -563,7 +577,7 @@ cdef class ReactionSystem(DASx): | |
# cython declations for sensitivity analysis | ||
cdef numpy.ndarray[numpy.int_t, ndim=1] sensSpeciesIndices | ||
cdef numpy.ndarray[numpy.float64_t, ndim=1] moleSens, dVdk, normSens | ||
cdef list time_array, normSens_array, newSurfaceReactions, newSurfaceReactionInds, newObjects, newObjectInds, conversions | ||
cdef list time_array, normSens_array, newSurfaceReactions, newSurfaceReactionInds, newObjects, newObjectInds | ||
|
||
zeroProduction = False | ||
zeroConsumption = False | ||
|
@@ -609,7 +623,7 @@ cdef class ReactionSystem(DASx): | |
|
||
self.initializeModel(coreSpecies, coreReactions, edgeSpecies, edgeReactions, surfaceSpecies, surfaceReactions, | ||
pdepNetworks, absoluteTolerance, relativeTolerance, sensitivity, sensitivityAbsoluteTolerance, | ||
sensitivityRelativeTolerance, filterReactions) | ||
sensitivityRelativeTolerance, filterReactions,conditions) | ||
|
||
prunableSpeciesIndices = self.prunableSpeciesIndices | ||
prunableNetworkIndices = self.prunableNetworkIndices | ||
|
@@ -630,6 +644,7 @@ cdef class ReactionSystem(DASx): | |
maxNetwork = None | ||
maxNetworkRate = 0.0 | ||
iteration = 0 | ||
conversion = 0.0 | ||
|
||
maxEdgeSpeciesRateRatios = self.maxEdgeSpeciesRateRatios | ||
maxNetworkLeakRateRatios = self.maxNetworkLeakRateRatios | ||
|
@@ -667,12 +682,11 @@ cdef class ReactionSystem(DASx): | |
|
||
logging.info('Resurrecting Model...') | ||
|
||
conversions = [] | ||
|
||
conversion = 0.0 | ||
for term in self.termination: | ||
if isinstance(term, TerminationConversion): | ||
index = speciesIndex[term.species] | ||
conversions.append(1-(y_coreSpecies[index] / y0[index])) | ||
conversion = 1-(y_coreSpecies[index] / y0[index]) | ||
|
||
if invalidObjects == []: | ||
#species flux criterion | ||
|
@@ -695,7 +709,7 @@ cdef class ReactionSystem(DASx): | |
invalidObjects.append(obj) | ||
|
||
if invalidObjects != []: | ||
return False,True,invalidObjects,surfaceSpecies,surfaceReactions,self.t,conversions | ||
return False,True,invalidObjects,surfaceSpecies,surfaceReactions,self.t,conversion | ||
else: | ||
logging.error('Model Resurrection has failed') | ||
logging.error("Core species names: {!r}".format([getSpeciesIdentifier(s) for s in coreSpecies])) | ||
|
@@ -1031,7 +1045,6 @@ cdef class ReactionSystem(DASx): | |
logging.info('terminating simulation due to interrupt...') | ||
break | ||
|
||
conversions = [] | ||
# Finish simulation if any of the termination criteria are satisfied | ||
for term in self.termination: | ||
if isinstance(term, TerminationTime): | ||
|
@@ -1042,7 +1055,7 @@ cdef class ReactionSystem(DASx): | |
break | ||
elif isinstance(term, TerminationConversion): | ||
index = speciesIndex[term.species] | ||
conversions.append(1-(y_coreSpecies[index] / y0[index])) | ||
conversion = 1-(y_coreSpecies[index] / y0[index]) | ||
if 1 - (y_coreSpecies[index] / y0[index]) > term.conversion: | ||
terminated = True | ||
logging.info('At time {0:10.4e} s, reached target termination conversion: {1:f} of {2}'.format(self.t,term.conversion,term.species)) | ||
|
@@ -1088,7 +1101,7 @@ cdef class ReactionSystem(DASx): | |
|
||
# Return the invalid object (if the simulation was invalid) or None | ||
# (if the simulation was valid) | ||
return terminated, False, invalidObjects, surfaceSpecies, surfaceReactions, self.t, conversions | ||
return terminated, False, invalidObjects, surfaceSpecies, surfaceReactions, self.t, conversion | ||
|
||
cpdef logRates(self, double charRate, object species, double speciesRate, double maxDifLnAccumNum, object network, double networkRate): | ||
""" | ||
|
Oops, something went wrong.
Perhaps this should be done in an inherited sub class, rather than having the base class try to figure out whether it is dealing with concentrations or mole fractions? Ideally the base class would only have things common to all the reactor types. Could it call set_initial_conditions or something like it? (trying to deal with a RMG-Cat which has a new reactor type which also has initial surface coverages, etc.)