Exemplo n.º 1
0
from MAST.structopt.tools.StemCalc import ConvStem
from MAST.structopt import inp_out
from mpi4py import MPI
import numpy as np
import math
import time
import scipy.interpolate

rank = MPI.COMM_WORLD.Get_rank()
if rank==0:
    # experimental device information 
    aber=[[0,0],[0,0],[22.56,-20.1],[22.08,-7.5],[0.1198,0],[0.9018,-170.1],[0.04964,20.9],[28.43,-120.6],[11.84,153.8],[8.456,76.1],[0.622,0],[2.811,-125.5]]
    autostemparameters={'Electron energy': 200,'Spherical aberration': 1.4,'Defocus':0,'Aperture semiangle': 24.5,'Source size': 0.882,'Slice size': 25.0,'Pixels':976,'Chromatic aberration Coefficient':1.4,'Delta E':0.73,'aber':aber,'Scale Factor':0.00570113}

    # based on precalculated PSF("PSF.txt") and structure information("STEM_ref"), calculate the reference STEM image
    A = ConvStem(parameters=autostemparameters,calc_exp=False)
    atoms_ref=inp_out.read_xyz('STEM_ref',0)

    nk = autostemparameters['Pixels']
    A.psf = np.empty([nk,nk],dtype=float)
    fileobj = open('PSF.txt', 'r')
    lines = fileobj.readlines()
    for x in range(0,nk):
       A.psf[x] = lines[x].split()
    fileobj.close()

    STEM_ref = A.get_image(A.psf, atoms_ref, autostemparameters['Slice size'], autostemparameters['Pixels'])
    autostemparameters['Exp_Image'] = STEM_ref
    
    #setup parameters
    autostemparameters['Grid_sim2exp'] = 1
Exemplo n.º 2
0
    autostemparameters = {
        'Electron energy': 200,
        'Spherical aberration': 1.4,
        'Defocus': 0,
        'Aperture semiangle': 24.5,
        'Source size': 0.882,
        'Slice size': 25.0,
        'Pixels': 976,
        'Chromatic aberration Coefficient': 1.4,
        'Delta E': 0.73,
        'aber': aber,
        'Scale Factor': 0.00570113
    }

    # based on precalculated PSF("PSF.txt") and structure information("STEM_ref"), calculate the reference STEM image
    A = ConvStem(parameters=autostemparameters, calc_exp=False)
    atoms_ref = inp_out.read_xyz('STEM_ref', 0)

    nk = autostemparameters['Pixels']
    A.psf = np.empty([nk, nk], dtype=float)
    fileobj = open('PSF.txt', 'r')
    lines = fileobj.readlines()
    for x in range(0, nk):
        A.psf[x] = lines[x].split()
    fileobj.close()

    STEM_ref = A.get_image(A.psf, atoms_ref, autostemparameters['Slice size'],
                           autostemparameters['Pixels'])
    autostemparameters['Exp_Image'] = STEM_ref

    #setup parameters
Exemplo n.º 3
0
Arquivo: image.py Projeto: uw-cmg/MAST
    "Electron energy": 200,
    "Spherical aberration": 1.4,
    "Defocus": 0,
    "Aperture semiangle": 24.5,
    "Source size": 0.882,
    "Slice size": 25.0,
    "Pixels": 976,
    "Chromatic aberration Coefficient": 1.4,
    "Delta E": 0.73,
    "aber": aber,
    "Scale Factor": 0.00570113,
}

# based on precalculated PSF("PSF.txt") and structure information(a xyz format file), calculate the STEM image
autostemparameters["Grid_sim2exp"] = 1
A = ConvStem(parameters=autostemparameters, calc_exp=False)

nk = autostemparameters["Pixels"]
A.psf = np.empty([nk, nk], dtype=float)
fileobj = open("PSF.txt", "r")
lines = fileobj.readlines()
for x in range(0, nk):
    A.psf[x] = lines[x].split()
fileobj.close()
# plt.imshow(A.psf)
# plt.show()

Au = inp_out.read_xyz("Output-rank0/indiv00.xyz", -1)
# Au=inp_out.read_xyz('STEM_ref',0)
imAu = A.get_image(A.psf, Au, autostemparameters["Slice size"], autostemparameters["Pixels"])
IPlot = imAu.T
Exemplo n.º 4
0
Au1 = gpb([('Au', 10, 0, 0), ('Cu', 10, 0, 0)], size)
aber = [[0, 0], [0, 0], [22.56, -20.1], [22.08, -7.5], [0.1198, 0],
        [0.9018, -170.1], [0.04964, 20.9], [28.43, -120.6], [11.84, 153.8],
        [8.456, 76.1], [0.622, 0], [2.811, -125.5]]
autostemparameters = {
    'Electron energy': 200,
    'Spherical aberration': 1.4,
    'Defocus': 0,
    'Aperture semiangle': 24.5,
    'Source size': 0.882,
    'Slice size': 20.0,
    'Pixels': 800,
    'aber': aber,
    'Scale Factor': 0.00570113
}
A = ConvStem(parameters=autostemparameters, calc_exp=False)
#fig = plt.figure()
#ax = fig.add_subplot(111)
#psf = numpy.fft.fftshift(A.psf)
#ax.imshow(psf,cmap=cm.hot)
#plt.show()
imAu1 = A.get_image(A.psf, Au1, autostemparameters['Slice size'],
                    autostemparameters['Pixels'], 1)
