Пример #1
0
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
Пример #2
0
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
Пример #4
0
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)