def bisect(low, high, error, targets, reactionModel, rmg, reactionSystemIndex, orig_observable): """ Bisect method in log space. Interrupt iterations when two consecutive, successful iterations differ less than a threshold value. """ THRESHOLD = 0.05 importantReactions = None final_devs = None old_trial = low while True: midpoint = (low + high) / 2.0 reduced_observable, newImportantReactions = evaluate( midpoint, targets, reactionModel, rmg, reactionSystemIndex) devs = computeDeviation(orig_observable, reduced_observable, targets) if isInvalid(devs, error): high = midpoint else: if len(newImportantReactions) == 0: logging.error( 'Model reduction resulted in a model with 0 reactions.') logging.error( 'Perhaps change reactor conditions to allow for more adequate reduction. Exiting...' ) break low = midpoint importantReactions = newImportantReactions final_devs = devs writeModel(rmg, chemkin_name='chem_reduced_{}.inp'.format( len(importantReactions))) if np.abs((midpoint - old_trial) / old_trial) < THRESHOLD: break old_trial = low if not importantReactions: logging.error("Could not find a good guess...") importantReactions = [] logging.info('Final deviations: '.format()) for dev, target in zip(final_devs, targets): logging.info('Final deviation for {}: {:.2f}%'.format( target, dev * 100)) return low, importantReactions
def main(): args = parseCommandLineArguments() level = INFO if args.debug: level = 0 elif args.verbose: level = DEBUG elif args.quiet: level = WARNING initializeLog(level) inputFile, reductionFile, chemkinFile, spcDict = args.requiredFiles[-4:] for f in [inputFile, reductionFile, chemkinFile, spcDict]: assert os.path.isfile(f), 'Could not find {}'.format(f) inputDirectory = os.path.abspath(os.path.dirname(inputFile)) output_directory = inputDirectory rmg, targets, error = load(inputFile, reductionFile, chemkinFile, spcDict) logger.info('Allowed error in target observables: {0:.0f}%'.format(error * 100)) reactionModel = rmg.reactionModel initialize(rmg.outputDirectory, reactionModel.core.reactions) atol, rtol = rmg.absoluteTolerance, rmg.relativeTolerance index = 0 reactionSystem = rmg.reactionSystems[index] #compute original target observables observables = computeObservables(targets, reactionModel, reactionSystem, \ rmg.absoluteTolerance, rmg.relativeTolerance) logger.info('Observables of original model:') for target, observable in zip(targets, observables): logger.info('{}: {:.2f}%'.format(target, observable * 100)) # optimize reduction tolerance tol, importantReactions = optimize(targets, reactionModel, rmg, index, error, observables) logger.info('Optimized tolerance: {:.0E}'.format(10**tol)) logger.info('Number of reactions in optimized reduced model : {}'.format( len(importantReactions))) # plug the important reactions into the RMG object and write: rmg.reactionModel.core.reactions = importantReactions writeModel(rmg)
def bisect(low, high, error, targets, reactionModel, rmg, reactionSystemIndex, orig_observable): """ Bisect method in log space. Interrupt iterations when two consecutive, successful iterations differ less than a threshold value. """ THRESHOLD = 0.05 importantReactions = None final_devs = None old_trial = low while True: midpoint = (low + high) / 2.0 reduced_observable, newImportantReactions = evaluate(midpoint, targets, reactionModel, rmg, reactionSystemIndex) devs = computeDeviation(orig_observable, reduced_observable, targets) if isInvalid(devs, error): high = midpoint else: if len(newImportantReactions) == 0: logging.error('Model reduction resulted in a model with 0 reactions.') logging.error('Perhaps change reactor conditions to allow for more adequate reduction. Exiting...') break low = midpoint importantReactions = newImportantReactions final_devs = devs writeModel(rmg, chemkin_name='chem_reduced_{}.inp'.format(len(importantReactions))) if np.abs((midpoint - old_trial) / old_trial) < THRESHOLD: break old_trial = low if not importantReactions: logging.error("Could not find a good guess...") importantReactions = [] logging.info('Final deviations: '.format()) for dev, target in zip(final_devs, targets): logging.info('Final deviation for {}: {:.2f}%'.format(target, dev * 100)) return low, importantReactions
def main(): args = parseCommandLineArguments() level = INFO if args.debug: level = 0 elif args.verbose: level = DEBUG elif args.quiet: level = WARNING initializeLog(level) inputFile, reductionFile, chemkinFile, spcDict = args.requiredFiles[-4:] for f in [inputFile, reductionFile, chemkinFile, spcDict]: assert os.path.isfile(f), 'Could not find {}'.format(f) inputDirectory = os.path.abspath(os.path.dirname(inputFile)) output_directory = inputDirectory rmg, targets, error = load(inputFile, reductionFile, chemkinFile, spcDict) logger.info('Allowed error in target observables: {0:.0f}%'.format(error * 100)) reactionModel = rmg.reactionModel initialize(rmg.outputDirectory, reactionModel.core.reactions) atol, rtol = rmg.absoluteTolerance, rmg.relativeTolerance index = 0 reactionSystem = rmg.reactionSystems[index] #compute original target observables observables = computeObservables(targets, reactionModel, reactionSystem, \ rmg.absoluteTolerance, rmg.relativeTolerance) logger.info('Observables of original model:') for target, observable in zip(targets, observables): logger.info('{}: {:.2f}%'.format(target, observable * 100)) # optimize reduction tolerance tol, importantReactions = optimize(targets, reactionModel, rmg, index, error, observables) logger.info('Optimized tolerance: {:.0E}'.format(10**tol)) logger.info('Number of reactions in optimized reduced model : {}'.format(len(importantReactions))) # plug the important reactions into the RMG object and write: rmg.reactionModel.core.reactions = importantReactions writeModel(rmg)