#fig2 = plt.figure()
#ax2 = fig2.add_subplot(111)
#ax2.imshow(imAu1,cmap=cm.hot)
#plt.show()
autostemparameters['Exp_Image'] = imAu1
optparameters = {
    'structure': 'Cluster',
    'optimizer_type': 'BH',
Exemplo n.º 5
0
#import matplotlib.pyplot as plt
#import matplotlib.cm  as cm
from MAST.structopt.tools.StemCalc import ConvStem
from MAST.structopt.generate.gen_pop_box import gen_pop_box as gpb
from MAST.structopt import Optimizer
import numpy

size = 10.0
Au1 = gpb([('Au',10,0,0),('Cu',10,0,0)],size)
aber=[[0,0],[0,0],[22.56,-20.1],[22.08,-7.5],[0.1198,0],[0.9018,-170.1],[0.04964,20.9],[28.43,-120.6],[11.84,153.8],[8.456,76.1],[0.622,0],[2.811,-125.5]]
autostemparameters={'Electron energy': 200,'Spherical aberration': 1.4,'Defocus':0,'Aperture semiangle': 24.5,'Source size': 0.882,'Slice size': 20.0,'Pixels':800,'aber':aber,'Scale Factor':0.00570113}
A = ConvStem(parameters=autostemparameters,calc_exp=False)
#fig = plt.figure()
#ax = fig.add_subplot(111)
#psf = numpy.fft.fftshift(A.psf)
#ax.imshow(psf,cmap=cm.hot)
#plt.show()
imAu1 = A.get_image(A.psf, Au1, autostemparameters['Slice size'], autostemparameters['Pixels'], 1)
#fig2 = plt.figure()
#ax2 = fig2.add_subplot(111)
#ax2.imshow(imAu1,cmap=cm.hot)
#plt.show()
autostemparameters['Exp_Image'] = imAu1
optparameters = {'structure': 'Cluster', 'optimizer_type': 'BH', 'size':10,'atomlist': [('Au', 10, 0, 0), ('Cu', 10, 0, 0)],'FIT_SCHEME':'STEM_Cost','STEM_Parameters':autostemparameters}
B = Optimizer(optparameters)
B.algorithm_serial()
Exemplo n.º 6
0
def read_parameter_input(input, logger):
    """Function to convert input string, file, or dictionary to a dictionary to contain 
        the parameters for use by the optimizer class.
        input:
            input : Can be dictionary, string, or filename
            logfile : Name of logfile to write to. Default is None
        output:
            parameters : dictionary for defining parameters for optimizer with defaults
    """
    parameters = None
    if isinstance(input, dict):
        # If supplied input is already a dictionary set parameters equal to that dictionary
        parameters = input
    else:
        #Check to see if input is a filename
        if os.path.exists(input):
            try:
                #Check if input file is already formatted as a python dictionary
                parameters = eval('{%s}' % open(input).read())
            except:
                f = open(input, 'r')
                lines = f.readlines()
                f.close()
        else:
            #lines = input
            #Split lines in input string
            lines = input.rstrip().split('\n')
        if parameters == None:
            parameters = {}
            for one in lines:
                if one != '\n':
                    p, v = one.strip().split('=')
                    try:
                        #Convert numbers to floats
                        parameters[p.strip()] = float(v.strip())
                    except:
                        try:
                            #Convert list, tuple, and booleans
                            if p.strip() != 'calc_method':
                                parameters[p.strip()] = eval(v.strip())
                            else:
                                parameters[p.strip()] = v.strip()
                        except:
                            try:
                                #Leave remaining as strings
                                parameters[p.strip()] = v.strip()
                            except:
                                print 'Trouble with input line: ', one
    if 'parallel' not in parameters:
        parameters['parallel'] = False
    else:
        parameters['parallel'] = bool(parameters['parallel'])
    if 'filename' not in parameters:
        parameters['filename'] = 'Output'
    else:
        parameters['filename'] = str(parameters['filename'])
    try:
        rank = MPI.COMM_WORLD.Get_rank()
    except:
        rank = 0
    if logger:
        if 'loggername' not in parameters:
            parameters['loggername'] = '{0}-rank{1}-{2}.log'.format(
                parameters['filename'], rank, time.strftime("%Y_%m%d_%H%M%S"))
            logger = initialize_logger(parameters['loggername'])
        else:
            parameters['loggername'] = str(parameters['loggername'])
            logger = initialize_logger(parameters['loggername'])
            #logging.getLogger(parameters['loggername'])
    else:
        parameters['loggername'] = None
        logger = dummy_logger_no_write()
    if ('atomlist' not in parameters):
        #Stop program if atom list parameter not in input
        logger.critical(
            "Input file/string/dictionary must include an atomlist defined as 'atomlist':[('Xx',Concentration,Mass,Chemical Potential)]"
        )
        logger.critical("Current parameters include:\n" + repr(parameters))
        raise RuntimeError(
            "Input file/string/dictionary must include an atomlist defined as 'atomlist':[('Xx',Concentration,Mass,Chemical Potential)]"
        )
    else:
        if isinstance(parameters['atomlist'], str):
            parameters['atomlist'] = eval(parameters['atomlist'].strip())
        if not isinstance(parameters['atomlist'], list):
            logger.critical(
                'Something is wrong with atomlist parameter: {0}'.format(
                    parameters['atomlist']))
            raise RuntimeError(
                "Input file/string/dictionary must include an atomlist defined as 'atomlist':[('Xx',Concentration,Mass,Chemical Potential)]: {0}"
                .format(parameters['atomlist']))
    if 'structure' not in parameters:
        #Stop program if structure parameter not in input
        logger.critical(
            "Input file/dictionary must include a structure for the simulation as 'structure':'Cluster/Crystal/Defect'"
        )
        logger.debug("Current parameters include:\n" + repr(parameters))
        raise RuntimeError(
            "Input file/dictionary must include a structure for the simulation as 'structure':'Cluster/Crystal/Defect'"
        )
    for one in parameters['atomlist']:
        if len(one) != 4:
            #Stop program if atom list parameter not properly formatted
            logger.critical(
                'Format of atom list not correct. Must be [(symbol,concentration,mass,potential)]'
            )
            logger.debug('Issue in section : {0}'.format(one))
            logger.debug('Current atomlist is formatted as : {0}'.format(
                parameters['atomlist']))
            raise RuntimeError(
                'Format of atom list not correct. Must be [(symbol,concentration,mass,potential)]'
            )
    if 'natoms' not in parameters:
        parameters['natoms'] = int(
            sum([abs(c) for ind, c, m, u in parameters['atomlist']]))
        if rank == 0:
            logger.warning('Number of atoms in simulation not set')
            logger.warning('Assuming natoms = {0}'.format(
                parameters['natoms']))
    else:
        parameters['natoms'] = int(parameters['natoms'])
    parameters['atomlist'] = check_atomlist_concentration(
        parameters['atomlist'], parameters['natoms'], parameters['loggername'])
    if 'optimizer_type' not in parameters:
        parameters['optimizer_type'] = 'Random'
        if rank == 0:
            logger.info(
                'optimizer_type not set.  Default values set to Random.')

    #Set parameter defaults based on optimizer structure
    if parameters['optimizer_type'] == 'GA':
        nindiv = 10
        genealogy = True
        nbests = 100
        algtype = 'lambda+mu'
        cxpb = 0.8
        mutpb = 0.15
        natselectscheme = 'tournament'
    else:
        nindiv = 1
        genealogy = False
        nbests = 100
        algtype = parameters['optimizer_type']
        cxpb = 0.0
        mutpb = 1.0
    if parameters['optimizer_type'] == 'SA':
        natselectscheme = 'metropolis'
        predator = 'adapting'
    elif parameters['optimizer_type'] == 'BH':
        natselectscheme = 'metropolis'
    else:
        natselectscheme = 'best'
    if 'nindiv' not in parameters:
        parameters['nindiv'] = nindiv
        if rank == 0:
            logger.info(
                'Setting number of individuals in population (nindiv) = {0}'.
                format(parameters['nindiv']))
    else:
        parameters['nindiv'] = int(parameters['nindiv'])

    #Parameters for output
    if 'genealogy' not in parameters:
        parameters['genealogy'] = genealogy
        if rank == 0:
            logger.info('Setting genealogy = {0}'.format(
                parameters['genealogy']))
    else:
        parameters['genealogy'] = bool(parameters['genealogy'])
    if 'output_format' not in parameters:
        parameters['output_format'] = 'fitness'
        if rank == 0:
            logger.info('Setting output format = {0}'.format(
                parameters['output_format']))
    else:
        parameters['output_format'] = str(parameters['output_format']).lower()
    if 'allenergyfile' not in parameters:
        parameters['allenergyfile'] = False
        if rank == 0:
            logger.info('Setting allenergyfile = {0}'.format(
                parameters['allenergyfile']))
    else:
        parameters['allenergyfile'] = bool(parameters['allenergyfile'])
    if 'best_inds_list' not in parameters:
        parameters['best_inds_list'] = True
        if rank == 0:
            logger.info('Setting best_inds_list = {0}'.format(
                parameters['best_inds_list']))
    else:
        parameters['best_inds_list'] = bool(parameters['best_inds_list'])
    if 'number_of_bests' not in parameters:
        parameters['number_of_bests'] = nbests
        if rank == 0:
            logger.info('Setting number_of_bests = {0}'.format(
                parameters['number_of_bests']))
    else:
        parameters['number_of_bests'] = int(parameters['number_of_bests'])
    if 'indiv_defect_write' not in parameters:
        parameters['indiv_defect_write'] = False
        if rank == 0:
            logger.info('Setting indiv_defect_write = {0}'.format(
                parameters['indiv_defect_write']))
    else:
        parameters['indiv_defect_write'] = bool(
            parameters['indiv_defect_write'])
    if 'vacancy_output' not in parameters:
        parameters['vacancy_output'] = False
        if rank == 0:
            logger.info('Setting vacancy_output = {0}'.format(
                parameters['vacancy_output']))
    else:
        parameters['vacancy_output'] = bool(parameters['vacancy_output'])
    if 'restart_optimizer' not in parameters:
        parameters['restart_optimizer'] = False
    else:
        parameters['restart_optimizer'] = bool(parameters['restart_optimizer'])
    #Parameters for post-processing
    if 'lattice_concentration' not in parameters:
        parameters['lattice_concentration'] = False
        if rank == 0:
            logger.info('Setting lattice_concentration = {0}'.format(
                parameters['lattice_concentration']))
    else:
        parameters['lattice_concentration'] = bool(
            parameters['lattice_concentration'])
    if 'postprocessing' not in parameters:
        parameters['postprocessing'] = False
        if rank == 0:
            logger.info('Setting postprocessing = {0}'.format(
                parameters['postprocessing']))
    else:
        parameters['postprocessing'] = bool(parameters['postprocessing'])
    if 'genealogytree' not in parameters:
        parameters['genealogytree'] = False
        if rank == 0:
            logger.info('Setting genealogytree = {0}'.format(
                parameters['genealogytree']))
    else:
        parameters['genealogytree'] = bool(parameters['genealogytree'])

    #Parameters for general algorithm
    if 'seed' not in parameters:
        parameters['seed'] = random.randint(0, 10)
        if rank == 0:
            logger.info('Setting Random number seed (seed) to {0}'.format(
                parameters['seed']))
    else:
        parameters['seed'] = int(parameters['seed'])
    if 'forcing' not in parameters:
        parameters['forcing'] = 'Concentration'
        if rank == 0:
            logger.info('Setting forcing = {0}'.format(parameters['forcing']))
            logger.info('Assuming forcing concentration control')
    else:
        parameters['forcing'] = str(parameters['forcing'])
    if 'debug' not in parameters:
        parameters['debug'] = ['None']
        if rank == 0:
            logger.info('Setting debug = {0}'.format(parameters['debug']))
    else:
        parameters['debug'] = list(parameters['debug'])
        if 'None' not in parameters['debug']:
            print '***** DEBUGGING RUN *****'
    if 'algorithm_type' not in parameters:
        parameters['algorithm_type'] = algtype
        if rank == 0:
            logger.info('Setting algorithm type = {0}'.format(
                parameters['algorithm_type']))
    else:
        parameters['algorithm_type'] = str(parameters['algorithm_type'])
    if 'migration_intervals' not in parameters:
        parameters['migration_intervals'] = 5
        if rank == 0:
            logger.info('Setting migration_intervals = '.format(
                parameters['migration_intervals']))
    else:
        parameters['migration_intervals'] = int(
            parameters['migration_intervals'])
    if 'migration_percent' not in parameters:
        parameters['migration_percent'] = 0.05
        if rank == 0:
            logger.info('Setting migration_percent = {0}'.format(
                parameters['migration_percent']))
    else:
        parameters['migration_percent'] = float(
            parameters['migration_percent'])
    if 'fingerprinting' not in parameters:
        parameters['fingerprinting'] = False
        if rank == 0:
            logger.info('Setting fingerprinting = {0}'.format(
                parameters['fingerprinting']))
    else:
        parameters['fingerprinting'] = bool(parameters['fingerprinting'])
    if 'fpbin' not in parameters:
        parameters['fpbin'] = 0.25
        if rank == 0:
            logger.info('Setting fingerprint bin to {0}'.format(
                parameters['fpbin']))
    else:
        parameters['fpbin'] = float(parameters['fpbin'])
    if 'fpcutoff' not in parameters:
        parameters['fpcutoff'] = 15.0
        if rank == 0:
            logger.info('Setting fingerprint cutoff distance to {0}'.format(
                parameters['fpcutoff']))
    else:
        parameters['fpcutoff'] = float(parameters['fpcutoff'])
    parameters['bulkfp'] = None
    if 'fixed_region' not in parameters:
        parameters['fixed_region'] = False
        if rank == 0:
            logger.info('Setting fixed_region = {0}'.format(
                parameters['fixed_region']))
    else:
        parameters['fixed_region'] = bool(parameters['fixed_region'])
    if 'rattle_atoms' not in parameters:
        parameters['rattle_atoms'] = False
        if rank == 0:
            logger.info('Setting rattle_atoms = {0}'.format(
                parameters['rattle_atoms']))
    else:
        parameters['rattle_atoms'] = bool(parameters['rattle_atoms'])
    if 'constrain_position' not in parameters:
        parameters['constrain_position'] = False
        if rank == 0:
            logger.info('Setting constrain_position = {0}'.format(
                parameters['constrain_position']))
    else:
        parameters['constrain_position'] = bool(
            parameters['constrain_position'])
    if 'restart' not in parameters:
        parameters['restart'] = False
        if rank == 0:
            logger.info('Setting restart = {0}'.format(parameters['restart']))
    else:
        parameters['restart'] = bool(parameters['restart'])
    if 'restart_ints' not in parameters:
        parameters['restart_ints'] = 0
        if rank == 0:
            if parameters['restart']:
                logger.info('Setting restart_ints = {0}'.format(
                    parameters['restart_ints']))
    else:
        parameters['restart_ints'] = int(parameters['restart_ints'])

    # Parameters to generate the population and individual
    if 'r_ab' not in parameters:
        parameters['r_ab'] = 2.5
        if rank == 0:
            logger.info('Setting r_ab = {0}'.format(parameters['r_ab']))
    else:
        parameters['r_ab'] = float(parameters['r_ab'])
    if 'size' not in parameters:
        parameters['size'] = parameters['natoms']**0.33333 * parameters['r_ab']
        if rank == 0:
            logger.info('Setting size to (natoms)^(1/3)*r_ab = {0}'.format(
                parameters['size']))
    else:
        parameters['size'] = float(parameters['size'])
    if 'generate_flag' not in parameters:
        parameters['generate_flag'] = 'box'
        if rank == 0:
            logger.info('Setting default generation scheme = {0}'.format(
                parameters['generate_flag']))
    else:
        parameters['generate_flag'] = str(parameters['generate_flag']).lower()
    parameters['solidbulk'] = None
    if 'sf' not in parameters:
        parameters['sf'] = 1.75
        if rank == 0:
            if parameters['structure'] == 'Defect':
                logger.info('Setting size factor for Defect (sf) = {0}'.format(
                    parameters['sf']))
    else:
        parameters['sf'] = float(parameters['sf'])
    if 'supercell' not in parameters:
        parameters['supercell'] = (1, 1, 1)
        if rank == 0:
            if parameters['structure'] == 'Defect':
                logger.info(
                    'Setting supercell for Defect (supercell) = {0}'.format(
                        parameters['supercell']))
    else:
        parameters['supercell'] = tuple(parameters['supercell'])
    if 'solidfile' not in parameters:
        if parameters['structure'] == 'Defect':
            logger.critical(
                'Must provide a file for bulk solid if running a defect simulation.'
            )
            raise RuntimeError(
                'Error: Bulk for Defect not specified. Enter name of file for bulk structure as solidfile parameter'
            )
        else:
            parameters['solidfile'] = None
    else:
        parameters['solidfile'] = str(parameters['solidfile'])
    if 'solidcell' not in parameters:
        if rank == 0:
            if parameters['structure'] == 'Defect':
                logger.warning(
                    'Warning cell size for Bulk Solid not specified assuming distance between 1st and 3rd atom'
                )
        parameters['solidcell'] = None
    else:
        try:
            parameters['solidcell'] = eval('numpy.' + parameters['solidcell'])
        except:
            try:
                parameters['solidcell'] = list(parameters['solidcell'])
            except:
                if rank == 0:
                    if parameters['structure'] == 'Defect':
                        logger.warning(
                            'Warning cell size for Bulk Solid not recognized assuming distance between 1st and 3rd atom'
                        )
                        logger.debug('solidcell input as: {0}'.format(
                            parameters['solidcell']))
                parameters['solidcell'] = None
    if 'evalsolid' not in parameters:
        parameters['evalsolid'] = False
        if rank == 0:
            if parameters['structure'] == 'Defect':
                logger.info('Not evaluating Solid')
    else:
        parameters['evalsolid'] = bool(parameters['evalsolid'])
    if 'finddefects' not in parameters:
        parameters['finddefects'] = True
        if rank == 0:
            if parameters['structure'] == 'Defect':
                logger.info('Setting finddefects = {0}'.format(
                    parameters['finddefects']))
    else:
        parameters['finddefects'] = bool(parameters['finddefects'])
    if 'trackvacs' not in parameters:
        parameters['trackvacs'] = False
        if rank == 0:
            if parameters['structure'] == 'Defect':
                logger.info('Setting trackvacs = {0}'.format(
                    parameters['trackvacs']))
    else:
        parameters['trackvacs'] = bool(parameters['trackvacs'])
    if 'trackswaps' not in parameters:
        parameters['trackswaps'] = False
        if rank == 0:
            if parameters['structure'] == 'Defect':
                logger.info('Setting trackswaps = {0}'.format(
                    parameters['trackswaps']))
    else:
        parameters['trackswaps'] = bool(parameters['trackswaps'])
    if 'random_loc_start' not in parameters:
        parameters['random_loc_start'] = False
        if rank == 0:
            if parameters['structure'] == 'Defect':
                logger.info('Setting random_loc_start = {0}'.format(
                    parameters['random_loc_start']))
    else:
        parameters['random_loc_start'] = bool(parameters['random_loc_start'])
    if 'random_vac_start' not in parameters:
        parameters['random_vac_start'] = False
        if rank == 0:
            if parameters['structure'] == 'Defect':
                logger.info('Setting random_vac_start = {0}'.format(
                    parameters['random_vac_start']))
    else:
        parameters['random_vac_start'] = bool(parameters['random_vac_start'])
    if 'purebulkenpa' not in parameters:
        if parameters['structure'] == 'Defect':
            parameters['purebulkenpa'] = None
        else:
            parameters['purebulkenpa'] = 0
    if 'natomsbulk' not in parameters:
        if parameters['structure'] == 'Defect':
            parameters['natomsbulk'] = None
        else:
            parameters['natomsbulk'] = 0
    if 'surfacefile' not in parameters:
        if parameters['structure'] == 'Surface':
            logger.critical(
                'Must provide a file for bulk solid if running a defect simulation.'
            )
            raise RuntimeError(
                'Error: Bulk for Defect not specified. Enter name of file for bulk structure as solidfile parameter'
            )
        else:
            parameters['surfacefile'] = None
    if 'surfacecell' not in parameters:
        parameters['surfacecell'] = None
    if 'surftopthick' not in parameters:
        parameters['surftopthick'] = 0
    if 'cell_shape_options' not in parameters:
        parameters['cell_shape_options'] = ['cubic', 'hexagonal', 'triclinic', \
        'monoclinic', 'orthorhombic', 'tetragonal']
    else:
        parameters['cell_shape_options'] = list(
            parameters['cell_shape_options'])
        if parameters['cell_shape_options'] == 'all':
            parameters['cell_shape_options']=['cubic', 'hexagonal', 'triclinic', \
            'monoclinic', 'orthorhombic', 'tetragonal']
    if rank == 0:
        if parameters['structure'] == 'Crystal':
            logger.info('Assuming following cell shape options: {0}'.format(
                parameters['cell_shape_options']))
    if 'alloy' not in parameters:
        parameters['alloy'] = True
        if rank == 0:
            logger.info('Setting alloy = {0}'.format(parameters['alloy']))
    else:
        parameters['alloy'] = bool(parameters['alloy'])

    #Parameters to Evaluate an Individual
    if 'calc_method' not in parameters:
        if 'vaspcalc' in parameters:
            parameters['calc_method'] = 'VASP'
            if rank == 0:
                logger.info(
                    'Setting calculation method to VASP. calc_method = {0}'.
                    format(parameters['calc_method']))
        elif 'pair_style' in parameters:
            parameters['calc_method'] = 'LAMMPS'
            if rank == 0:
                logger.info(
                    'Setting calculation method to LAMMPS. calc_method = {0}'.
                    format(parameters['calc_method']))
        elif 'lammps_min' in parameters:
            parameters['calc_method'] = 'LAMMPS'
            if rank == 0:
                logger.info(
                    'Setting calculation method to LAMMPS. calc_method = {0}'.
                    format(parameters['calc_method']))
        else:
            parameters['calc_method'] = 'LennardJones'
            if rank == 0:
                logger.info(
                    'Calculation method not specified assuming ase LennardJones. calc_method = {0}'
                    .format(parameters['calc_method']))
    else:
        parameters['calc_method'] = str(parameters['calc_method'])
    if 'vaspcalc' not in parameters:
        parameters['vaspcalc'] = "Vasp()"
        if rank == 0:
            if parameters['calc_method'] == 'VASP':
                logger.info('Setting vaspcalc = {0}'.format(
                    parameters['vaspcalc']))
    if 'pair_style' not in parameters:
        if rank == 0:
            if parameters['calc_method'] == 'LAMMPS':
                logger.info(
                    'No pair_style for LAMMPS specified. Assuming Lennard-Jones'
                )
        parameters['pair_style'] = None
    if 'bopcutoff' not in parameters:
        if parameters['pair_style'] == 'bop':
            logger.critical('BOP potential requires a cutoff distance.')
            logger.debug('Parameters = {0}'.format(parameters))
            raise RuntimeError(
                "ERROR:Cutoff distance must be supplied with bop potential! Specify with bopcutoff=N"
            )
        else:
            parameters['bopcutoff'] = 0
    else:
        parameters['bopcutoff'] = float(parameters['bopcutoff'])
    if 'buckcutoff' not in parameters:
        parameters['buckcutoff'] = 1
        if rank == 0:
            if parameters['pair_style'] == 'buck':
                logger.warning('Setting buckingham potential cutoff = ' +
                               repr(parameters['buckcutoff']))
    else:
        parameters['buckcutoff'] = int(parameters['buckcutoff'])
    if 'buckparameters' not in parameters:
        parameters['buckparameters'] = ['* * 100.00 1.5 200.0']
        if rank == 0:
            if parameters['pair_style'] == 'buck':
                logger.warning('Setting Buckingham parameters = {0}'.format(
                    parameters['buckparameters']))
    if 'ps_name' not in parameters:
        parameters['ps_name'] = None
        if rank == 0:
            if parameters['pair_style'] == 'other':
                logger.info('Setting ps_name = {0}'.format(
                    parameters['ps_name']))
    if 'pair_coeff' not in parameters:
        if parameters['pair_style'] == 'other':
            logger.critical(
                'Must provide pair_coeff for use with pair_style = other')
            raise RuntimeError(
                "ERROR:Coefficients for structure=other potential not specifed. Use pair_coeff"
            )
        else:
            parameters['pair_coeff'] = None
    if 'ps_other' not in parameters:
        parameters['ps_other'] = None
        if rank == 0:
            if parameters['pair_style'] == 'other':
                logger.info('Setting ps_other = {0}'.format(
                    parameters['ps_other']))
    if 'pot_file' not in parameters:
        parameters['pot_file'] = None
        if rank == 0:
            if parameters['calc_method'] == 'LAMMPS':
                logger.warning('No potential file for LAMMPS specified.')
    else:
        parameters['pot_file'] = str(parameters['pot_file'])
    if 'lammps_keep_files' not in parameters:
        parameters['lammps_keep_files'] = False
        if rank == 0:
            if parameters['calc_method'] == 'LAMMPS':
                logger.info('Setting lammps_keep_files = {0}'.format(
                    parameters['lammps_keep_files']))
    else:
        parameters['lammps_keep_files'] = bool(parameters['lammps_keep_files'])
    if 'lammps_thermo_steps' not in parameters:
        parameters['lammps_thermo_steps'] = 1
        if rank == 0:
            if parameters['calc_method'] == 'LAMMPS':
                logger.info('Setting lammps_thermo_steps = {0}'.format(
                    parameters['lammps_thermo_steps']))
    else:
        parameters['lammps_thermo_steps'] = int(
            parameters['lammps_thermo_steps'])
    if ('lammps_min' in parameters) and (parameters['lammps_min'] != None):
        parameters['ase_min'] = False
    else:
        parameters['lammps_min'] = None
        if rank == 0:
            if parameters['calc_method'] == 'LAMMPS':
                logger.info('No Local minimization implemented in LAMMPS')
    if 'lammps_min_style' not in parameters:
        if parameters['lammps_min']:
            parameters['lammps_min_style'] = 'cg'
            if rank == 0:
                if parameters['calc_method'] == 'LAMMPS':
                    logger.info(
                        'Setting lammps_min_style = {0}'.format(
                            'lammps_min_style') +
                        '. Using LAMMPS conjugate gradient local minimizer')
        else:
            parameters['lammps_min_style'] = None
    if 'large_box_size' not in parameters:
        parameters['large_box_size'] = 500.0
        if rank == 0:
            if parameters['structure'] == 'Cluster':
                logger.info('Setting large_box_size to {0}'.format(
                    parameters['large_box_size']))
    else:
        parameters['large_box_size'] = float(parameters['large_box_size'])
    if 'ase_min' not in parameters:
        if parameters['calc_method'] == 'LennardJones':
            parameters['ase_min'] = True
        else:
            parameters['ase_min'] = False
        if rank == 0:
            logger.info('Setting ase_min = {0}'.format(parameters['ase_min']))
    else:
        parameters['ase_min'] = bool(parameters['ase_min'])
    if 'ase_min_fmax' not in parameters:
        parameters['ase_min_fmax'] = 0.01
        if rank == 0:
            if parameters['ase_min']:
                logger.info(
                    'Setting ASE maximum force value (ase_min_fmax) = {0}'.
                    format(parameters['ase_min_fmax']))
    else:
        parameters['Sovlerfmax'] = float(parameters['ase_min_fmax'])
    if 'ase_min_maxsteps' not in parameters:
        parameters['ase_min_maxsteps'] = 2500
        if rank == 0:
            if parameters['ase_min']:
                logger.info(
                    'Setting maximum number of steps for BFGS solver (ase_min_maxsteps) = {0}'
                    .format(parameters['ase_min_maxsteps']))
    else:
        parameters['SovlerMxSteps'] = int(parameters['ase_min_maxsteps'])

    #Parameters for Crossovers
    if 'cxpb' not in parameters:
        parameters['cxpb'] = cxpb
        if rank == 0:
            logger.info('Setting crossover probability (cxpb) = {0}'.format(
                parameters['cxpb']))
    else:
        parameters['cxpb'] = float(parameters['cxpb'])
    if 'cx_scheme' not in parameters:
        parameters['cx_scheme'] = 'cxtp'
        if rank == 0:
            logger.info(
                'Assuming two-point crossover.  Setting cx_scheme = {0}'.
                format(parameters['cx_scheme']))
    else:
        parameters['cx_scheme'] = str(parameters['cx_scheme']).lower()
    if 'selection_scheme' not in parameters:
        parameters['selection_scheme'] = 'tournament2'
        if rank == 0:
            logger.info('Setting selection_scheme = {0}'.format(
                parameters['selection_scheme']))
    else:
        parameters['selection_scheme'] = str(
            parameters['selection_scheme']).lower()

    #Parameters for Mutations
    if 'mutpb' not in parameters:
        parameters['mutpb'] = mutpb
        if rank == 0:
            logger.info('Setting mutation probability (mutpb) = {0}'.format(
                parameters['mutpb']))
    else:
        parameters['mutpb'] = float(parameters['mutpb'])
    if 'mutation_options' not in parameters:
        if parameters['structure'] == 'Cluster':
            parameters['mutation_options']=['lattice_alteration','rotation',\
            'permutation','scale_size']
        elif parameters['structure'] == 'Crystal':
            parameters['mutation_options']=['lattice_alteration','rotation',\
            'permutation','scale_size', 'cell_shape', 'lammps_box_relax']
        elif parameters['structure'] == 'Defect':
            parameters['mutation_options'] = [
                'lattice_alteration', 'rotation', 'permutation'
            ]
        if rank == 0:
            logger.info('Setting mutations options = {0}'.format(
                parameters['mutation_options']))
    else:
        parameters['mutation_options'] = list(parameters['mutation_options'])
        for i in range(len(parameters['mutation_options'])):
            parameters['mutation_options'][i] = parameters['mutation_options'][
                i].lower()
    BHFlag = False
    for one in parameters['mutation_options']:
        if 'basin_hop' in one:
            BHFlag = True
    if 'bh_steps' not in parameters:
        parameters['bh_steps'] = 100
        if rank == 0:
            if BHFlag == True:
                logger.warning(
                    'Max steps not specified for Basin Hop mutation, setting bh_steps = {0}'
                    .format(parameters['bh_steps']))
    else:
        parameters['bh_steps'] = int(parameters['bh_steps'])
    if 'bh_temp' not in parameters:
        parameters['bh_temp'] = 1000 * 8.617385692256675e-05
        if rank == 0:
            if BHFlag == True:
                logger.warning(
                    'Temperature not set for Basin Hop mutation, setting bh_temp in kT = {0}'
                    .format(parameters['bh_temp']))
    else:
        parameters['bh_temp'] = float(parameters['bh_temp'])
    if 'mutant_add' not in parameters:
        parameters['mutant_add'] = False
        if rank == 0:
            logger.info('Setting mutant_add = {0}'.format(
                parameters['mutant_add']))
    else:
        parameters['mutant_add'] = bool(parameters['mutant_add'])
    if 'quench_max_temp' not in parameters:
        parameters['quench_max_temp'] = 1000
        if rank == 0:
            if 'quench' in parameters['mutation_options']:
                logger.info('Setting quench_max_temp = {0}'.format(
                    parameters['quench_max_temp']))
    else:
        parameters['quench_max_temp'] = int(parameters['quench_max_temp'])
    if 'quench_min_temp' not in parameters:
        parameters['quench_min_temp'] = 2
        if rank == 0:
            if 'quench' in parameters['mutation_options']:
                logger.info('Seting quench_min_temp = {0}'.format(
                    parameters['quench_min_temp']))
    else:
        parameters['quench_min_temp'] = int(parameters['quench_min_temp'])
    if 'quench_step_size' not in parameters:
        parameters['quench_step_size'] = 0.01
        if rank == 0:
            if 'quench' in parameters['mutation_options']:
                logger.info('Setting quench_step_size = {0}'.format(
                    parameters['quench_step_size']))
    else:
        parameters['quench_step_size'] = float(parameters['quench_step_size'])
    if 'quench_n_steps_1' not in parameters:
        parameters['quench_n_steps_1'] = 10000
        if rank == 0:
            if 'quench' in parameters['mutation_options']:
                logger.info('Setting quench_n_steps_1 = {0}'.format(
                    parameters['quench_n_steps_1']))
    else:
        parameters['quench_n_steps_1'] = int(parameters['quench_n_steps_1'])
    if 'quench_n_steps_2' not in parameters:
        parameters['quench_n_steps_2'] = parameters['quench_n_steps_1'] * 2
        if rank == 0:
            if 'quench' in parameters['mutation_options']:
                logger.info('Setting quench_n_steps_2 = {0}'.format(
                    parameters['quench_n_steps_2']))
    else:
        parameters['quench_n_steps_2'] = int(parameters['quench_n_steps_2'])
    if 'isolate_mutation' not in parameters:
        parameters['isolate_mutation'] = False
        if rank == 0:
            logger.info('Setting isolate_mutation flag = {0}'.format(
                parameters['isolate_mutation']))
    else:
        parameters['isolate_mutation'] = bool(parameters['isolate_mutation'])

    #Parameters for Selection
    if 'fitness_scheme' not in parameters:
        parameters['fitness_scheme'] = 'totalenfit'
        if rank == 0:
            logger.info('Setting fitness_scheme = {0}'.format(
                parameters['fitness_scheme']))
    else:
        parameters['fitness_scheme'] = str(
            parameters['fitness_scheme']).lower()
    if 'energy_cutoff_factor' not in parameters:
        parameters['energy_cutoff_factor'] = 10.0
        if rank == 0:
            logger.info('Setting energy_cutoff_factor = {0}'.format(
                parameters['energy_cutoff_factor']))
    else:
        parameters['energy_cutoff_factor'] = float(
            parameters['energy_cutoff_factor'])
    if 'stem_parameters' not in parameters:
        if 'stem' in parameters['fitness_scheme']:
            logger.critical(
                'Must provide stem_parameters for STEM_Cost calculation')
            raise RuntimeError(
                "STEM parameters not specified.  Cannot simulate image files")
        else:
            parameters['stem_parameters'] = {}
    else:
        stemparams = dict(parameters['stem_parameters'])
    if 'stem_keep_files' not in parameters:
        parameters['stem_keep_files'] = True
        if rank == 0:
            if 'stem' in parameters['fitness_scheme']:
                logger.info('Setting stem_keep_files = {0}'.format(
                    parameters['stem_keep_files']))
    else:
        parameters['stem_keep_files'] = parameters['stem_keep_files']
    if 'stem_coeff' not in parameters:
        parameters['stem_coeff'] = None
        if rank == 0:
            if 'stem' in parameters['fitness_scheme']:
                logger.info('Setting stem_coeff with first individual')
    else:
        try:
            parameters['stem_coeff'] = float(parameters['stem_coeff'])
        except:
            if rank == 0:
                if 'stem' in parameters['fitness_scheme']:
                    logger.warning(
                        'Trouble reading stem_coeff input. stem_coeff = {0}'.
                        format(parameters['stem_coeff']))
            parameters['stem_coeff'] = None
    if 'stem' in parameters['fitness_scheme']:
        #Initialize function for experimental image
        from MAST.structopt.tools.StemCalc import ConvStem
        logger.info('Initializing ConvStem Calculator')
        parameters['stemcalc'] = ConvStem(
            parameters=stemparams,
            tmp_dir='/' + os.getcwd() + '/ConvStemImages/',
            keep_files=parameters['stem_keep_files'])
    else:
        parameters['stemcalc'] = None
    if 'constrain_swaps' not in parameters:
        if 'IntSwap' in parameters['mutation_options']:
            parameters['swaplist'] = None
            if rank == 0:
                logger.info('Setting swaplist for IntSwap = None')
        elif parameters['fitness_scheme'] == 'chempotswap':
            parameters['swaplist'] = None
            if rank == 0:
                logger.info('Setting swaplist for chempotswap = None')
        else:
            parameters['swaplist'] = False
            parameters['constrain_swaps'] = False
            if rank == 0:
                logger.info('Setting swaplist = False')
    else:
        parameters['swaplist'] = parameters['constrain_swaps']
    if 'natural_selection_scheme' not in parameters:
        parameters['natural_selection_scheme'] = natselectscheme
        if rank == 0:
            logger.info('Setting natural_selection_scheme = {0}'.format(
                parameters['natural_selection_scheme']))
    else:
        parameters['natural_selection_scheme'] = str(
            parameters['natural_selection_scheme']).lower()
    if 'tournsize' not in parameters:
        parameters['tournsize'] = 3
        if 'tournament' in parameters[
                'selection_scheme'] or 'tournament' in parameters[
                    'natural_selection_scheme']:
            if rank == 0:
                logger.info('Setting Tournament size (tournsize) = {0}'.format(
                    parameters['tournsize']))
    else:
        parameters['tournsize'] = int(parameters['tournsize'])
    if 'fusslimit' not in parameters:
        parameters['fusslimit'] = 10.0
        if rank == 0:
            logger.info('Setting FUSS limit (fusslimit) = {0}'.format(
                parameters['fusslimit']))
    else:
        parameters['fusslimit'] = float(parameters['fusslimit'])
    if 'metropolis_temp' not in parameters:
        parameters['metropolis_temp'] = 30.0
        if rank == 0:
            logger.info('Setting metropolis_temp = {0}'.format(
                parameters['metropolis_temp']))
    else:
        parameters['metropolis_temp'] = float(parameters['metropolis_temp'])
    if 'mark' not in parameters:
        parameters['mark'] = None
    #Parameters for Convergence
    if 'convergence_scheme' not in parameters:
        parameters['convergence_scheme'] = 'max_gen'
        if rank == 0:
            logger.info(
                'Setting convergence scheme (convergence_scheme) = {0}'.format(
                    parameters['convergence_scheme']))
    else:
        parameters['convergence_scheme'] = str(
            parameters['convergence_scheme']).lower()
    if 'maxgen' not in parameters:
        parameters['maxgen'] = 5
        if rank == 0:
            logger.info(
                'Setting Max Number of generations (maxgen) = {0}'.format(
                    parameters['maxgen']))
    else:
        parameters['maxgen'] = int(parameters['maxgen'])
    if 'reqrep' not in parameters:
        parameters['reqrep'] = 10
        if rank == 0:
            if 'rep' in parameters['convergence_scheme']:
                logger.info(
                    'Setting max number of energy repetitions (reqrep) = {0}'.
                    format(parameters['reqrep']))
    else:
        parameters['reqrep'] = int(parameters['reqrep'])
    if 'tolerance' not in parameters:
        parameters['tolerance'] = 0.001
        if rank == 0:
            if 'rep' in parameters['convergence_scheme']:
                logger.info(
                    'Setting energy tolerance (tolerance) = {0}'.format(
                        parameters['tolerance']))
    else:
        parameters['tolerance'] = float(parameters['tolerance'])
    if 'predator' not in parameters:
        parameters['predator'] = 'mutation_dups'
        if rank == 0:
            logger.info('Setting predator = {0}'.format(
                parameters['predator']))
    else:
        parameters['predator'] = str(parameters['predator']).lower()
    if 'adaptbegin' not in parameters:
        parameters['adaptbegin'] = 0.75
        if rank == 0:
            if parameters['predator'] == 'adapting':
                logger.info(
                    'Setting adaptation predator to begin (adaptbegin) at genrep*{0}'
                    .format(parameters['adaptbegin']))
    else:
        parameters['adaptbegin'] = float(parameters['adaptbegin'])
    if 'adaptmultiplier' not in parameters:
        parameters['adaptmultiplier'] = 3.0
        if rank == 0:
            if parameters['predator'] == 'adapting':
                logger.info(
                    'Setting adaptation predator multiplier (adaptmultiplier) = {0}'
                    .format(parameters['adaptmulitplier']))
    else:
        parameters['adaptmultiplier'] = float(parameters['adaptmultiplier'])
    if 'demin' not in parameters:
        parameters['demin'] = 0.005
        if rank == 0:
            logger.info(
                'Setting cutoff convergence energy (demin) = {0}'.format(
                    parameters['demin']))
    else:
        parameters['demin'] = float(parameters['demin'])

    return parameters