Ejemplo n.º 1
0
def execute(inputFile, options):
	"""
	Generate a reaction model for the set of reaction systems specified in an 
	input file at location `inputFile`. Output and temporary files will be 
	placed in the directories `outputDir` and `scratchDir`, respectively; if
	either of these are empty strings, the corresponding files will be placed
	in the same directory as the input file. The `libraryDir` parameter can be
	used to specify additional directories to search for RMG databases. The
	`verbose` parameter is an integer specifying the amount of log text seen
	at the console; the levels correspond to those of the :data:`logging` module.
	"""
	
	# Set directories
	settings.outputDirectory = options.outputDirectory
	settings.scratchDirectory = options.scratchDirectory
	settings.libraryDirectory = options.libraryDirectory

	# Save initialization time
	settings.initializationTime = time.time()

	# Set up log (uses stdout and a file)
	initializeLog(options.verbose)
	
	# Log start timestamp
	logging.info('RMG execution initiated at ' + time.asctime() + '\n')
	
	# Print out RMG header
	printRMGHeader()
	
	# Make output subdirectories
	plotDir = os.path.join(settings.outputDirectory, 'plot')
	if os.path.exists(plotDir):
		for f in os.listdir(plotDir):
			os.remove(plotDir + '/' + f)
		os.rmdir(plotDir)
	os.mkdir(plotDir)

	specDir = os.path.join(settings.outputDirectory, 'species')
	if os.path.exists(specDir):
		for f in os.listdir(specDir):
			os.remove(specDir + '/' + f)
		os.rmdir(specDir)
	os.mkdir(specDir)

	# Read input file
	reactionModel, coreSpecies, reactionSystems = io.readInputFile(inputFile)
	
	# Initialize reaction model
	if options.restart:
		import cPickle
		logging.info('Loading previous restart file...')
		f = open(os.path.join(settings.outputDirectory,'restart.pkl'), 'rb')
		species.speciesList = cPickle.load(f)
		species.speciesCounter = cPickle.load(f)
		reaction.reactionList = cPickle.load(f)
		reactionModel = cPickle.load(f)
		reactionSystems = cPickle.load(f)
		f.close()
		options.restart = False # have already restarted
	else:
		reactionModel.initialize(coreSpecies)

	# RMG execution statistics
	coreSpeciesCount = []
	coreReactionCount = []
	edgeSpeciesCount = []
	edgeReactionCount = []
	execTime = []
	restartSize = []
	memoryUse = []

	# Main RMG loop
	done = False
	while not done:

		done = True
		speciesToAdd = []
		for index, reactionSystem in enumerate(reactionSystems):
			
			# Conduct simulation
			logging.info('Conducting simulation of reaction system %s...' % (index+1))
			t, y, dydt, valid, spec = reactionSystem.simulate(reactionModel)

			# Postprocess results
			logging.info('Saving simulation results for reaction system %s...' % (index+1))
			reactionSystem.postprocess(reactionModel, t, y, dydt, str(index+1))

			# If simulation is invalid, note which species should be added to
			# the core
			if not valid:
				speciesToAdd.append(spec)
				done = False

		# Add the notes species to the core
		speciesToAdd = list(set(speciesToAdd))
		for spec in speciesToAdd:
			reactionModel.enlarge(spec)
		
		# Save the restart file
		import cPickle
		logging.info('Saving restart file...')
		f = open(os.path.join(settings.outputDirectory,'restart.pkl'), 'wb')
		cPickle.dump(species.speciesList, f)
		cPickle.dump(species.speciesCounter, f)
		cPickle.dump(reaction.reactionList, f)
		cPickle.dump(reactionModel, f)
		cPickle.dump(reactionSystems, f)
		f.close()

		if not done:
			logging.info('Updating RMG execution statistics...')
			# Update RMG execution statistics
			coreSpeciesCount.append(len(reactionModel.core.species))
			coreReactionCount.append(len(reactionModel.core.reactions))
			edgeSpeciesCount.append(len(reactionModel.edge.species))
			edgeReactionCount.append(len(reactionModel.edge.reactions))
			execTime.append(time.time() - settings.initializationTime)
			from guppy import hpy
			hp = hpy()
			memoryUse.append(hp.heap().size / 1.0e6)
			logging.debug('Execution time: %s s' % (execTime[-1]))
			logging.debug('Memory used: %s MB' % (memoryUse[-1]))
			restartSize.append(os.path.getsize(os.path.join(settings.outputDirectory,'restart.pkl')) / 1.0e6)
			generateExecutionPlots(execTime, coreSpeciesCount, coreReactionCount, edgeSpeciesCount, edgeReactionCount, memoryUse, restartSize)

		logging.info('')


	# Write output file
	logging.info('MODEL GENERATION COMPLETED')
	logging.info('')
	logging.info('The final model core has %s species and %s reactions' % (len(reactionModel.core.species), len(reactionModel.core.reactions)))
	logging.info('The final model edge has %s species and %s reactions' % (len(reactionModel.edge.species), len(reactionModel.edge.reactions)))
	io.writeOutputFile(os.path.join(settings.outputDirectory,'output.xml'), reactionModel, reactionSystems)

	# Log end timestamp
	logging.info('RMG execution terminated at ' + time.asctime())
Ejemplo n.º 2
0
	plotDir = os.path.join(settings.outputDirectory, 'plot')
	if os.path.exists(plotDir):
		for f in os.listdir(plotDir):
			os.remove(plotDir + '/' + f)
		os.rmdir(plotDir)
	os.mkdir(plotDir)

	specDir = os.path.join(settings.outputDirectory, 'species')
	if os.path.exists(specDir):
		for f in os.listdir(specDir):
			os.remove(specDir + '/' + f)
		os.rmdir(specDir)
	os.mkdir(specDir)

	# Read input file
	reactionModel, coreSpecies, reactionSystems = io.readInputFile(inputFile)
	
	# Initialize reaction model
	if options.restart:
		import gzip
		import cPickle
		import ctml_writer
		logging.info('Loading previous restart file...')
		f = gzip.GzipFile(os.path.join(settings.outputDirectory,'restart.pkl'), 'rb')
		species.speciesList, species.speciesCounter, reaction.reactionList, \
			reactionModel, reactionSystems = cPickle.load(f)
		f.close()
		# Cantera stuff
		reload(ctml_writer) # ensure new empty ctml_writer._species and ._reactions lists
		for reactor in reactionSystems:
			# initialise the ctml_writer thing